分布式消息队列RocketMQ
四、 RocketMQ应用
4.3)延时消息
4.3.1) 什么是延时消息
当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息。
采用RocketMQ的延时消息可以实现定时任务的功能,而无需使用定时器。典型的应用场景是,电商交易中超时未支付关闭订单的场景,12306平台订票超时未支付取消订票的场景。
在电商平台中,订单创建时会发送一条延迟消息;这条消息将会在30分钟后投递给后台业务系统(Consumer),后台业务系统收到该消息后会判断对应的订单是否已经完成支付。如果未完成,则取消订单将商品再次放回到库存;如果完成支付则忽略。
在12306平台中,车票预订成功后就会发送一条延迟消息。这条消息将会在45分钟后投递给后台业务系统(Consumer),后台业务系统收到该消息后会判断对应的订单是否已经完成支付。如果未完成则取消预订,将车票再次放回到票池;如果完成支付则忽略。
4.3.2) 延时等级
延时消息的延迟时长不支持随意时长的延迟,是通过特定的延迟等级来指定的。延时等级定义在 RocketMQ服务端的MessageStoreConfig类中的如下变量中:

即,若指定的延时等级为3,则表示延迟时长为10s,即延迟等级是从1开始计数的。
当然,如果需要自定义的延时等级,可以通过在broker加载的配置中新增如下配置(例如下面增加了1 天这个等级1d),配置文件在RocketMQ安装目录下的conf目录中【单机的就添加到 broker.conf 中】
messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m
1h 2h 1d
4.3.3)延时消息实现原理

RocketMQ的延时消息功能可用于实现定时任务,如电商超时订单处理。消息按预设的延迟等级延迟投递,例如10s、30min等。延时消息在Broker端经过修改Topic、创建queueId、更新索引等步骤存储,由ScheuleMessageService定时投递到目标Topic。代码案例展示了如何创建和消费延时消息。
最低0.47元/天 解锁文章
1081

被折叠的 条评论
为什么被折叠?



