Java消息隊列總結只需一篇解決ActiveMQ、RabbitMQ、ZeroMQ、Kafka

?

一、消息隊列概述

消息隊列中間件是分布式系統中重要的組件,主要解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。目前使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

?

?

二、消息隊列應用場景

以下介紹消息隊列在實際應用中常用的使用場景。異步處理,應用解耦,流量削鋒和消息通訊四個場景。

?

?

2.1異步處理

場景說明:用戶注冊后,需要發注冊郵件和注冊短信。傳統的做法有兩種 1.串行的方式;2.并行方式
a、串行方式:將注冊信息寫入數據庫成功后,發送注冊郵件,再發送注冊短信。以上三個任務全部完成后,返回給客戶端。

?


b、并行方式:將注冊信息寫入數據庫成功后,發送注冊郵件的同時,發送注冊短信。以上三個任務完成后,返回給客戶端。與串行的差別是,并行的方式可以提高處理的時間


假設三個業務節點每個使用50毫秒鐘,不考慮網絡等其他開銷,則串行方式的時間是150毫秒,并行的時間可能是100毫秒。
因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串行方式1秒內CPU可處理的請求量是7次(1000/150)。并行方式處理的請求量是10次(1000/100)
小結:如以上案例描述,傳統的方式系統的性能(并發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?

引入消息隊列,將不是必須的業務邏輯,異步處理。改造后的架構如下:



按照以上約定,用戶的響應時間相當于是注冊信息寫入數據庫的時間,也就是50毫秒。注冊郵件,發送短信寫入消息隊列后,直接返回,因此寫入消息隊列的速度很快,基本可以忽略,因此用戶的響應時間可能是50毫秒。因此架構改變后,系統的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了兩倍。

?

2.2應用解耦

場景說明:用戶下單后,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口。如下圖:

?



傳統模式的缺點:假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗,訂單系統與庫存系統耦合

如何解決以上問題呢?引入應用消息隊列后的方案,如下圖:



訂單系統:用戶下單后,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功
庫存系統:訂閱下單的消息,采用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作
假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單后,訂單系統寫入消息隊列就不再關心其他的后續操作了。實現訂單系統與庫存系統的應用解耦

?

2.3流量削鋒

流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛。
應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入消息隊列。

?


a、可以控制活動的人數


b、可以緩解短時間內高流量壓垮應用



用戶的請求,服務器接收后,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面。
秒殺業務根據消息隊列中的請求信息,再做后續處理

?

2.4日志處理

日志處理是指將消息隊列用在日志處理中,比如Kafka的應用,解決大量日志傳輸的問題。架構簡化如下

?



日志采集客戶端,負責日志數據采集,定時寫受寫入Kafka隊列
Kafka消息隊列,負責日志數據的接收,存儲和轉發
日志處理應用:訂閱并消費kafka隊列中的日志數據

?

2.5消息通訊

消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等

?


點對點通訊:


客戶端A和客戶端B使用同一隊列,進行消息通訊。

?

聊天室通訊:


客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發布和接收。實現類似聊天室效果。

以上實際是消息隊列的兩種消息模式,點對點或發布訂閱模式。模型為示意圖,供參考。

?

?

三、消息中間件示例

3.1電商系統

?


消息隊列采用高可用,可持久化的消息中間件。比如Active MQ,Rabbit MQ,Rocket Mq。


(1)應用將主干邏輯處理完成后,寫入消息隊列。消息發送是否成功可以開啟消息的確認模式。(消息隊列返回消息接收成功狀態后,應用再返回,這樣保障消息的完整性)


(2)擴展流程(發短信,配送處理)訂閱隊列消息。采用推或拉的方式獲取消息并處理。


(3)消息將應用解耦的同時,帶來了數據一致性問題,可以采用最終一致性方式解決。比如主數據寫入數據庫,擴展應用根據消息隊列,并結合數據庫方式實現基于消息隊列的后續處理。

?

?

3.2日志收集系統

?


分為Zookeeper注冊中心,日志收集客戶端,Kafka集群和Storm集群(OtherApp)四部分組成。
Zookeeper注冊中心,提出負載均衡和地址查×××
日志收集客戶端,用于采集應用系統的日志,并將數據推送到kafka隊列
Kafka集群:接收,路由,存儲,轉發等消息處理
Storm集群:與OtherApp處于同一級別,采用拉的方式消費隊列中的數據

?

?

?

MQ選型對比文檔


綜合選擇RabbitMq

?

?

Kafka是linkedin開源的MQ系統,主要特點是基于Pull的模式來處理消息消費,追求高吞吐量,一開始的目的就是用于日志收集和傳輸,0.8開始支持復制,不支持事務,適合產生大量數據的互聯網服務的數據收集業務。

RabbitMQ是使用Erlang語言開發的開源消息隊列系統,基于AMQP協議來實現。AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。AMQP協議更多用在企業系統內,對數據一致性、穩定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

RocketMQ是阿里開源的消息中間件,它是純Java開發,具有高吞吐量、高可用性、適合大規模分布式系統應用的特點。RocketMQ思路起源于Kafka,但并不是Kafka的一個Copy,它對消息的可靠傳輸及事務性做了優化,目前在阿里集團被廣泛應用于交易、充值、流計算、消息推送、日志流式處理、binglog分發等場景。

?

ZeroMQ只是一個網絡編程的Pattern庫,將常見的網絡請求形式(分組管理,鏈接管理,發布訂閱等)模式化、組件化,簡而言之socket之上、MQ之下。對于MQ來說,網絡傳輸只是它的一部分,更多需要處理的是消息存儲、路由、Broker服務發現和查找、事務、消費模式(ack、重投等)、集群服務等。
?

?

RabbitMQ/Kafka/ZeroMQ 都能提供消息隊列服務,但有很大的區別。
在面向服務架構中通過消息代理(比如 RabbitMQ / Kafka等),使用生產者-消費者模式在服務間進行異步通信是一種比較好的思想。
因為服務間依賴由強耦合變成了松耦合。消息代理都會提供持久化機制,在消費者負載高或者掉線的情況下會把消息保存起來,不會丟失。就是說生產者和消費者不需要同時在線,這是傳統的請求-應答模式比較難做到的,需要一個中間件來專門做這件事。其次消息代理可以根據消息本身做簡單的路由策略,消費者可以根據這個來做負載均衡,業務分離等。
缺點也有,就是需要額外搭建消息代理集群(但優點是大于缺點的 ) 。
ZeroMQ 和 RabbitMQ/Kafka 不同,它只是一個異步消息庫,在套接字的基礎上提供了類似于消息代理的機制。使用 ZeroMQ 的話,需要對自己的業務代碼進行改造,不利于服務解耦。
RabbitMQ 支持 AMQP(二進制),STOMP(文本),MQTT(二進制),HTTP(里面包裝其他協議)等協議。Kafka 使用自己的協議。
Kafka 自身服務和消費者都需要依賴 Zookeeper。
RabbitMQ 在有大量消息堆積的情況下性能會下降,Kafka不會。畢竟AMQP設計的初衷不是用來持久化海量消息的,而Kafka一開始是用來處理海量日志的。
總的來說,RabbitMQ 和 Kafka 都是十分優秀的分布式的消息代理服務,只要合理部署,不作,基本上可以滿足生產條件下的任何需求。

喜歡的點點贊,

給大家推薦一個程序員學習交流一群:468947140 (估計已滿); 二群:878249276。群里有分享的視頻,還有思維導圖
群公告有視頻,都是干貨的,你可以下載來看。主要分享分布式架構、高可擴展、高性能、高并發、性能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式項目實戰學習架構師視頻。

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

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

相關文章

一種快速統計SQL Server每個表行數的方法

我們都知道用聚合函數count()可以統計表的行數。如果需要統計數據庫每個表各自的行數(DBA可能有這種需求),用count()函數就必須為每個表生成一個動態SQL語句并執行,才能得到結果。以前在互聯網上看到有一種很好的解決方法,忘記出處了&#xf…

android 小黃車首頁,android采用MVP漫畫APP、適配劉海屏、小黃車主界面、錄音波浪動畫、綜合APP等源碼...

Android精選源碼Android優質博客為什么組件化 隨著移動互聯網的發展,或許中小型項目還可以用單工程MVC/MVP/MVVM的架構來完成,但當項目到了一定程度之后,編譯時間 原來越長,測試或者開發任何一個模塊功能都需要整個項目重啟運行。…

[HEOI2012]采花

題目描述 蕭薰兒是古國的公主,平時的一大愛好是采花。 今天天氣晴朗,陽光明媚,公主清晨便去了皇宮中新建的花園采花。 花園足夠大,容納了n朵花,花有c種顏色(用整數1-c表示),且花是排…

修改SQL server數據庫中的邏輯文件名

使用 FILE_NAME 函數可以返回給定文件標識 (ID) 號的邏輯文件名如下 下例返回 file_ID 為 1 的文件名(master 數據庫文件)。 1USEmaster2SELECTFILE_NAME(1)當我們進行從一個備份中還原數據庫時,數據庫的邏輯文件名是不會改變的。 可用 ALTER…

java根據模板生成PDF

首先你的制作一個pdf模板: 1.先用word做出模板界面 畫單元格的時候需要考慮值的長度,像這里的狀態可能會很長 2.文件另存為pdf格式文件 使用福昕PDF 打開,添加文本,以及需要添加值的地方,設置文本域,這個就…

android bilibili搜索框,仿bilibili搜索框效果(三句代碼實現)

SearchDialog仿bilibili搜索框效果(只需要三句話即可實現)先看預覽圖(轉換后有一點點失真):前言1,支持搜索歷史(已經做了數據庫存儲了)2,基本與bilibili的搜索效果差不多了3,需要修改更多內容可以下載library自己修改4,本人非大牛,有不妥之處請Issues指出,謝謝5,參考了該po的文…

元璟資本陳洪亮解析人貨場融合 消費者變成“合作者”

一年一度的云棲大會是新科技大放異彩的舞臺,而創業者們同樣聚集于此,探討前沿的商業模式。 在今日舉行的“云棲大會 - 阿里云創新中心年度盛典”上,元璟資本合伙人陳洪亮發表演講,他從新消費和新零售的諸多創新現象出發&#xff0…

通用數據庫顯示程序

數據庫顯示程序,能調任意庫,任意字段,多關鍵字搜索,自動分頁. 阿余經常寫一些數據庫相關的程序,當然離不開顯示庫中的數據了,說實話,做這樣的程序真是無聊啊,所以,阿余就想寫個函數,一個通用的數據庫顯示函數.要求如下: 1. 能顯示指定的字段,當然,字段名和顯示的文字可以不一樣…

2019.8.13 sdfzoier

lxy: lixf acwing上的118,126 zhangtingyu zhaosirui wujialin 轉載于:https://www.cnblogs.com/caterpillor/p/11186047.html

鴻蒙 電視盒子,目前最強的電視盒子:性價比最高的5款電視盒子

電視盒子作為目前人們滿足精神生活的一個電子產品,產品的質量自然是要有很高的保證,并且要有較好的使用體驗,在產品價格上也要讓消費者感到實惠,以上這些要求也是我們所說的性價比,性價比最高的盒子,也足以…

CDH-5.7.0:基于Parcels方式離線安裝配置

http://shiyanjun.cn/archives/1728.html https://www.waitig.com/cdh%E5%AE%89%E8%A3%85.html

From 7.8 To 7.14

From 7.8 To 7.14 大綱 學科 英語的話每天早上背單詞, 爭取每天做一篇完型, 一篇閱讀, 一篇短文填空, 一篇改錯, 一篇七選五??? 似乎太多了, 先試一下吧 語文的話, 嘗試翻譯一下文言文??? 理科先不管他 競賽 考試, 題解, 做題, 恩, 應該差不多吧 7.12 考試, 改題... 今天…

html郵箱地址的正則表達式,javascript寫一個校驗郵箱的正則表達式

test判斷字符串是否符合正則的要求注意注意:字符串有一部分符合要求,test就會判斷為真。這個時候我們可以加一個行首(^)行尾($)來控制分析我們根據常用郵箱寫一個中文的校驗規則如下:我們常用的郵箱格式:yancamy126.comyan233__qq…

系統需求分析文檔需要考慮的問題

最近作了幾次需求分析,有了一些經驗,特共享出來.歡迎指正.我認為在系統需求分析中,有三個問題需要注意,即系統涵蓋范圍用戶對上線時間的要求系統上線對目前系統整體的影響系統覆蓋的范圍很多用戶都想的是,這次一定要把所有遇到的問題解決完. 也就說,客戶潛在的心理是對系統較高…

洛谷 P1414 又是畢業季II (多個數的最大公因數)

這道題其實不難,但是我想復雜了 我想的是把每個數質因數分解,然后每次就枚舉每個質因數 來求最小公倍數。 然后想了想這樣復雜度將會非常的大,肯定超時 然后看了題解發現不需要質因數分解,直接存因數的個數就好了 c[i]表示i這個因…

前端之CSS

什么是CSS&#xff1f; 在標簽上設置標簽的style屬性。 編寫CSS的方法 一、直接在標簽中寫style屬性。 二、在head標簽中寫style標簽&#xff0c;這里就需要選擇器選擇所需的標簽 1、id選擇器&#xff0c;以#開頭&#xff0c;例子如下&#xff1a; <!DOCTYPE html> <h…

[asp]統計在線人數情況

[asp]統計在線人數情況 以前ASP版本的統計在線。因為是從以前的系統中提取出來的。使用的話要修改下。 IfCbool(Application("MARKONLINE")) TrueThenCheckOnline()FunctionCheckOnline() DIMIP,rsPrv,Sql IfDBSTATE FalseThenDbOpen() SetrsPrvServer.Crea…

android 局域網鄰居,局域網內無鄰居 它們去哪兒了?

最近不知道是炎炎夏日的原因&#xff0c;還是部分地區雨水過多的問題&#xff0c;造成了好多小伙伴反應說&#xff0c;無法在網絡中看到同在一個局域網中的其他電腦、服務器或打印機。這個問題說大不大&#xff0c;說小不小&#xff0c;但很難用幾句話把問題解決&#xff0c;所…

svg 線條動畫淺嘗

看了別人網站的svg動畫覺得非常舒服,自己嘗試實現一下效果如下: 實現需要明白2個關于svg的css屬性 1. stroke-dasharray stroke-dasharray: <percentage> | <length> | inherit數與數之間用逗號或者空白隔開&#xff0c;指定短劃線和缺口的長度。如stroke-dasharr…

Ajax 的亂碼問題(2)

上次說的是“發送數據”時亂碼的處理方法。那么“接收數據”呢&#xff1f;亂碼問題弄得我快瘋了&#xff0c;所以廢話也不多說了&#xff0c;總結如下&#xff1a;服務端&#xff1a;///<summary>///Ajax 格式數據到本地客戶端///</summary>///<param name&quo…