延时队列Delay Queue的实现

方式一:数据库实现

每条记录都存有时间戳,通过sql筛选出符合时间条件的记录。

方式二:redis的有序集合sort set

步骤:

1.产生消息
用时间戳作为score,使用zadd key score1 value1 命令生产消息

2.读取消息
使用zrangebysocre key min max withscores limit 0 1消费消息最早的一条消息。

3.消费消息并删除

redis 客户端命令

  • ZADD key score1 member1 [score2 member2]
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
  • ZREM key member [member ...]

方式三:rabbitMQ的死信队列

消息在以下情况下会变成死信息,会被DXL(Dead-Letter-Exchane)死信交换机投递到死信队列:

1.消息被拒绝。
2.消息未被及时消费或者消费了不ack,直接过期。
3.队列达到最大长度。

死信队列的实现:

消息(设置ttl)--->交换机-->队列(消息过期)-->死信交换机-->死信队列-->消费

猜你喜欢

转载自blog.51cto.com/phpme/2507239
今日推荐