使用 rocketMQTemplate.syncSend()
发送延迟消息很方便,但需要注意 RocketMQ 的延迟消息级别是固定的,并不直接支持任意时长。默认情况下,没有正好 11 分钟的级别,最接近的是 10 分钟(级别14)和 20 分钟(级别15)。不过,你可以通过修改 Broker 配置来自定义延迟级别。
下面是一个延迟级别和对应时间的表格,方便你直观了解:
延迟级别 (delayLevel) | 延迟时间 | 对应队列ID |
---|---|---|
1 | 1秒 | queue0 |
2 | 5秒 | queue1 |
3 | 10秒 | queue2 |
4 | 30秒 | queue3 |
5 | 1分钟 | queue4 |
6 | 2分钟 | queue5 |
7 | 3分钟 | queue6 |
8 | 4分钟 | queue7 |
9 | 5分钟 | queue8 |
10 | 6分钟 | queue9 |
11 | 7分钟 | queue10 |
12 | 8分钟 | queue11 |
13 | 9分钟 | queue12 |
14 | 10分钟 | queue13 |
15 | 20分钟 | queue14 |
16 | 30分钟 | queue15 |
17 | 1小时 | queue16 |
18 | 2小时 | queue17 |
表:RocketMQ 默认延迟级别与时间对应关系123 |
🛠️ 实现11分钟延迟消息
要实现11分钟的延迟消息,你有以下两种方案。
方案一:使用最接近的默认级别(简单但不够精确)
如果对时间精度要求不是非常严格,可以选择最接近的级别。10分钟(级别14)或20分钟(级别15)是默认选项。发送10分钟延迟消息的代码如下:
// 设置消息目的地(Topic)和消息内容 String destination = "YourTopicName"; String message = "YourMessageContent";// 发送延迟消息(级别14对应10分钟) SendResult sendResult = rocketMQTemplate.syncSend(destination,MessageBuilder.withPayload(message).build(),5000, // 发送超时时间,单位毫秒14 // 延迟级别:14 对应 10分钟 );
方案二:修改Broker配置自定义级别(精确但需运维)
若业务要求精确的11分钟,需要修改RocketMQ Broker的配置文件。
-
修改Broker配置文件:找到Broker的配置文件(通常是
broker.conf
),修改或添加messageDelayLevel
参数。例如,在原有级别中加入11m:messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 11m 20m 30m 1h 2h
注意:新级别的顺序很重要,它决定了对应的延迟级别数字。例如,
11m
在上述配置中将是第15级4。 -
重启Broker服务:修改配置后必须重启Broker服务才能生效。
-
使用自定义的延迟级别:配置生效后,11分钟对应新的延迟级别(例如第15级),代码中只需传入对应的级别数字即可。
// 假设11m是第15个级别 SendResult sendResult = rocketMQTemplate.syncSend(destination,MessageBuilder.withPayload(message).build(),5000,15 // 使用自定义配置中11分钟对应的延迟级别 );
-
延迟时间非任意设置:RocketMQ不支持任意时间的延迟,只能使用预设的延迟级别34。
-
延迟精度:延迟消息的实际投递时间可能存在几秒的误差4,这是由其扫描机制决定的。
-
避免延迟时间为0:切勿将延迟级别设置为0,这可能导致消息类型校验失败并抛出异常7。
-
消息大量堆积的影响:如果将大量延迟消息的定时时间设置为同一时刻,则到达该时刻后会有大量消息同时需要被处理,会造成系统压力过大,导致消息分发延迟,影响定时精度3。
-
性能考量:高并发的延迟消息会增加Broker的CPU负载4。
💎 如何选择?
-
如果业务要求不高,选择最接近的默认级别(10分钟)是最快最简单的方式。
-
如果业务要求精确的11分钟,并且你有权限修改Broker配置,那么自定义延迟级别是合适的方案。记得测试修改配置后的Broker运行情况。