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

3cc5a430a9251b3560a15e5a94f7334e.png

微服務及消息隊列簡史

自從 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?年代,基于網絡間通訊的消息隊列才誕生。

  • RabbitMQ 在 2007.07.01?發布了它的?v1.0.0 版本

  • Kafka 最初由 LinkedIn 開發,隨后于 2011 年初開源

  • Amazon?SQS 于 2004 年底進入測試階段,并于 2006 年年中正式上市

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

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

  • 同步:HTTP,如 REST、SOAP、RPC、gRPC?等

  • 異步:消息隊列,如 AMQP、Kafka、MQTT?等

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

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

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

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

消息隊列中間件

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

  • RabbitMQ

  • Apache Qpid

  • Apache Kafka

  • Apache ActiveMQ

  • Redis

  • Eclipse OpenMQ

  • JoramMQ

  • Eclipse Mosquitto

  • HiveMQ

  • Solace PubSub+

  • Google Cloud Pub/Sub

  • Amazon SQS

  • Amazon MQ

  • IBM MQ

  • Azure Event Hubs

  • Azure Service Bus

消息隊列協議矩陣

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

fddc44d495746893f44ab9a21e149afd.png

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

相似點:

  • 所有協議都有隊列的 FIFO 概念

  • 所有協議都基于 TCP

  • 所有協議都有生產者、消費者的概念

  • 所有協議都有負載(payload)與正文(body)

不同點:

  • AMQP 有不同的消息傳遞模型

  • Cloud-based 的消息隊列具有死信隊列

  • 消息檢索(routing?key)方法不同

  • Headers?和 attrs?的支持有限

  • Redis、STOMP、MQTT 的功能最不豐富,而 AMQP 的功能最豐富

  • Cloud-based 的消息隊列具有一些獨特的配置以及相關 API。

消息隊列協議詳解

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

AMQP

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

優點:

  • 針對不同的用戶場景使用不同的消息傳遞模型,在協議級別降低了架構的復雜性

  • AMQP?是?ISO?和?OASIS 標準,被廣泛采用

  • AMQP?快速、安全,可能是消息隊列協議中最成熟的

  • 可以在公有云上找到對應的云產品,并且可以在云產品和自有?RabbitMQ?間輕松切換

  • 使用 classical?隊列或 quorum?隊列進行隊列鏡像,使其易于擴展

  • RabbitMQ 的消息大小限制在版本 3.7.0 之前為 2GB,在版本 3.8.0 中減少到 128MB

缺點:

  • 不向下兼容,客戶端只實現協議的一個版本,版本之間升級遷移可能很耗時

  • 依賴 RabbitMQ?許多插件可能會面臨運維挑戰

  • 調試和監控可能存在問題

  • 雖然 AMQP??感覺像是標準化的消息隊列協議,但大多數消息隊列中間件都不支持它

Apache Kafka

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

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

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

優點:

  • Apache Kafka 的?partition 和 replication 的功能使其易于擴展

  • Apache Kafka?提供了一種批量發送小消息的方法,使得該協議非常高效

  • Apache Kafka?提供的管理 API 使調試變得很容易

缺點:

  • Apache Kafka?需要部署?ZooKeeper 和 Kafka 兩部分,對于初學者而言具有一定的挑戰性

  • Apache Kafka?協議規范不斷升級變化,客戶端可能很難跟上其變化,升級也可能具有挑戰性

  • 消息大小限制為 1MB

STOMP

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

優點:

  • 簡單,易于集成

  • 通過插件方式支持 RabbitMQ

缺點:

  • 與其他協議相比,功能和優化更少

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?納入消息中間件。

優點:

  • Redis?基于內存,速度相當快

  • 對于已經使用?Redis?的人來說,基本無學習曲線


缺點:

  • 消息沒有持久化,有丟消息的風險

  • 功能不夠豐富

  • 不適用于其他協議能解決的所有應用場景

云服務,如 AWS SQS

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

優點:

  • 方便快捷

  • 穩定,自動擴容

  • 無需個人維護

缺點:

  • 對于簡單或輕量的業務場景 ,費用可能過高

  • 客戶端兼容問題依賴云廠商解決,對某些開發語言可能兼容不好

  • 非客戶端交互模式,如 API?方式可能存在性能問題

如何選擇消息隊列

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

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

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

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

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

參考總結

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android之解決PC瀏覽器訪問手機服務端取assets目錄下的文件頁面顯示不出來問題

1 問題 我在手機里面寫了Java socket服務,然后把前端的圖片和css和js的文件放到了安卓項目的 assets目錄,然后瀏覽器訪問服務,我會把 assets目錄下的文件讀出來,然后用DataOutputStream流寫入瀏覽器,但是發現頁面顯示不出來 2 分析原因 我的代碼如下 public void sendHt…

【小白必懂】C語言回文數判斷

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我,若你是真心學習可以送你書籍,指導你學習,給予你目標方向的學習路線,無套路,博客為證。 情景再現 👸小媛:小C,今天可以教我…

Android圖片上倒計時,Android自定義照相機倒計時拍照

自定義拍照會用到SurfaceView控件顯示照片的預覽區域,以下是布局文件:兩個TextView是用來顯示提示信息和倒計時的秒數的xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height&qu…

