最近看了Dyno-queues分布式延迟队列的源码,发现了一些不错的技巧,而本文是对Dyno-queues架构精华的总结。-济南达内培训负责整理
本文是根据 #/netflix-techblog/distributed-delay-queues-based-on-dynomite-6b31eca37fbc 翻译而来,如果有不准之处请大家多包含。
在Netflix的平台上运行着许多的业务流程,这些流程的任务是通过异步编排进行驱动,现在我们要实现一个分布式延迟队列,这个延迟队列具有如下特点:
分布式
不用外部的锁机制
高并发
至少一次语义交付
不遵循严格的FIFO
延迟队列(消息在将来某个时间之前不会从队列中取出)
优先级
一、使用Dynomite和Redis构建队列
Dynomite是一种通用的实现,可以与许多不同的key-value存储引擎一起使用。目前它提供了对Redis序列化协议(RESP)和Memcached写协议的支持。我们选择Dynomite,是因为其具有性能,多数据中心复制和高可用性的特点。此外,Dynomite提供分片和可插拔的数据存储引擎,允许我们在数据需求增加垂直和水平扩展。

1、为什么选择Redis?
我们选择Redis作为构建队列的存储引擎:
Redis架构通过提供构建队列所需的数据结构很好地支持了队列设计,同时Redis的性能也非常优秀,具备低延迟的特性
Dynomite在Redis之上提供了高可用性、对等复制以及一致性等特性,用于构建分布式集群队列。
一个队列被存储为Redis的有序集合(ZADD和ZRANGE等操作),Redis使用分数对有序集合中的成员进行排序,当往队列中存储数据时,根据优先级和超时时间计算分数。
2、使用Redis实现数据的push和pop
对于每个队列,维护三组Redis数据结构:
包含队列元素和分数的有序集合
包含消息内容的Hash集合,其中key为消息ID.
包含客户端已经消费但尚未确认的消息有序集合,Un-ack集合。
PUSH
根据消息超时(延迟队列)和优先级计算得分
添加到队列的有序集合
将Message对象到Hash集合中,key是messageId.
POP
计算当前时间为最大分数。
获取分数在0和最大分数之间的消息。
以上就是济南达内培训给大家做的内容详解,更多关于IT的学习,请继续关注济南达内培训