跟着Machinery学习消息队列(四)

365 阅读1分钟

介绍

上一遍我们讲了如何用amqp来实现延迟队列。这一篇我们将讲述mechinery是如何基于redis来实现消息队列的。

redis实现消息队列

发送消息

如下图,machinery用rpush来实现发送消息 broker_impl_redis_publish.png

接收消息

如下图,machinery用BLPOP来实现接收消息。BLPOP是阻塞式列表的弹出原语。它是命令 [LPOP]的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候,连接将被 [BLPOP]命令阻塞。 broker_impl_redis_consume.png

小结

broker_impl_redis_publish_consume.png

redis实现延迟队列

发送消息

如下图,machinery用ZADD将消息放入到指定的延迟队列中。 broker_impl_redis_publish_delay.png

接收消息

如下图,machinery用事务来接收延迟消息。具体过程如下:

  1. WATCH key,监视延队列
  2. ZRANGEBYSCORE key 0 now LIMIT 0 1,按过期时间从小到达排序,获取过期时间小于当前时间的第一条数据
  3. MULTI,事务开始
  4. ZREM key items[0],删除消息(如果有数据变化,事务执行失败)
  5. EXEC,事务执行结束
  6. 如果事务执行成功,执行UNWATCH,刷新被监视的key
  7. 如果事务执行失败,执行DISCARD,放弃执行操作 broker_impl_redis_consume_delay.png

小结

redis基于有序列表来实现延迟队列。定时轮训获取过期的消息。

链接

上一篇---amqp如何实现延迟队列