银⾏流⽔号引发的PHP编程思考与实践
流⽔号在银⾏业最为常见。相信很多⼈接触到流⽔号都是从银⾏相关的凭条或银⾏系统查询获知。
⾃从进⼊⾦融相关的公司或业务开发之后,对流⽔号的应⽤开发就有了更深刻的认知。
那么,今天我们通过流⽔号来应⽤到实际开发中。解决我们开发中的问题。
⼀、流⽔号的特点:唯⼀性
流⽔号,对于整个系统⽽⾔是全局唯⼀。这算是流⽔号最基础最重要的特点。这个特点,能解决最根本实际开发中最实际的问题。
⼆、实际案例:卡券发放
A 系统属于核⼼系统。提供了各种各样的核⼼功能,以及暴露⼀些 API 接⼝。这些接⼝可以给围绕 A 系统做运营功能的系统使⽤。
假如,现在有⼀个 B 系统有⼀个需求:
制作⼀个导流的活动页⾯,在该页⾯输⼊⼿机号并接收验证码之后实现快捷注册,然后给这个⼿机号对
应的账户赠送⼀张减免 10 元的卡券。
为什么不直接在导流的注册流程⾥⾯直接赠送呢?
因为,有以下⼏个原因:
(1)导流页⾯是调⽤ A 系统的注册接⼝。A 系统属于核⼼业务系统,不会经常为了这些活动⽽定制改动系统代码,影响系统稳定性。
(2)B 系统只有 A 系统的可读权限或可读权限都没有。所以,⽆法直接⼲涉核⼼业务数据库的功能。
(3)B 系统引流注册,如果⽤户此时只是注册,并不会去下载 App 登录的话。那么,这时赠送卡券将变得毫⽆意义。只会产⽣更多的垃圾数据。
编程php语言那么,该如何做?
(1)A 系统提供快捷注册接⼝、短信发送接⼝、卡券发送接⼝。
(2)B 系统制作⼀个注册导流 H5 页⾯。⽤户填写⼿机号,获取验证码,输⼊验证码点击,点击提交调⽤ A 系统快捷注册接⼝实现注册⽤户。
(3)B 系统调⽤ A 系统的注册接⼝成功之后,在⾃⼰的系统存储⼿机号、⽤户ID、注册时间、导流 H5 的页⾯唯⼀标识(⾃⼰定⼀个)。
(4)A 系统在系统当中实现⼀系列事件(登录、注册、下单、充值、提现)。并且写⼊队列。然后,把这些事件实时推送给 B 系统。
(5)B 系统收到这些事件之后,根据⾃⼰是否有建⽴在这些事件上的后续功能。⽐如,我们这个导流功能,就需要导流注册成功之后,⽤户⾸次登录的时候赠送 10 元卡券。
上⾯的 (1)、(2)、(3)、(4)都很好实现。其中,第(4)步主要是为了实现系统解耦。并且这也是⽬前⽐较常⽤的⽅案。我们今天要讲的是怎样通过流⽔号来解决第(5)步的问题。
那么第(5)步会有什么问题?
⽐如,现在 B 系统收到了导流的⽤户成功⾸次登录的事件推送了。结果,去调⽤ A 系统提供的发送卡券功能赠送 10 元卡券。结果,调⽤卡券发送失败了。于是,准备在程序⾥⾯实现⼀个功能:失败之后重发。最后成功了。但是,真的成功了吗?
我们来分析⼀下。卡券发送失败的可能原因:
请求被 A 系统正确接收。但是,由于⽹络原因 B 系统中断了。
请求没有被 A 系统接收。
请求被 A 系统正确接收,也正确发送了卡券。但是, A 系统故障了。
请求被 A 系统正确接收,也正确发送了卡券。B 系统⾃⼰故障了。
当然,情况不⽌上⾯这⼏种,还有其他原因。不管何种原因,当我们要重发的时候,问题就来了:会导致卡券发送多次。
这时候我们可以利⽤流⽔号的特性。每次导流注册成功之后,给每条⼊库的记录⼀个唯⼀的流⽔号。流⽔号⼀定要保证它的唯⼀性。该流⽔号在A 系统当中的发送卡券接⼝也要实现防重发的功能。
怎样在 A 系统当中的发送卡券接⼝防重复呢?
很简单。我们正确接收到 B 系统的请求之后,以此流⽔号写⼊缓存。然后,接着处理卡券发送的业务。当第⼆次同样的请求发送过来的时候,检查这个流⽔号是否在我们的缓存当中,如果存在⽴即查询发送的状态。并返回发送的结果。
这样 A 系统不管因为何种原因导致发送失败,重发的时候都不会导致福利卡券发送失败。
当然,A 系统也有可能会发送失败。这时我们可以到发送失败的原因修复代码。然后, B 系统重新处理就好了。
以上只是⼀个理论分析。没有给出具体的 PHP代码⽰例。在我司的⾦融产品当中,我们就⽤该思想理论,实现了诸如此类的重发问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。