开发者社区 > 云原生 > 正文

关于RocketMQ事务消息的一些问题

1.当我使用rocketmq事务性消息时,我发现尽管我在执行LocalTransaction时返回LocalTransactionState.ROLLBACK_message,但消费者有时仍会消费该消息。我想知道为什么会发生这种情况?

2.当我在Service类中发送消息,并在LocalTransaction中将对象保存到数据库时,Service类中发生了一些异常,为什么我不能成功地进行插入管理?

原提问者GitHub用户zhuwt1996

展开
收起
芬奇福贵 2023-05-26 16:14:43 149 0
2 条回答
写回答
取消 提交回答
  • 当使用RocketMQ的事务性消息时,即使在执行LocalTransaction时返回了LocalTransactionState.ROLLBACK_MESSAGE,消费者仍然可能会消费该消息。这是因为RocketMQ的集群环境中,消息可能会被分发到不同的消费者实例上,而这些实例可能不会立即感知到LocalTransaction的状态变更。当这些消费者实例尝试处理消息时,如果它们已经在处理该消息,那么它们将会继续处理该消息,而不会因为该消息的LocalTransaction状态而放弃。这就是为什么即使在LocalTransaction中回滚消息,消费者仍然可能会消费该消息的原因。

    在Service类中发送消息并将对象保存到数据库时发生异常,可能会导致插入管理失败。这可能是因为在事务执行期间发生了异常,导致数据库操作没有成功完成。在这种情况下,消息系统将无法提交或回滚事务,从而导致消息发送失败。

    为了解决这个问题,可以考虑在Service类中捕获异常并在事务执行期间进行重试。另外,可以使用事务性消息的保障机制,例如使用confirm模式或者设置事务的超时时间等,来保证事务的一致性。

    2023-05-27 10:00:38
    赞同 展开评论 打赏
  • 第一个问题,有没有相关的日志来说明一下这个问题呢?rollback的消息应该不会再被消费的,你是不是在console的网页上看到的,那个是因为console网页有些问题。

    第二个问题,你是不是使用了spring的@transaction注解,抛出异常倒是数据库回滚。

    原回答者GitHub用户duhenglucky

    2023-05-26 18:04:48
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关产品

  • 云消息队列 MQ
  • 相关电子书

    更多
    RocketMQ Client-GO 介绍 立即下载
    RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 立即下载