开发者社区 > 云原生 > 云消息队列 > 正文

请问下,Apache RocketMQ 中如果异步发送返回超时的异常,不做补偿处理,是不是数据就丢?

请问下,Apache RocketMQ 中如果异步发送返回超时的异常,不做补偿处理,是不是数据就丢失了?image.png image.png

展开
收起
真的很搞笑 2023-05-16 17:59:41 257 0
3 条回答
写回答
取消 提交回答
  • 是的,这里发送失败需要使用者自己处理。此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”

    2023-07-05 11:47:23
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    如果异步发送返回超时的异常,且没有进行任何补偿处理,数据的确可能丢失。因为在异步发送模式下,消息发送会立刻返回,不会等到消息真正被投递到Broker上,如果异步发送调用结果超时或失败,可能导致消息在发送过程中丢失。

    为了避免这种情况,可以在发送端添加消息重试和回查机制。消息重试就是将发送失败的消息重复发送,以增加发送成功的机会;消息回查则是在发送端向MQ服务器申请某个消息是否投递成功,如果未收到回应或确认消息投递失败,可以选择再次回查或进行其他补偿处理。RocketMQ也提供了消息投递事务机制,可以在发送事务消息时保证消息投递的可靠性,保证消息不丢失。

    在保证消息可靠性的前提下,需要结合业务场景选择合适的消息发送方式和异常处理机制。

    2023-05-23 14:27:35
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    1.是的,如果RocketMQ异步发送返回超时并且不进行补偿处理,那么数据很可能会丢失。因此在生产环境中要保证消息的可靠传递,通常我们需要对发送超时的情况进行补偿处理,确保消息被正确地投递到目标主题或队列中。

    2.是的,RocketMQ客户端默认会进行异步发送重试。当客户端发现异步返回失败时,会自动重发消息,并且重试次数也是可以配置的。重试次数可以通过设置发送消息的SendCallback的RetryTimesWhenSendAsyncFailed参数。

    3.是的,如果客户端重试多次后还无法将消息发送成功,那么就需要让应用程序自己进行消息补偿处理。这一点需要通过对应用程序进行编码来处理,具体实现方式可以根据业务需求进行定制。

    2023-05-22 11:40:07
    赞同 展开评论 打赏

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    Apache Flink技术进阶 立即下载
    Apache Spark: Cloud and On-Prem 立即下载
    Hybrid Cloud and Apache Spark 立即下载

    相关镜像