开发者社区> 问答> 正文

rocketMq中的定时发送问题

您好,请问现在在5.0+版本中支持了任意时刻的定时发布功能,我看到官方文档上写了最长支持定时时间是24小时,可是我看有其他的地方写的是没有这个限制,请问有人知道详细的问题么

展开
收起
游客ksnmdm4dodvzu 2023-08-14 17:00:39 127 1
4 条回答
写回答
取消 提交回答
  • 定时消息是云消息队列 RocketMQ 版提供的一种高级消息类型,消息被发送至服务端后,在指定时间后才能被消费者消费。通过设置一定的定时时间可以实现分布式场景的延时调度触发效果。

    定时时间设置原则

    云消息队列 RocketMQ 版定时消息设置的定时时间是一个预期触发的系统时间戳,延时时间也需要转换成当前系统时间后的某一个时间戳,而不是一段延时时长。
    定时时间的格式为毫秒级的Unix时间戳,您需要将要设置的时刻转换成时间戳形式。具体方式,请参见Unix时间戳转换工具。
    定时时间必须设置在定时时长范围内,超过范围则定时不生效,服务端会立即投递消息。
    定时时长最大值默认为24小时,不支持自定义修改,更多信息,请参见参数限制。
    定时时间必须设置为当前时间之后,若设置到当前时间之前,则定时不生效,服务端会立即投递消息。
    示例如下:
    定时消息:例如,当前系统时间为2022-06-09 17:30:00,您希望消息在下午19:20:00定时投递,则定时时间为2022-06-09 19:20:00,转换成时间戳格式为1654773600000。
    延时消息:例如,当前系统时间为2022-06-09 17:30:00,您希望延时1个小时后投递消息,则您需要根据当前时间和延时时长换算成定时时刻,即消息投递时间为2022-06-09 18:30:00,转换为时间戳格式为1654770600000。

    image.png
    image.png

    定时消息的实现逻辑需要先经过定时存储等待触发,定时时间到达后才会被投递给消费者。因此,如果将大量定时消息的定时时间设置为同一时刻,则到达该时刻后会有大量消息同时需要被处理,会造成系统压力过大,导致消息分发延迟,影响定时精度。
    a1ffb896d6721ee1fff9b8c1fff42656_p448161.gif

    2023-08-15 08:54:45
    赞同 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    你好,官方文档写的是默认24小时,特殊需求,可提交工单申请延长至7天,主要是考虑超长定时参数会给系统带来稳定性风险,建议定时时长不要设置过长。

    2023-08-14 21:35:44
    赞同 展开评论 打赏
  • 在RocketMQ 5.0+版本中,确实支持了任意时刻的定时发布功能,但是官方文档中提到的最长支持定时时间是24小时,这是因为在实际应用中,如果定时发布的时间间隔过长,会对消息的实时性产生影响,同时也会增加系统的负担。

    2023-08-14 21:34:48
    赞同 展开评论 打赏
  • 是个只会写bug的程序媛啊!!!

    RocketMQ是阿里巴巴开源的一款分布式消息中间件,设计之初就是为大规模消息处理而设计,具有高可用、高并发、可扩展等特性。

    关于RocketMQ的定时发送问题,RocketMQ的Producer提供了sendDelay方法,可以设置延迟一定时间后发送消息。

    示例代码如下:
    ```DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
    producer.setNamesrvAddr("127.0.0.1:9876");
    producer.start();

    Message msg = new Message("TopicTest", "TagA", "OrderID001", "Hello RocketMQ".getBytes(RemotingHelper.DEFAULT_CHARSET));

    /**

    • 设置消息发送延迟时间为10s
      */
      msg.setDelayTimeLevel(3);

    SendResult sendResult = producer.send(msg);
    System.out.println(sendResult);

    producer.shutdown();
    ```
    在这段代码中,我们设置了消息的延迟时间为10秒。msg.setDelayTimeLevel(3)这行代码就是设置延迟时间的关键,其中3表示10秒。RocketMQ预定义了6个延迟级别,分别是:

    • Level = 1,表示该消息延迟1秒;
    • Level = 2,表示该消息延迟5秒;
    • Level = 3,表示该消息延迟10秒;
    • Level = 4,表示该消息延迟20秒;
    • Level = 5,表示该消息延迟30秒;
    • Level = 6,表示该消息延迟60秒。

    需要注意的是,RocketMQ的延迟消息并不能保证在指定时间后立即发送,而是在设置的级别时间后开始发送。例如,如果设置为Level=3,则会在10秒后开始发送,但具体何时发送成功还需要看Broker的处理情况。

    2023-08-14 18:06:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

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