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

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

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

展开
收起
真的很搞笑 2023-05-16 17:59:41 217 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
    赞同 展开评论 打赏

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关产品

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

    热门文章

    相关电子书

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

    相关镜像