Dyno-queues 分散式延遲佇列 之 生產消費
阿新 • • 發佈:2021-02-21
# Dyno-queues 分散式延遲佇列 之 生產消費
[toc]
## 0x00 摘要
本系列我們會以設計分散式延遲佇列時重點考慮的模組為主線,穿插灌輸一些訊息佇列的特性實現方法,通過分析Dyno-queues 分散式延遲佇列的原始碼來具體看看設計實現一個分散式延遲佇列的方方面面。
## 0x01 前情回顧
Dyno-queues 是 Netflix 實現的基於 Dynomite 和 Redis 構建的佇列。Dynomite是一種通用的實現,可以與許多不同的key-value儲存引擎一起使用。目前它提供了對Redis序列化協議(RESP)和Memcached寫協議的支援。
上文我們介紹了 Dyno-queues 分散式延遲佇列 的設計思路,本文我們繼續介紹訊息的產生和消費。
首先我們回顧下設計目標和選型思路。
### 1.1 設計目標
具體設計目標依據業務系統不同而不同。
Dyno-queues的業務背景是:在Netflix的平臺上執行著許多的業務流程,這些流程的任務是通過非同步編排進行驅動,現在要實現一個分散式延遲佇列,這個延遲佇列具有如下特點:
- 分散式;
- 不用外部的鎖機制;
- 高併發;
- 至少一次語義交付;
- 不遵循嚴格的FIFO;
- 延遲佇列(訊息在將來某個時間之前不會從佇列中取出);
- 優先順序;
### 1.2 選型思路
Netflix選擇Dynomite,是因為:
- 其具有效能,多資料中心複製和高可用性的特點;
- Dynomite提供分片和可插拔的資料儲存引擎,允許在資料需求增加垂直和水平擴充套件;
Netflix選擇Redis作為構建佇列的儲存引擎是因為:
- Redis架構通過提供構建佇列所需的資料結構很好地支援了佇列設計,同時Redis的效能也非常優秀,具備低延遲的特性
- Dynomite在Redis之上提供了高可用性、對等複製以及一致性等特性,用於構建分散式叢集佇列。
下面我們具體看看如何生產和消費訊息。
## 0x02 產生訊息
Dyno-queues 使用者使用push方法來向redis中投放訊息。
```j