官网虽有说明,事务消息不支持延迟发送,但我还是试了一下,发现目标Consumer不但不能正确收到生产者发的消息,而且在Console查看RMQ_SYS_TRANS_HALF_TOPIC消息是瞬间占满(最多显示2000条),已经翻阅源码,造成此问题的基本原因如下:
1、设置DelayTimeLevel后,Broker端在调用EndTransactionProcessor时,目标Topic变成SCHEDULE_TOPIC_XXXX,REAL_TOPIC变成RMQ_SYS_TRANS_HALF_TOPIC,原有的真实Topic丢失。
2、延迟时间到了之后,会往RMQ_SYS_TRANS_HALF_TOPIC发一条消息,但RMQ_SYS_TRANS_OP_HALF_TOPIC队列里无此消息。
3、回查事务定时任务启动后,发现只在RMQ_SYS_TRANS_HALF_TOPIC有消息,触发该消息的回查事务方法,事务结束后,结果又往SCHEDULE_TOPIC_XXXX塞了一条消息。
4、如此反复直至15次尝试用尽,最终丢弃此消息。
个人认为有两个问题:
1、耗费资源,每条消息尝试15次,调用15次事务回查,代价有点大。
2、下游消费者一直收到不消息。
以上是个人看法,如有不正确或未详尽之处请回复,谢谢
原提问者GitHub用户TonyStark888
非常好的想法,首先,事务消息依赖于本地事务的执行时间,因此支持延迟的话,必须要考虑这两方面的因素,哪个因素比较重要也是值得商榷的。
原回答者GitHub用户duhenglucky
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。