最近在实现一个定时发送推送消息的功能,用到了延迟消息,想整理一下延迟消息消息相关的东西。
实现定时发送这个需求通常有两种方式:
- 轮询定时任务:给定周期内扫描数据表,查看是否有认为还没执行。
这种实现可以很简单,只需要启动一个定时任务即可;但缺点同样也很明显,这个间隔扫描的时间不好控制。
给短了会造成很多无意义的扫描,增大数据库压力,给长了又会使得误差较大。 -
延时消息:创建定时任务的时候,发送 N 分钟再发出的MQ信息,一旦消息触达,便执行业务逻辑。
通过延时消息可以去掉不必要的数据扫描,实时性也比较高。
延迟消息
Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费,该消息即延时消息。
支持延迟消息的中间件
ActiveMQ原生自带、RabitMQ需要安装插件(rabbitmq_delayed_message_exchange)、
ActiveMQ延迟消息
我们的系统使用的是ActiveMQ,ActiveMQ从版本5.4开始提供了持久化的延迟消息功能。
为了使用ActiveMQ的延迟消息功能,我们需要修改ActiveMQ的配置文件activemq.xml,
在broker节点上添加schedulerSupport=”true”
ActiveM提供了很多高级的延时消息配置属性:
| 属性 | 类型 | 描述 |
|---|---|---|
| AMQ_SCHEDULED_DELAY | long | broker在投递该消息前等待的毫秒数 |
| AMQ_SCHEDULED_PERIOD | long | 每次重新投递该消息的时间间隔 |
| AMQ_SCHEDULED_REPEAT | int | 重复投递该消息的次数 |
| AMQ_SCHEDULED_CRON | String | 使用一个cron表达式来表示消息投递的策略 |
(完)