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

请问下,Apache RocketMQ中单个消息写入失败或超时造成整个集合的重新写入,这个造成该批?

请问下,Apache RocketMQ中单个消息写入失败或超时造成整个集合的重新写入,这个造成该批次的定时消息重复,请问这个是基于什么考虑的?既然每个timerRequest都有状态,为什么不在循环中做状态的判断,只重复写入失败的消息呢?image.png

展开
收起
cuicuicuic 2023-07-03 16:19:53 61 0
3 条回答
写回答
取消 提交回答
  • 在 Apache RocketMQ 中,消息发送是以批量的方式进行的。当发送一批消息时,如果其中的某个消息写入失败或超时,不会造成整个批次的重新写入。

    2023-07-03 19:09:31
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    RocketMQ设计上采用了消息的异步复制机制,即消息在主节点写入之后,需要异步复制到从节点上。如果某个消息在写入主节点时发生失败或超时,那么该消息就无法被复制到从节点上,从而导致从节点上的数据不一致。为了避免这种情况出现,RocketMQ采用了消息重试机制,即在消息写入失败或超时时,会将该消息重新写入,直到写入成功为止。

    对于定时消息的重复写入问题,可能是由于消息写入失败或超时时,RocketMQ采用了一次性重试所有失败消息的机制。在重试过程中,如果某个消息写入成功,则不会再继续重试该消息,但是其他还未写入成功的消息仍然会进行重试。这样可能会导致定时消息在某些情况下被重复写入,但是由于RocketMQ的消息幂等机制,重复写入不会对消息的正确性产生影响。

    对于RocketMQ是否应该在循环中做状态判断,只重复写入失败的消息,这是一个设计问题。

    2023-07-03 17:50:20
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    这个就是MQ的“消息重试”的机制,是为了提高消息的可靠性和确保消息的投递。

    关于定时消息的重复发送,这是因为定时消息的可靠性要求更高。如果在定时消息发送的过程中发生了异常,为了确保消息一定能够被发送,RocketMQ 会将整个批次的定时消息重新写入。

    我个人理解的是每个 TimerRequest 是有状态的,但在循环中进行状态判断并只重复写入失败的消息会增加复杂性,并且可能导致消息的不一致。重新写入整个批次的消息可以确保所有消息都得到正确处理。

    2023-07-03 17:27:31
    赞同 展开评论 打赏

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

相关产品

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

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

    相关镜像