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

大佬,Apache RocketMQ的定时时长最大值默认为24小时,这个有办法设置超过这个时间限制?

问题1:大佬,Apache RocketMQ的定时时长最大值默认为24小时,这个有办法设置超过这个时间限制吗? 问题2:可以延时任意时间吗?

展开
收起
真的很搞笑 2023-06-06 14:03:22 807 0
5 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    是的,阿里云 Apache RocketMQ 中可以通过增加定时消息的重试次数来间接扩大定时时长的限制。在 RocketMQ 中,当一个定时消息达到设定的延迟时间时,会被发送到消费者。如果消费者在规定时间内没有消费该消息,则消息会被重新发送,经过多次重试后如果仍然未被消费,则消息会被放弃。

    因此,你可以通过增加定时消息的重试次数来间接扩大定时时长的限制。假如你想将定时时长扩大为 48 小时,你可以将消息的重试次数设置为 2(即总共可以尝试发送 3 次),并将每次重试的时间间隔逐步延长,从而实现定时时长的扩大。例如:

    • 第一次发送:延时 24 小时
    • 第二次重试:延时 12 小时
    • 第三次重试:延时 12 小时

    这样,即使消息未在最初的 24 小时内被消费,也可以通过多次重试来保证消息最终能够被消费而不被丢弃。当然,如果需要使用更长的定时时长,你可以根据实际情况设置更多的重试次数和延时时间。

    2023-06-06 16:18:28
    赞同 展开评论 打赏
  • 定时消息的最大延迟时间默认为 24 小时,这是由设计限制所决定的。目前没有内置的方法来直接设置超过这个时间限制的定时消息。

    如果你需要发送超过 24 小时的延迟消息,一种可行的方法是将消息发送到一个特定的 topic,然后在到期时间到达之前,使用 RocketMQ 的定时任务或其他方式定期检查该 topic,并在到期时发送相应的实时消息。这样可以间接实现超过 24 小时的延迟效果。

    2023-06-06 15:38:38
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    对于问题1,Apache RocketMQ的定时时长最大值默认为24小时,这是由于在实际生产环境中,长时间的延迟可能会导致一些不必要的问题,例如消息的过期等。因此,Apache RocketMQ默认限制了延迟时间的最大值。如果您需要设置超过24小时的延迟时间,您可以通过修改源代码并重新编译Apache RocketMQ来实现。

    对于问题2,Apache RocketMQ支持延时任意时间。您可以通过设置消息的延迟级别来实现延迟任意时间。延迟级别是一个整数值,表示消息延迟的时间,单位为毫秒。您可以根据需要设置延迟级别,例如,如果您需要延迟10分钟发送消息,则可以将延迟级别设置为10601000=600000毫秒。请注意,在设置延迟级别时,您需要考虑到消息的过期时间,确保消息不会在过期后被消费者接收到。

    2023-06-06 14:14:03
    赞同 展开评论 打赏
  • 第一个问题,“Apache RocketMQ 的定时消息时长最大值默认为 24 小时,这个有办法设置超过这个时间限制吗?”

    答案是:可以通过修改消息的 DELAY_TIME_LEVEL 来实现延时超过默认值 24 小时的功能,不过建议不要设置过长的延时时间,因为长时间的延时可能会导致占用过多的 RocketMQ 服务资源。

    第二个问题,“可以延时任意时间吗?”

    答案是:在 RocketMQ 4.4.0 之后的版本中提供了更为灵活的定时功能,即支持按照时间戳来设置延时消息。您可以通过在消息 Headers 中添加 DELAY_TIME_LEVEL=0SCHEDULE_TOPICSCHEDULE_TIME 属性,来实现按照时间戳来设置延时的消息。例如:

    Message msg = new Message("TestTopic", "TagA", "Hello RocketMQ".getBytes());
    msg.putUserProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "0");
    msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TOPIC, "SCHEDULE_TOPIC_XXX");
    msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TIME, "" + (System.currentTimeMillis() + 3600 * 1000));
    producer.send(msg);
    

    上述代码中,我们通过 msg.putUserProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, "0") 来设置消息的延时等级为 0,表示按照时间戳来进行延时;并通过 msg.putUserProperty(MessageConst.PROPERTY_SCHEDULE_TIME, "" + (System.currentTimeMillis() + 3600 * 1000)) 来设置延时时间为当前时间加上一个小时。

    需要注意的是,设置了时间戳的延时消息会在 SCHEDULE_TIME 所制定的时间到达之后被立即发送,因此在消息发送前需要确保相应的延时时间已经到达。

    2023-06-06 14:10:38
    赞同 展开评论 打赏
  • 回答1:5.0.1支持了自定义时间的,与阿里云商业版一样的使用方式 回答2:对,不是之前那种只能选择18个level的了,此回答整理自钉群“群2-Apache RocketMQ 中国开发者钉钉群”

    2023-06-06 14:07:58
    赞同 展开评论 打赏

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

相关产品

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

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

    相关镜像