首页 > 开发 > JAVA > 正文

电商系统如何保证支付的原子性

2017-09-07 09:24:25  来源:网友分享

案例1,

客户下订单后,订单总额100RMB;客户点击支付后,支付系统收到请求,从客户账户扣除100RMB,订单状态修改为已支付,通知商品出库系统等一系列工作后,最后返回正确状态给客户,这样基本完成支付工作。

在此,如何在突发情况下,保证支付完成或者支付失败。

这些突发情况应该包括:

  1. 客户请求不可到达
  2. 账户扣款后,没有通知出库
  3. 状态返回之前,系统宕机

案例2

客户点击支付后,又使用系统的购物卡(或者现金卡等),用虚拟币替代部分支付款;

这里增加了一点复杂度:在虚拟币扣除后突然宕机(只是其中一个原因,实际情况下可能会有其他的奇葩事件),现金款没有被扣除,客户也没有获得返回状态,这个时候客户发现虚拟货币少了,但是订单还是未支付。

不好意思,我不是做电子商务的同学,提不出其他的深奥问题了。

对于案例出现的情况, 我先提出我的解决方案:

要想解决这些问题,我会要设计一套日志系统来记录每步的操作和涉及到的数据,这个系统单独运行在一个单独的硬件环境下面,宕机恢复瞬间(也就是系统提供服务之前)查询日志,日志返回最后失败的业务(注意是业务,不是具体的某个操作,因为支付是一系列的流程,不能用单独的某个操作去表示)用来恢复数据。

那么我的问题是,

1.如何设计系统来保证支付的原子性。

2.有开源系统可以来借鉴吗?

先谢谢大牛!

解决方案

首先,你所提的问题并不是“支付的原子性”,我们通常所指的原子性基本与你的描述没什么关系。
你的问题实际上应定义为工作流(workflow)或BPM相关需求。这个我们目前在用Activiti来做,综合来看比较不错,文档也较为全面,可以尝试下。

http://activiti.org/

书的话推荐《Activiti in Action》,里面的例子都很实用。也有复杂的支付场景下的应用示例。

====
以下为吐槽:
首先题主明显属于想的太多,知道的太少,类似问题其实可以多做一些信息搜索工作再拿来问,会比较好一些。不过看你思考的解决方案确实难能可贵,因为你想出来的方案与实际的工作流解决方案在基本思路上是一致的。也说明题主还是挺有潜力的,至少认真思考过 :)