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

Apache RocketMQ中我测试ons的时候, 发送半消息, 发现超过20s后, 再提交这个?

Apache RocketMQ中我测试ons的时候, 发送半消息, 发现超过20s后, 再提交这个半消息, 消息并不会被发现, 低于20s就可以,ons是不是对于半消息的存储有时间限制,有大佬知道这个问题吗?

展开
收起
真的很搞笑 2023-05-16 17:53:11 199 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    在Apache RocketMQ中,半消息是指发送方发送的事务消息的一种状态,当一条事务消息被发送时,发送方先发送一个半消息,等事务执行完成之后再提交这个半消息。在这个过程中,如果半消息在一定时间没有被提交,那么RocketMQ会认为这个事务已经失败并回滚,会丢弃这个半消息。

    默认情况下,RocketMQ会将半消息的最大存活时间设置为15秒,如果在这个时间范围内没有收到提交的消息,则会自动回滚这个事务并删除半消息。如果需要更改存活时间,可以通过修改RocketMQ配置文件中的"transactionMsgTimeout"参数来实现。

    因此,如果你的半消息提交时间超过20秒,可能已经超过了半消息的最大存活时间,所以RocketMQ会认为这个事务已经失败并删除半消息。建议在发送半消息时,尽可能保证在半消息存活时间内提交事务,避免数据的丢失。

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

    在Apache RocketMQ中,发送半消息后,如果在规定时间内没有提交或者回滚,那么这个半消息会被RocketMQ服务器删除。默认情况下,RocketMQ服务器会在15s内检查半消息是否被提交或者回滚,如果没有,则会自动删除该半消息。可以通过修改messageDelayLevel参数来调整这个时间。

    在ONS中,由于其是建立在RocketMQ基础之上的云服务,因此也会遵循RocketMQ的相关规则。如果您的半消息在提交之前超过了20s,那么这个半消息很可能已经被RocketMQ服务器删除了,导致消息无法被发现。

    因此,建议在发送半消息时及时提交或者回滚,以避免出现这种情况。如果需要更长时间的等待期限,可以通过修改messageDelayLevel参数来调整等待时间。

    2023-05-16 18:10:01
    赞同 展开评论 打赏

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

相关产品

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

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

    相关镜像