【經典回放】多種語言系列數據結構算法:樹(C#、JavaScript、VB6版)

目 錄 一、樹的C#語言實現以及顯示 二、樹的JavaScript語言實現以及顯示 三、樹的VB6語言實現以及顯示 一、樹的C#語言實現以及顯示 1

『技術群里聊些啥』查看 dotnet 源碼,用它!用它!用它!

前言有網友在交流群中詢問,怎么找到 System.Linq 源碼的庫:其實,我一直使用http://source.dot.net查看 dotnet 源碼,這可是David Fowler(微軟 .NET 架構師)也推薦的:功能演示那它到底有哪些功能…

Android之解決PC瀏覽器上傳表單文件到手機服務器read數據錯誤導致有時候下載到手機的文件打開文字錯亂問題

1 、問題 手機客戶端app通過java socket寫了一個服務器,然后PC端通過瀏覽器訪問服務端顯示上傳頁面(這些資源都在手機端),然后其中有一個功能是PC端上傳文件到手機服務器,然后把這個文件下載到手機本地,但是我有時候PC上傳的文件打文字會錯亂。 2、http的表單文件上傳文…

javadoc注釋規范

javadoc注釋規范 javadoc做注釋 一. Java 文檔 // 注釋一行 /* ...... */ 注釋若干行 /** ...... */ 注釋若干行,并寫入 javadoc 文檔 通常這種注釋的多行寫法如下: /** * ......... * ......... */ javadoc -d 文檔存放目錄 -author -version 源文件名.…

(7)3分鐘搞定 C# 邏輯運算

本系列文章將會以通俗易懂的對話方式進行教學,對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新,包括別的語言以及實戰都將使用對話的方式進行教學,基礎編程語言教學適用于零基礎小白,之后實戰課程也將會逐步更新。 若…

【經典回放】多種語言系列數據結構算法:二叉樹(C#版)

實驗任務描述 1 用C#語言完成二叉樹的類、并構造出一個二叉樹; 2 用遞歸方法完成二叉樹的遍歷; 3 泛型的二叉樹遍歷之一、用隊列給出遍歷結果 4 泛型的二叉樹遍歷之二、委托方式給出二叉樹遍歷結果 1 二叉樹類的設計 同C語言一樣,要構建一個二叉樹,要用到類似struct的東西…

ThinkPHP講解(十二)——文本編輯器和ajax傳址

一、文本編輯器 1.首先&#xff0c;在網上下載ueditor文件 2.在要添加文本編輯器的頁面中引用ueditor文件中的js文件 <script type"text/javascript" charset"utf-8" src"../ueditor/utf8-php/ueditor.config.js"></script> <scr…

(8)小白又如何?3分鐘搞定一個 C# 知識點

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

Android之解決PC端上傳http表單格式文件手機解析文件名亂碼問題和PC瀏覽器下載文件的文件名顯示亂碼問題

1 問題 問題1、 手機寫socket作為服務器,PC瀏覽器上傳http表單格式文件,然后手機端解析攜帶中文的文件名我解析是亂碼。 問題2、 手機寫了socket作為服務器,PC瀏覽器下載文件,但是瀏覽器里面的文件名有中文的時候會有亂碼。 2 分析 問題1分析 User-Agent: PostmanRun…

華為鴻蒙vogtloop30pro價格,華為Mate30系列基本確認:首發麒麟985+鴻蒙系統,價格感人!...

原標題&#xff1a;華為Mate30系列基本確認&#xff1a;首發麒麟985鴻蒙系統&#xff0c;價格感人&#xff01;轉眼間即將步入6月份&#xff0c;近期關于各大廠商下半年的新機消息也是多了起來&#xff0c;就拿華為下半年的高端旗艦華為Mate30系列來說&#xff0c;在各方媒體的…

[不一樣的依賴注入]容器與服務周期的結合

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.Net日常開發技巧&#xff0c;如需源碼請后臺留言 源碼;如果覺得本公眾號對您有幫助&#xff0c;歡迎關注前文回顧[不一樣的依賴注入]通過遞歸實現容器里依賴注入不一樣的依賴注入 創建周期的加入首先創建一個依賴提供類&#…

(11)python里面while到底有多少知識點

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【經典回放】多種語言系列數據結構算法:二叉樹(JavaScript版)

1 二叉樹類的設計以及二叉樹遍歷 要完成二叉樹的類設計&#xff0c;最好把鏈表下的Node.js復制過來&#xff0c;相比鏈表的結點&#xff0c;二叉樹僅僅是多了一個結點指針而已。略加修改后&#xff0c;就是&#xff1a; function TNODE(DATA) { this.DataDATA; this.lChildnu…

Fiddler之解決https鏈接返回數據顯示亂碼問題

1 、問題 我網頁訪問淘寶&#xff0c;然后F12查看關鍵鏈接&#xff0c;返回的數據里面有json各式的數據&#xff0c;然后我通過關鍵字在Fiddler里面找到鏈接&#xff0c;然后查看返回的內容是亂碼。 2 、解決辦法 然后這樣設置&#xff0c;再去查看SyntaxView或者Raw都可以看到…

android上傳圖片被旋轉,input上傳照片旋轉解決辦法

需求很簡單&#xff1a;h5拍照上傳照片&#xff0c;然后顯示出來問題在&#xff1a;上傳之后的圖片在PC&#xff0c;IOS端均能正常顯示&#xff0c;Android端顯示的則是被旋轉90度的。直接上代碼下面這個方法傳入file對象&#xff0c;然后會去除掉照片中的exIf信息&#xff0c;…

(12)python 的列表我從沒想過會那么好用

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

如何優雅的跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 資源對象是命名空間級別的。它們只能被同一命名空間中的 Pod 引用。所以有時候不得不手動為每個命名空間創建它們。但有很多場景&#xff0c;我們想讓它們是全局的&#xff0c;至少可以是跨命名空間共享的 Secret 和 ConfigMap&#xff0c;例如這些場景&am…