问题1:有个问题想问大家 RocketMQ中生产者发送一条事务消息 执行本地事务是未知的状态 然后触发MQ的回查机制 但这时候如果生产者断开连接了一段时间再重新连接 MQ怎么知道生产者原来的channel地址呢? 问题2:也就是说生产者如果回查事务逻辑在变化了 回查的就是新的逻辑了?
【回答】
问题1: 在RocketMQ中,如果生产者发送一条事务消息时未指定消息的确切状态,则交给消息队列自行处理。消息队列会在接收到消息后按照一定的规则执行消息的处理逻辑,如果遇到异常情况,消息队列也会自动进行重试等处理,以确保消息的处理正确性。
问题2: 生产者回查事务逻辑的变化不会影响消息队列中已经存在的消息的状态,因为消息队列是以消息的顺序进行处理的。如果生产者回查后发现需要修改已经发送的消息的状态,可以通过重新发送消息来实现。如果消息队列中已经存在多条相同的消息,则后面的消息会覆盖前面的消息。
问题1:在 RocketMQ 执行事务消息的回查机制中,当消息发送者断开连接一段时间后再重新连接,RocketMQ 会重新向消息发送方发送回查请求,消息发送方再执行本地事务时需要返回上一次事务执行的结果。RocketMQ 会在消息的属性中保存上一次发送方的 Channel 地址(key 为 TRANSACTION_ID
),当 RocketMQ 重新向消息发送方发送回查请求时,通过该属性获取上一次发送方的 Channel 地址。
问题2:是的,当发送方回查事务逻辑发生变化时,RocketMQ 会根据最新的逻辑执行回查请求。因此,回查逻辑的变化需要在消息生产者方和消息消费者方同时协商好,并进行相应的代码实现和版本管理。
NameServer 会维护关于每个 Group ID 的信息,包括生产者的地址,当生产者重新连接后,它会向 NameServer 注册,并指定之前使用的 Group ID。
回答1:根据producer group来判断的 回答2:如果producer group下有多个producer,一个断了会找其他的。如果是单个,重连后回查逻辑又变了,那应该就是新逻辑了,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/