关于投递事务的疑惑,感觉难点在这里!请老师帮忙

来源: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实际可以给消息加个中间状态,比如“消息发送中”

0
2
Moody
回复
慕沐4878363
不好意思,你在别人的问题里提问的,一直没有看到 1 据我所知rabbitmq并没有这种原生的实现 2 消费端识别是个好方法,但可能会付出一些代价,比如记录已经处理的消息ID,要权衡 3 秒杀类场景还是不太推荐用rabbit,还是用redis比较合适
2021-08-20
共2条回复

RabbitMQ精讲,提升工程实践能力,培养架构思维

消息驱动架构+订单状态机,二次开发,手写分布式事务框架。

470 学习 · 205 问题

查看课程