Dyno-queues 分散式延遲佇列 之 輔助功能
阿新 • • 發佈:2021-02-25
# Dyno-queues 分散式延遲佇列 之 輔助功能
[toc]
## 0x00 摘要
本系列我們會以設計分散式延遲佇列時重點考慮的模組為主線,穿插灌輸一些訊息佇列的特性實現方法,通過分析Dyno-queues 分散式延遲佇列的原始碼來具體看看設計實現一個分散式延遲佇列的方方面面。
## 0x01 前文回顧
前面兩篇文章介紹了設計思路,訊息的產生和消費。本文介紹一些輔助功能,有了這些功能可以讓系統更加完善。
## 0x2 Ack機制
前面提到,從Redis角度來看,Dyno-queues 對於每個佇列,維護三組Redis資料結構:
- 包含佇列元素和分數的有序集合;
- 包含訊息內容的Hash集合,其中key為訊息ID;
- 包含客戶端已經消費但尚未確認的訊息有序集合,Un-ack集合;
這裡的第三組資料結構,就是支援我們的 Ack 機制。
### 2.1 加入Un-ack集合
前面提到,`_pop` 是消費訊息,具體 `_pop` 的邏輯如下:
- 計算當前時間為最大分數。
- 獲取分數在 0 和 最大分數 之間的訊息。
- **將 messageID 新增到 unack 集合中,並從佇列的有序集中刪除這個 messageID**。
- 如果上一步成功,則根據messageID從Redis集合中檢索訊息。
這就是涉及到 包含客戶端已經消費但尚未確認的訊息有序集合,Un-ack集合。
程式碼如下:
```java
priv