关于消息驱动模式中支付过程这一节的问题
来源:7-8 支付过程

达闻西funnyx
2018-10-23
老师您好,在这一节中,有个疑问,就是如果在支付过程中,支付成功后,如果发送解锁票的消息失败,则要将失败的消息写入一个队列中,在代码演示中,然后建立相关的表payInfo来判断是否是重发,这里使用了最大努力一次提交这种方式,但是如果使用JTA这种事务管理方式,是不是就不需要建立表来判断了?因为可以让MQ和DB的数据都回滚。还有如果在这里解锁票的消息发送失败,那监听这个解锁票的队列再如何获取消息呢?此时用户账户的钱已经扣款成功,需要人工介入么?
写回答
1回答
-
在一个多个步骤的分布式事务当中,也就是先下单,再支付,再减库存、发货等,在这种情况下,对于一个请求,我们需要判断它是不是正常请求、异常请求、重复请求。所以像支付的时候,通过payInfo表来判断是否支付过。在重复请求中会存在处理过的记录,就是因为最大努力一次提交,如果使用JTA,只要失败了,就不会写进去任何数据,就不会存在处理过的记录了。
然后,在数据的回滚过程中,我们需要保证所有的已处理数据都被回滚,包括锁票、扣费等数据。但是这个回滚是否要用程序自动执行,也要看具体的业务流程和设计。只要这个回滚的过程不会导致系统设计和代码过于复杂,就使用程序回滚。上面也说了,我们需要判断它是不是正常请求、异常请求、重复请求等等,业务流程多一步、条件分支多一个,往往就会成倍的增加代码复杂度,所以,我们需要权衡。当然对于出错时的回滚,也要做好相应的出错信息的记录。
032018-10-25
相似问题