现在我们平台,手机充值功能处,可以给指定手机号码进行充值
充值时平台会在后台写一张订单进数据库
订单主要由订单号,创建时间,手机号码,充值人,充值金额...组成
现手机充值第三方,我们只需要提交给他们手机充值号码和金额,他们帮我们充值
他们那边增加了一个策略限制
在五分钟之类不能对同一手机进行二次充值.
提出一种设计方案,合理进行顺序通知订单.
要求:同一个人的订单必须按创建时间进行有序通知.
方案可以修改数据库字段,
需要一个后台设计通知方案.
我已经想到了一个.看大家能不能提出一种更好的,
或者我想的这种方法有什么bug或者什么优化的地方
订单数据表设计
订单号 充值人 充值金额 充值号码 充值状态 通知时间(增加) ...
在插入订单时,进行判断select 通知时间 from 订单表 where 手机号码='xxx' and 充值状态=未充值 得出该笔订单的充值时间
如果拿到了数据,代表该手机号码有需要充值的订单正在序列中.
这样,我们可以把通知时间在查到的充值时间的基础上加上5分钟.(最好是比5分钟多.这里暂时订为5分钟)
如果没拿到数据,我们可以把通知时间插入当前时间
再后台通知程序运行的时候,我们只需要判断手机号码,充值状态,通知时间.
为了防止后台等待时间时,我们插入订单,这样在通知时间上可能会有点bug,我们需要在后台增加一步操作
初步程序设计,
程序首先拿出通知时间小于或等于当前时间的订单,按照主键进行排序通知,队列通知完成后,线程等待5分钟(为什么等待5分钟,后面解释),然后继续进行拿需要通知订单序列,通知,如此循环.
1.为什么需要等待5分钟???
答:因为如果不等待5分钟,首先对系统资源肯定是有无辜消耗.
2.程序初步设计有问题吗?
答:具个人思考,还是有个问题的.
比如说,当一个队列通知队列较长,消耗时间太多,比如说消耗时间5分钟,有可能是5分钟+
然后等待5分钟,这样在重新拿队列的时候有可能会一次拿出两笔同一手机号的订单.
所以我们需要在通知对列里面进行判断处理.
如果队列里面有几条需要通知的同一手机号码订单,只取最前面一条,这里具体实现应该可以,关键是优化算法
这样就可以达到我们想要的了
个人感觉,是不是简单点好些,遵循第三方策略,将订单放入队列,加入队列前对订单进行核对,若已存在则返回提示信息,提示当前号码已存在充值订单,请5-n分钟后进行操作。订单移出队列操作完成后,将订单信息保存到数据库,返回操作信息