如何爲微服務選擇正確的消息隊列

微服務及消息隊列簡史

自從 Peter Rodgers 博士 2005 年在 Web Services Edge 會議上首次提出 Micro-Web-Services 一詞後,IT 行業慢慢地從單體架構轉向了微服務。

2009 年,Netflix 決定把其單體架構拆分爲微服務。

2010 年,Best Buy 開始把它們的單體架構轉變爲微服務架構。

2011 年,eBay 開始推行微服務。

2001 年,當時 Amazon 的零售網站還是個巨大的單體架構。

Rob Brigham 在 Amazon 的 re:Invent 2015 會議上提出了微服務改造建議:

今天,服務端基本都遵循微服務架構設計模式。然而,基於消息隊列的進程間或線程間通信可以追溯到 20 世紀 80 年代初,當時使用的是 UNIX 的 V API 或其它實時操作系統內核。直到 2000 年代,基於網絡間通訊的消息隊列才誕生。

使用同步通訊還是異步通訊

選擇了微服務架構,就面臨着選擇服務間的通訊協議:

同步通訊更容易出錯,更難調試,也更難恢復。如果不是實時性要求特別強的功能,可以考慮異步通訊。

異步通訊提供了單一、可靠的消息總線,使得調試更容易,更不容易出錯,服務間數據傳遞更可靠也更安全。

也就是說,除非存在使用較舊編程語言的遺留服務,或者無法改造的舊基礎架構,雲原生時代更建議選擇異步通訊。

選擇了使用異步方法,就需要決定使用什麼消息隊列中間件和消息隊列協議。

消息隊列中間件

以下是截至 2021 年比較著名的消息隊列中間件以及雲服務列表:

消息隊列協議矩陣

以下是消息隊列協議比較矩陣:

注意:Headers 表示具有任意數量鍵的 dictionary 或 map,而 attrs 表示一組有限的鍵值對。

相似點:

不同點:

消息隊列協議詳解

消息隊列協議的選擇實際上比消息隊列中間件的選擇更重要。因爲如果選擇一個更通用的協議,就更容易找到其他中間件作爲替代。

AMQP

AMQP - Advanced Message Queue Protocol 是一種基於 TCP 的二進制協議,已成爲 ISO 和 OASIS 的標準,AMQP 協議主要由 RabbitMQ 使用。

優點:

缺點:

Apache Kafka

Apche Kafka 既是消息隊列中間件的名稱,也是協議本身。截至 2021,該協議共有 12 個版本,客戶端可同時兼容所有版本。

Apche Kafka 是一個由 Apache 軟件基金會開發和維護的項目,用 Scala 和 Java 編寫。

Apache Kafka 團隊選擇定義自己的協議,而不是採用 AMQP 或 STOMP。是因爲他們認爲協議決定了實現,因此,採用已有的協議會降低了他們創建分佈式消息中間件以及進行某些優化的自由度。

優點:

缺點:

STOMP

STOMP - Streaming Text Oriented Messaging Protocol 是一種基於文本的協議,與 AMQP 非常相似。但它缺乏其他協議所具有的許多功能和優化。另一方面,STOMP 的簡單性使其更易於採用。因此,有許多客戶端支持該協議,RabbitMQ 也可以通過插件支持 STOMP。對於一些簡單的用例或快速原型,可以考慮使用 STOMP‍。

優點:

缺點:

MQTT

MQTT - Message Queuing Telemetry Transport 是物聯網(IoT)的消息隊列協議,它是 ISO 和 OASIS 標準,當前支持 MQTT 的最著名的中間件是 Eclipse Mosquitto 和 HiveMQ。

優點:

缺點:

Redis

RESP - Redis Serialization Protocol 是 Redis 的協議。Redis 是一個基於內存的 Key-Value 數據庫。從技術上講,Redis 不是一個消息隊列中間件,但通過一些客戶端手段,Redis 可以用於異步消息通訊。這主要是那些喜歡使用 Redis 的開發者或者一些簡單場景採用的手段,因此,也把 Redis 納入消息中間件。

優點:

缺點:

雲服務,如 AWS SQS

如果不想自己維護基礎設施,並需要自動擴容,或者本身就在公有云上,此時,可以考慮直接使用雲服務。

優點:

缺點:

如何選擇消息隊列

總之,一般情況下使用 AMQP - RabbitMQ 或 Kafka,對消息可靠性要求較高時考慮 RabbitMQ,否則選擇 Kafka。

請勿採用 STOMP,因爲它沒有被很好的兼容,而且沒有很好的優化。

如果您在從事物聯網業務,那麼請使用 MQTT,它適合物聯網。

如果您喜歡 Redis,並且無法添加其它新技術,那麼可以繼續使用 Redis,但需要接受 Redis 在消息隊列中的缺點。

如果您本身就在使用公有云,具備一定的用戶或業務體量,對消息隊列有穩定性及自動擴容的要求,並且能接受其費用,那麼,選擇雲服務提供的消息隊列。

參考總結

以上就是本文希望分享的內容,如果大家有什麼問題,歡迎在公衆號 - 跬步之巔留言交流。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/B0Q5AspxdyS-IaRD-SPibA