簡體   English   中英

如何擴展 Redis 隊列

[英]How to scale Redis Queue

對於我們的電子商務市場應用程序,我們正在從單體架構轉向微服務架構。 我們選擇 Redis pub/sub 進行微服務到微服務的通信,也用於某些推送通知目的。 推送通知策略如下:

每當創建訂單(即客戶創建訂單)時,后端都會在相應的渠道(隊列)中發布一個事件,特定的推送通知微服務會使用該事件(json 消息)並將推送通知發送到賣家手機。

目前我們正在使用安裝在我們 ubuntu 機器上的 redis-server,沒有任何麻煩。 但是很頭疼的是,未來某個時間點會產生幾百萬的訂單,那么我們該如何處理呢? 這意味着,我們需要擴展 Redis 隊列,對吧?

我確切的問題(無論上述情況如何)是:

如何水平擴展 Redis 隊列而不是增加同一台機器中的 RAM?

每當創建訂單(即客戶創建訂單)時,后端都會在相應的渠道(隊列)中發布一個事件,特定的推送通知微服務會使用該事件(json 消息)並將推送通知發送到賣家手機。

IIUC 您正在通過 Redis PUB/SUB 發送消息,這不是持久的,這意味着如果唯一的生產者啟動而其他服務/消費者關閉,那么消費者將錯過消息。 任何關閉的服務都將丟失在該服務關閉時發送的所有消息。

現在讓我們假設,您正在使用 Redis LIST 和其他數據結構組合來解決丟失事件問題。

縮放 Redis 隊列有點棘手,因為整個數據都存儲在一個列表中,該列表駐留在單個 Redis 機器/主機上。 你可以做的是創建你自己的分區方案並根據分區方案設計你的 Redis 鍵,就像 Redis 在集群中添加新主節點時在內部所做的那樣,創建一致的哈希需要一些努力。

非常簡單,您可以根據 userId 分配負載,例如,如果 userId 介於 0 和 1000 之間,則使用 queue_0、1000-2000 queue_1 等等。 這是一個手動過程,您可以使用一些腳本將其自動化。 每當將新隊列添加到集合中時,都必須通知所有消費者,並且發布者也將更新。

根據數量划分是范圍分區方案,您也可以使用 hash 分區方案,無論您使用范圍還是 hash 分區方案,每當將新隊列添加到隊列集中時,必須通知消費者潛在更新。 消費者可以為新隊列生成新的工作人員,刪除隊列可能很棘手,因為所有消費者都必須耗盡各自的隊列。

您可能會考慮使用Rqueue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM