关于投递事务的疑惑,感觉难点在这里!请老师帮忙
来源:8-6 实现消息重发功能

慕沐4878363
2021-07-26
老师,您好!课程很好,但有几个细节新人提问:
1、关于transMessageService.messageSendReady(messageId),是在Ordercreate后创建,个人理解是否应该把创建订单、发送消息落库放在一个事务里面,毕竟重新投递都要以这个落地数据为依据,如果落库失败,将不会有任何重试机制。
2、异步ack的时候,判断条件为 if ( ack && null != correlationData) 然后执行messageSendSuccess(messageId),如果此时落库失败,那么messageid还会存在于数据库中,定时轮询就会判定为投递交换机失败,会从新投递,这里是否会造成重复投递?
3、定时轮询是将所有的数据进行重新投递,如果某一时刻,正好有个新消息进来,并在ack删除之前进行了一次定时轮询,是否会造成此条新消息重复投递,如何避免?
也可能我理解有问题,请老师帮忙解答。
写回答
1回答
-
Moody
2021-07-26
1确实加上事务更好
2确实有这个问题,所以后面再迭代的时候要考虑重复消息的识别问题
3实际可以给消息加个中间状态,比如“消息发送中”
022021-08-20
相似问题