基于Dynomite的分布式延迟队列

最近看了Dyno-queues分布式延迟队列的源码,发现了一些不错的技巧,而本文是对Dyno-queues架构精华的总结。
本文是根据 https://medium.com/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和最大分数之间的消息。
  • 将messageID添加到unack集合中,并从队列的有序集中删除这个messageID。
  • 如果上一步成功,则根据messageID从Redis集合中检索消息。

ACK

  • 从unack集合中删除messageID。
  • 从Message有效集合中删除messageID。
    客户端未进行确认的消息,会被再度推回到队列中(这是一个定时任务负责检测)。

3、可用分区和机架意识

我们的队列是在Dynomite的JAVA客户端Dyno之上建立的,Dyno为持久连接提供连接池,并且可以配置为拓扑感知,此外,Dyno为应用程序提供特定的本地机架(在AWS中,机架是一个区域,例如 us-east-1a、us-east-1b等),us-east-1a的客户端将连接到相同区域的Dynomite/Redis节点,除非该节点不可用,在这种情况下该客户端将进行故障转移。这个属性被用于通过区域划分队列。

分片
队列根据可用区域进行分片,将数据推送到队列时,通过轮训机制确定分片,这种机制可以确保所有分片的数据是平衡的,每个分片都代表Redis中的有序集合,有序集中的key是queueName和AVAILABILITY _ZONE的组合。

避免全局锁

image.png

  • 每个节点(上图中的N1...Nn)与可用性区域具有关联性,并且与该区域中的redis服务器进行通信。
  • Dynomite / Redis节点一次只能提供一个请求,Dynomite可以允许数千个并发连接,但是请求是由Redis中的单个线程处理,这确保了当发出两个并发调用从队列轮询元素时,是由Redis服务器顺序执行,从而避免任何本地或分布式锁。
  • 在发生故障转移的情况下,确保没有两个客户端连接从队列中获取相同的消息。

处理Un-ACK的消息
后台进程监视UNACK集合中的消息,这些消息在给定时间内未被客户端确认(每个队列可配置)。这些消息将移回到队列中。

Dyno-queues分布式延迟队列的github地址是:
https://github.com/Netflix/dyno-queues

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容