博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

php 同步因子的并发处理

Posted on 2016-03-28 22:23  懒人ABC  阅读(344)  评论(0编辑  收藏  举报

在php中,如果处理支付时,会涉及到并发。

具体体现在同步通知支付结果和异步通知结果。

拿支付宝来说,同步通知call_back和异步通知notify是没有固定先后顺序的。

有可能notify先通知到当前商城,也可能是call_back先通知到当前商城

这样如果两个基本同一秒内通知到到商城,会造成商城的两个接受方法会去检查订单是否已经支付完成都是未完成状态,

都会执行支付信息更新和其他相关的操作,这样就造成了重复

因为我们平台的前端使用了memcache作为缓存,后端使用的是redis作为缓存。

那么在前端支付时,我们可以使用memcache的add方法来仲裁同步因子的并发。

比方说,call_back与notify同时执行了memcache.add方法("pay_订单号xxxxx","1",5)

意思就是把订单号作为key,存放到缓存中5秒时间,如果添加成功,则说明我是优先抢到了执行权

如果返回false,则说明我晚了,被别人优先抢到了。

另外设置5秒钟也大致上一个订单流程处理完了,目的是如果订单处理过程中出现了异常,比如服务器繁忙,则notify会二次通知,三次通知。。。也不会造成影响。