RabbitMQ 與 Redis 之間有何差異?
RabbitMQ 是訊息代理程式,而遠端字典伺服器 (Redis) 則為記憶體內鍵值資料儲存空間。不過,您可以比較這兩種技術,因為您可以同時使用兩者來建立發佈 – 訂閱 (pub/sub) 訊息簡訊系統。在現代的雲端架構中,應用程式會分離成許多較小的獨立建置區塊,這些區塊稱為服務。發佈/訂閱簡訊為這些分散式系統提供即時事件通知。RabbitMQ 是一種分散式訊息代理程式,可收集來自多個來源的串流資料,並且將資料路由到不同的目的地進行處理。Redis 支援推送式系統,系統中發布者會在事件發生時,將訊息分發給所有訂閱者。
運作方式:RabbitMQ 與Redis
RabbitMQ 和 Redis 都允許應用程式、微型服務和軟體元件件以不同的方式交換訊息。
RabbitMQ 工作流程
RabbitMQ 使用進階訊息佇列通訊協定 (AMQP),透過訊息代理程式安全地傳送訊息。訊息代理程式由交換和佇列組成。程序如下:
- 資料生產者將訊息傳送至 RabbitMQ
- 交換接收資料並依據一組稱為繫結的規則將其路由到相應的佇列
- 該訊息駐留在佇列中,直到 RabbitMQ 取用者提取
當佇列達到最大容量時,RabbitMQ 會阻止生產者發佈訊息,直到取用者處理未讀訊息為止。如果在取用者讀取之前交換失敗,RabbitMQ 還可以恢復訊息。
Redis 工作流程
Redis 設計為支援各種資料結構的資料結構伺服器,如清單、集、雜湊和點陣圖。藉助 Redis,用戶端應用程式可儲存、擷取和處理幾乎任何資料類型。Redis 以索引鍵值對組織儲存的資料,這為訂閱用戶端應用程式提供了結構化的安排。
例如,可以將電子商務資料分成客戶名稱、電子郵件、購買的商品和意見反應索引鍵。在此之後,可以發佈每個索引鍵的相關資料。
Redis 能夠即時交換短暫保留訊息。其運作方式如下:
- 資料生產者將訊息傳送至 Redis
- Redis 的節點檢查訊息索引鍵,以辨識感興趣的訂閱者
- Redis 將訊息傳遞給所有連線的訂閱者
訊息處理:RabbitMQ 與Redis 發佈/訂閱
Redis 和 RabbitMQ 均提供發佈-訂閱 (pub/sub) 機制,供應用程式在雲端環境中分佈訊息。但是,兩者採用不同的方式處理訊息。
訊息傳遞
RabbitMQ 使用進階訊息佇列通訊協定 (AMQP) 來支援複雜的路由邏輯。它可以將點對點傳遞訊息,或者從一個生產者傳遞給許多取用者。無論採用何種方法,所有取用者都會傳送訊息確認給生產者,以確認成功讀取訊息。如果生產者沒有收到確認,它會以不同的間隔進行多次重試。
與此同時,Redis 只是將訊息推送給所有連線的訂閱者;它不能保證訊息傳遞。訂閱者必須連線至 Redis 伺服器,才能接收傳入的訊息。如果 Redis 斷開連線,則可能無法擷取所有訊息。
訊息大小
RabbitMQ 可以傳遞更大的訊息,而不會產生效能大幅下降。它最初設計用於處理大小達 2GB 的資訊,但後來限制減少至 128MB。
相反,Redis 不會為儲存的訊息定義限制,但在處理大於 1MB 的訊息時會產生明顯的延遲。因此,開發人員通常使用 Redis 作為快取來處理資料集,例如字串、雜湊、清單和集。
訊息持久性
RabbitMQ 支援持久性訊息和暫時性訊息。將訊息傳送至持久性佇列時,RabbitMQ 會在資料到達時立即將其寫入持久性儲存。RabbitMQ 也會將暫時性訊息寫入磁碟,但前提是這些訊息超出記憶體的容量。
另一方面,Redis 預設不支援持久性訊息。開發人員必須啟用名為 Redis 資料庫 (RDB) 的功能,才能定期擷取 RAM 的快照並將其儲存在磁碟上。在 Redis 上啟用資料持久性會增加資料操作的開銷,進而降低訊息傳遞速度。另一種替代方法是使用復原技術,例如非同步複寫。
訊息加密
RabbitMQ 使用 SSL 加密生產者、代理程式和取用者之間傳輸的資料。加密訊息可協助組織保護機密資訊並降低資料風險。
與此同時,Redis 原生不支援 SSL。只有 Redis 6.0 版及更新版本提供 SSL 支援。若要啟用 SSL,開發人員必須從 Redis 叢集取得 SSL 憑證,並為其資料庫建立用戶端憑證。
效能:RabbitMQ 與Redis 發佈/訂閱
訊息處理差異會影響 RabbitMQ 和 Redis 在不同情況下的效能。
速度
Redis 的執行速度比 RabbitMQ 快得多,因為它主要在記憶體上處理訊息。然而,如果 Redis 伺服器失敗,就存在遺失未讀取訊息的風險。
相較之下,在持久模式下操作時,RabbitMQ 會等待每個取用者的確認,然後再傳送下一條訊息。RabbitMQ 還需要額外的時間來將訊息儲存在磁碟上,這會降低平均訊息交換速度。
作為比較,Redis 每秒最多可以傳送數千萬條訊息,而 RabbitMQ 每秒最多可以處理數萬條訊息。
可用性
叢集 (可讓訊息代理程式系統複寫節點) 在 RabbitMQ 和 Redis 中的處理方式有所區別。
使用 RabbitMQ,將在叢集中複寫包含相關資料和函數的多個節點。然而,訊息佇列不會跨這些共享對等關係的節點複寫。為此,開發人員使用支援複寫的特殊訊息佇列。
與此同時,Redis 叢集是在 Redis 更高版本中引入的功能。叢集將資料從每個領導人節點複寫到一個或多個追隨者節點。領導人節點發生故障時,追隨者節點會接管以提供高可用性訊息傳遞。
使用時機:RabbitMQ 與Redis 發佈/訂閱
RabbitMQ 在許多領域都優於 Redis,但這並不意味著 RabbitMQ 是面向所有應用程式的更出色訊息分佈系統。
Redis 在需要即時資料處理和低延遲快取的企業應用程式中效果更佳。憑藉其記憶體內資料儲存和對多種資料結構的支援,Redis 非常適合執行低階資料運算。例如,金融機構使用 Redis 快取交易資料,以啟用即時詐騙偵測。
與此同時,如果需要具有非同步通訊機制的專用微型服務訊息代理程式以支援程式碼和系統建置,請選擇 RabbitMQ。RabbitMQ 也比 Redis 更適合在應用程式之間傳輸大型檔案。例如,需要在許多微型服務之間可靠地傳送資料的系統可能會選擇 RabbitMQ。該系統將受益於 RabbitMQ 的容錯能力、更大的檔案處理容量以及有保證的訊息傳遞機制。
差異摘要:RabbitMQ 與Redis 發佈/訂閱
RabbitMQ |
Redis |
|
訊息交付 |
保證訊息傳遞。支援複雜的邏輯。 |
不保證訊息傳遞。需要來自訂閱者的作用中連線。 |
訊息大小 |
訊息大小限制在 128MB 以內。可以處理大型訊息。 |
無訊息限制,但是處理大型訊息 (大於 1 MB) 時效能會降低。 |
訊息持久性 |
支援持久性和暫時性訊息。將持久性訊息寫入磁碟。 |
預設不支援持久性訊息。 |
訊息加密 |
支援 SSL 加密。 |
SSL 加密適用於 Redis 6.0 版及以上版本。 |
速度 |
每秒最多傳送數萬條訊息。 |
每秒最多傳送數百萬條訊息。 |
可用性 |
在叢集中建立多個對等節點。 |
在叢集中使用領導人-追隨者模型。 |
AWS 如何協助滿足您的 RabbitMQ 和 Redis 要求?
Amazon Web Services (AWS) 提供受管服務,以大規模執行您的開放原始碼訊息代理程式系統。可以輕鬆設定發佈-訂閱 (pub/sub) 服務,並將它們與其他 AWS 服務整合。
以下是您可以搭配 Redis 和 RabbitMQ 使用的 AWS 產品:
- 使用 Amazon MemoryDB,您可以在 Redis 上傳送訊息時提升耐久性。可以執行高併發串流資料摘要以擷取使用者活動並支援每天數百萬個媒體和娛樂應用程式的請求。
- 使用 Amazon MQ 可佈建 RabbitMQ 代理程式,無需耗時的設定。Amazon MQ 會加密傳輸中和靜態的 RabbitMQ 訊息,以協助確保跨 AWS 可用區域的高可用性資料管道。
還可以使用 Amazon Simple Notification Service (SNS) 來建置發佈/訂閱簡訊系統,而不是採用 Redis 或 RabbitMQ。可以採用可擴展且經濟高效的方式直接從應用程式向客戶或其他應用程式傳送訊息。
Amazon SNS 提供以下功能:
- 分散式系統之間、微型服務之間、事件驅動型無伺服器應用程式之間的高輸送量、推送型、多對多簡訊
- 訊息加密和流量隱私
- 跨 AWS 類別散發功能,例如分析、運算、容器、資料庫、物聯網 (IoT)、機器學習、安全和儲存
立即建立帳戶,開始使用 AWS 上的發佈/訂閱、Redis 和 RabbitMQ。