微服務訊息代理比較:Redis vs Kafka vs RabbitMQ - Mertcan
對微服務使用非同步通訊時,通常使用訊息代理。代理確保不同微服務之間的通訊可靠且穩定,訊息在系統內得到管理和監控,並且訊息不會丟失。您可以選擇一些訊息代理,它們的規模和資料功能各不相同。這篇博文將比較三種最受歡迎的代理:RabbitMQ、Kafka 和 Redis。
微服務之間有兩種常見的通訊方式:同步和非同步。在同步通訊中,呼叫者在傳送下一條訊息之前等待響應,它作為 HTTP 之上的 REST 協議執行(遠端呼叫的容錯模式)。相反,在非同步通訊中,無需等待響應即可傳送訊息。這適用於分散式系統,並且通常需要訊息代理來管理訊息。
您選擇的通訊型別應考慮不同的引數,例如您如何構建微服務、您擁有的基礎設施、延遲、規模、依賴關係和通訊目的。非同步通訊的建立可能更復雜,需要向堆疊新增更多元件,但對微服務使用非同步通訊的優點大於缺點。
非同步通訊優勢
首先,非同步通訊根據定義是非阻塞的。它還支援比同步操作更好的擴充套件。第三,在微服務崩潰的情況下,非同步通訊機制提供了各種恢復技術,並且通常更擅長處理與崩潰有關的錯誤。此外,當使用代理而不是 REST 協議時,接收通訊的服務實際上不需要相互瞭解。甚至可以在舊服務執行很長時間後引入新服務,即更好的解耦服務。
最後,在選擇非同步操作時,您可以提高未來建立中央發現、監控、負載平衡甚至策略執行器的能力。這將為您的程式碼和系統構建提供靈活性、可擴充套件性和更多功能。
非同步通訊通常透過訊息代理進行管理。。在選擇代理來執行非同步操作時,您應該考慮以下幾點:
- Broker Scale — 系統中每秒傳送的訊息數。
- 資料永續性——恢復訊息的能力。
- 消費者能力——經紀人是否能夠管理一對一和/或一對多的消費者。
RabbitMQ (AMQP)
規模:基於配置和資源,這裡的大概是每秒 50K msg。
永續性:支援永續性和瞬態訊息。
一對一與一對多消費者:兩者兼而有之。RabbitMQ 於 2007 年釋出,是最早建立的通用訊息代理之一。它是一個開源軟體,透過實現高階訊息佇列協議 (AMQP),透過點對點和釋出-訂閱方法傳遞訊息。它旨在支援複雜的路由邏輯。
有一些託管服務允許您將其用作 SaaS,但它不是本機主要雲提供商堆疊的一部分。RabbitMQ 支援所有主要語言,包括 Python、Java、.NET、PHP、Ruby、JavaScript、Go、Swift 等。
在持久模式下會出現一些效能問題。
Kafka
規模:每秒最多可以傳送數百萬條訊息。
永續性:是的。
一對一vs一對多消費者:只有一對多(乍一看似乎很奇怪,對吧?!)。
Kafka 由 Linkedin 於 2011 年建立,用於處理高吞吐量、低延遲的處理。作為分散式流媒體平臺,Kafka 複製了釋出訂閱服務。它提供資料永續性並儲存記錄流,使其能夠交換質量訊息。
Kafka 在 Azure、AWS 和 Confluent 上管理了 SaaS。他們都是Kafka專案的創造者和主要貢獻者。Kafka 支援所有主要語言,包括 Python、Java、C/C++、Clojure、.NET、PHP、Ruby、JavaScript、Go、Swift 等。
Redis
規模:每秒最多可以傳送一百萬條訊息。
永續性:基本上,沒有——它是一個記憶體中的資料儲存。
一對一與一對多消費者:兩者兼而有之。
Redis 與其他訊息代理略有不同。從本質上講,Redis 是一種記憶體中資料儲存,可用作高效能鍵值儲存或訊息代理。另一個區別是 Redis 沒有永續性,而是將其記憶體轉儲到磁碟/資料庫中。它也非常適合實時資料處理。
最初,Redis 不是一對一和一對多的。然而,自從 Redis 5.0 引入了 pub-sub,功能得到了提升,一對多成為了一個真正的選擇。
針對每個用例的訊息代理
我們介紹了 RabbitMQ、Kafka 和 Redis 的一些特性。這三者都是同類中的野獸,但正如所描述的,它們的運作方式大不相同。以下是我們針對不同用例使用的正確訊息代理的建議。
- 短命訊息:Redis
Redis 的記憶體資料庫幾乎非常適合具有不需要永續性的短期訊息的用例。因為它提供極快的服務和記憶體功能,Redis 是短保留訊息的完美候選者,在這種情況下,永續性不是那麼重要,您可以容忍一些損失。隨著 5.0 中 Redis 流的釋出,它也是一對多用例的候選者,由於限制和舊的 pub-sub 功能,這是絕對需要的。
- 海量資料:Kafka
Kafka 是一個高吞吐量的分散式佇列,專為長時間儲存大量資料而構建。Kafka 非常適合需要永續性的一對多用例。
- 複雜路由:RabbitMQ
RabbitMQ 是一個較舊但成熟的代理,具有許多支援複雜路由的特性和功能。當要求的速率不高(超過幾萬條訊息/秒)時,它甚至會支援複雜的路由通訊。
相關文章
- 微服務選擇哪個訊息代理:RabbitMQ、Kafka和Redis? - Payoda微服務MQKafkaRedis
- Redis、Kafka或RabbitMQ:選擇哪個作為微服務訊息代理? - otonomoRedisKafkaMQ微服務
- 訊息中介軟體(RabbitMq、Kafka)分析比較MQKafka
- 訊息中介軟體部署及比較:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redisMQKafkaRedis
- Redis vs. MongoDB比較RedisMongoDB
- 模組化與微服務比較 MircoService VS OSGI微服務
- 庫 vs 服務 vs 側車Sidecar的比較IDE
- iOS:原生應用 VS Flutter VS GICXMLLayout 比較iOSFlutterXML
- Debezium vs OGG vs Tapdata:如何實時同步 Oracle 資料到 Kafka 訊息佇列?OracleKafka佇列
- 【譯】Flutter vs React Native vs Native:深度效能比較FlutterReact Native
- 測試速度比較:Selenium vs Playwright vs Cypress vs Puppeteer vs TestCafe
- *nix程式 vs 微服務微服務
- Jenkins vs Kubernetes:比較 DevOps 工具Jenkinsdev
- Python的List vs Tuple比較Python
- RabbitMQ,RocketMQ,Kafka 幾種訊息佇列的對比MQKafka佇列
- 微服務02 Kafka訊息佇列, Dubbo, Springcloud微服務框架, Nacos微服務Kafka佇列SpringGCCloud框架
- DNS 解析器效能比較:CloudFlare vs Google vs Quad9DNSCloudGo
- 訊息驅動式微服務:Spring Cloud Stream & RabbitMQ微服務SpringCloudMQ
- Pulsar VS. Kafka(1): 統一的訊息消費模型(Queue + Stream)Kafka模型
- 大資料檔案格式比較:AVRO vs. PARQUET vs. ORC大資料VR
- 【譯】Css Grid VS Flexbox: 實踐比較CSSFlex
- Java微服務 vs Go微服務,究竟誰更強!?Java微服務Go
- RabbitMQ,RocketMQ,Kafka 訊息模型對比分析MQKafka模型
- 事件流平臺Kafka、Pulsar和RabbitMQ比較 - Picnic事件KafkaMQ
- 從消費者角度比較Kafka 與 RabbitMQ - OpenCredoKafkaMQ
- Rust的Vector vs. Golang的Slice比較RustGolang
- Spring Boot Native vs Go:效能比較 – Ignacio SuaySpring BootGo
- 微服務架構:Dubbo VS Spring Cloud微服務架構SpringCloud
- RabbitMQ,RocketMQ,Kafka 事務性,訊息丟失和訊息重複傳送的處理策略MQKafka
- 共識演算法的比較:Casper vs Tendermint演算法
- MQ 訊息佇列 比較MQ佇列
- Go 微服務:基於 RabbitMQ 和 AMQP 進行訊息傳遞Go微服務MQ
- Tomcat vs Jetty vs Undertow效能對比TomcatJetty
- JAVA中生成隨機數Random VS ThreadLocalRandom效能比較Java隨機randomthread
- 訊息中介軟體選型分析:從Kafka與RabbitMQ的對比看全域性KafkaMQ
- 微服務中GraphQL與RESTful比較微服務REST
- Go vs Java vs C# 語法對比GoJavaC#
- 資料關係比較:相關性 vs 因果關係