日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

消息队列深入解析

發(fā)布時(shí)間:2025/3/17 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消息队列深入解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

消息隊(duì)列和消息

“消息隊(duì)列”(Message queue)是在消息的傳輸過(guò)程中保存消息的容器。“消息” 是在兩臺(tái)計(jì)算機(jī)間傳送的數(shù)據(jù)單位。消息可以非常簡(jiǎn)單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對(duì)象。

常見(jiàn)的消息隊(duì)列有那些?

當(dāng)前使用較多的消息隊(duì)列有RabbitMQActiveMQRocketMQKafka等等,我們之前提高的redis數(shù)據(jù)庫(kù)也可以實(shí)現(xiàn)消息隊(duì)列,不過(guò)不推薦,redis本身設(shè)計(jì)就不是用來(lái)做消息隊(duì)列的。

使用消息隊(duì)列的場(chǎng)景和好處

《大型網(wǎng)站技術(shù)架構(gòu)》第四章和第七章均有提到消息隊(duì)列對(duì)應(yīng)用性能及擴(kuò)展性的提升。

1.通過(guò)異步處理提高系統(tǒng)性能


如上圖,在不使用消息隊(duì)列服務(wù)器的時(shí)候,用戶的請(qǐng)求數(shù)據(jù)直接寫(xiě)入數(shù)據(jù)庫(kù),在高并發(fā)的情況下數(shù)據(jù)庫(kù)壓力劇增,使得響應(yīng)速度變慢。但是在使用消息隊(duì)列之后,用戶的請(qǐng)求數(shù)據(jù)發(fā)送給消息隊(duì)列之后立即 返回,再由消息隊(duì)列的消費(fèi)者進(jìn)程從消息隊(duì)列中獲取數(shù)據(jù),異步寫(xiě)入數(shù)據(jù)庫(kù)。由于消息隊(duì)列服務(wù)器處理速度快于數(shù)據(jù)庫(kù)(消息隊(duì)列也比數(shù)據(jù)庫(kù)有更好的伸縮性),因此響應(yīng)速度得到大幅改善。

通過(guò)以上分析我們可以得出消息隊(duì)列具有很好的削峰作用的功能——即通過(guò)異步處理,將短時(shí)間高并發(fā)產(chǎn)生的事務(wù)消息存儲(chǔ)在消息隊(duì)列中,從而削平高峰期的并發(fā)事務(wù)。 舉例:在電子商務(wù)一些秒殺、促銷活動(dòng)中,合理使用消息隊(duì)列可以有效抵御促銷活動(dòng)剛開(kāi)始大量訂單涌入對(duì)系統(tǒng)的沖擊。如下圖所示:

因?yàn)?strong>用戶請(qǐng)求數(shù)據(jù)寫(xiě)入消息隊(duì)列之后就立即返回給用戶了,但是請(qǐng)求數(shù)據(jù)在后續(xù)的業(yè)務(wù)校驗(yàn)、寫(xiě)數(shù)據(jù)庫(kù)等操作中可能失敗。因此使用消息隊(duì)列進(jìn)行異步處理之后,需要適當(dāng)修改業(yè)務(wù)流程進(jìn)行配合,比如用戶在提交訂單之后,訂單數(shù)據(jù)寫(xiě)入消息隊(duì)列,不能立即返回用戶訂單提交成功,需要在消息隊(duì)列的訂單消費(fèi)者進(jìn)程真正處理完該訂單之后,甚至出庫(kù)后,再通過(guò)電子郵件或短信通知用戶訂單成功,以免交易糾紛。這就類似我們平時(shí)手機(jī)訂火車票和電影票。

2.降低系統(tǒng)耦合性

我們知道模塊分布式部署以后聚合方式通常有兩種:1.分布式消息隊(duì)列和2.分布式服務(wù)

先來(lái)簡(jiǎn)單說(shuō)一下分布式服務(wù):

目前使用比較多的用來(lái)構(gòu)建SOA(Service Oriented Architecture面向服務(wù)體系結(jié)構(gòu))分布式服務(wù)框架是阿里巴巴開(kāi)源的Dubbo.如果想深入了解Dubbo的可以看我寫(xiě)的關(guān)于Dubbo的這一篇文章:《高性能優(yōu)秀的服務(wù)框架-dubbo介紹》:https://juejin.im/post/5acadeb1f265da2375072f9c

再來(lái)談我們的分布式消息隊(duì)列:

我們知道如果模塊之間不存在直接調(diào)用,那么新增模塊或者修改模塊就對(duì)其他模塊影響較小,這樣系統(tǒng)的可擴(kuò)展性無(wú)疑更好一些。

我們最常見(jiàn)的事件驅(qū)動(dòng)架構(gòu)類似生產(chǎn)者消費(fèi)者模式,在大型網(wǎng)站中通常用利用消息隊(duì)列實(shí)現(xiàn)事件驅(qū)動(dòng)結(jié)構(gòu)。如下圖所示:

消息隊(duì)列使利用發(fā)布-訂閱模式工作,消息發(fā)送者(生產(chǎn)者)發(fā)布消息,一個(gè)或多個(gè)消息接受者(消費(fèi)者)訂閱消息。 從上圖可以看到消息發(fā)送者(生產(chǎn)者)和消息接受者(消費(fèi)者)之間沒(méi)有直接耦合,消息發(fā)送者將消息發(fā)送至分布式消息隊(duì)列即結(jié)束對(duì)消息的處理,消息接受者從分布式消息隊(duì)列獲取該消息后進(jìn)行后續(xù)處理,并不需要知道該消息從何而來(lái)。對(duì)新增業(yè)務(wù),只要對(duì)該類消息感興趣,即可訂閱該消息,對(duì)原有系統(tǒng)和業(yè)務(wù)沒(méi)有任何影響,從而實(shí)現(xiàn)網(wǎng)站業(yè)務(wù)的可擴(kuò)展性設(shè)計(jì)

消息接受者對(duì)消息進(jìn)行過(guò)濾、處理、包裝后,構(gòu)造成一個(gè)新的消息類型,將消息繼續(xù)發(fā)送出去,等待其他消息接受者訂閱該消息。因此基于事件(消息對(duì)象)驅(qū)動(dòng)的業(yè)務(wù)架構(gòu)可以是一系列流程。

另外為了避免消息隊(duì)列服務(wù)器宕機(jī)造成消息丟失,會(huì)將成功發(fā)送到消息隊(duì)列的消息存儲(chǔ)在消息生產(chǎn)者服務(wù)器上,等消息真正被消費(fèi)者服務(wù)器處理后才刪除消息。在消息隊(duì)列服務(wù)器宕機(jī)后,生產(chǎn)者服務(wù)器會(huì)選擇分布式消息隊(duì)列服務(wù)器集群中的其他服務(wù)器發(fā)布消息。

備注: 不要認(rèn)為消息隊(duì)列只能利用發(fā)布-訂閱模式工作,只不過(guò)在解耦這個(gè)特定業(yè)務(wù)環(huán)境下是使用發(fā)布-訂閱模式的,比如在我們的ActiveMQ消息隊(duì)列中還有點(diǎn)對(duì)點(diǎn)工作模式,具體的會(huì)在后面的文章給大家詳細(xì)介紹,這一篇文章主要還是讓大家對(duì)消息隊(duì)列有一個(gè)更透徹的了解。

常見(jiàn)的消息隊(duì)列介紹

1.ActiveMQ

官網(wǎng):http://activemq.apache.org/

簡(jiǎn)介:

ActiveMQ 是Apache出品,最流行的,能力強(qiáng)勁的開(kāi)源消息總線。ActiveMQ 是一個(gè)完全支持JMS1.1和J2EE 1.4規(guī)范的 JMS Provider實(shí)現(xiàn),盡管JMS規(guī)范出臺(tái)已經(jīng)是很久的事情了,但是JMS在當(dāng)今的J2EE應(yīng)用中間仍然扮演著特殊的地位。

特點(diǎn):

  • 支持來(lái)自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各種跨語(yǔ)言客戶端和協(xié)議
  • 完全支持JMS客戶端和Message Broker中的企業(yè)集成模式
  • 支持許多高級(jí)功能,如消息組,虛擬目標(biāo),通配符和復(fù)合目標(biāo)
  • 完全支持JMS 1.1和J2EE 1.4,支持瞬態(tài),持久,事務(wù)和XA消息
  • Spring支持,以便ActiveMQ可以輕松嵌入到Spring應(yīng)用程序中,并使用Spring的XML配置機(jī)制進(jìn)行配置
  • 專為高性能集群,客戶端 - 服務(wù)器,基于對(duì)等的通信而設(shè)計(jì)
  • CXF和Axis支持,以便ActiveMQ可以輕松地放入這些Web服務(wù)堆棧中以提供可靠的消息傳遞
  • 可以用作內(nèi)存JMS提供程序,非常適合單元測(cè)試JMS
  • 支持可插拔傳輸協(xié)議,例如in-VM,TCP,SSL,NIO,UDP,多播,JGroups和JXTA傳輸
  • 使用JDBC和高性能日志支持非常快速的持久性
  • 2.RabbitMQ

    官網(wǎng):http://www.rabbitmq.com/

    簡(jiǎn)介:

    RabbitMQ 是一個(gè)由 Erlang 語(yǔ)言開(kāi)發(fā)的 AMQP 的開(kāi)源實(shí)現(xiàn)。RabbitMQ輕巧且易于部署在云端。 它支持多種消息傳遞協(xié)議。 RabbitMQ可以部署在分布式和聯(lián)合配置中,以滿足高規(guī)模,高可用性需求。RabbitMQ可運(yùn)行在許多操作系統(tǒng)和云環(huán)境中,并為大多數(shù)流行語(yǔ)言提供廣泛的開(kāi)發(fā)工具。(來(lái)自官網(wǎng)翻譯)

    AMQP (Advanced MessageQueue):高級(jí)消息隊(duì)列協(xié)議。它是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì),基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產(chǎn)品、開(kāi)發(fā)語(yǔ)言等條件的限制。

    RabbitMQ最初廣泛應(yīng)用于金融行業(yè),根據(jù)官網(wǎng)描述,它具有如下特點(diǎn):

    特點(diǎn):

  • 異步消息傳遞:支持多種消息協(xié)議,消息隊(duì)列,傳送確認(rèn),靈活的路由到隊(duì)列,多種交換類型;
  • 支持幾乎所有最受歡迎的編程語(yǔ)言:Java,C,C ++,C#,Ruby,Perl,Python,PHP等等;
  • 可以部署為高可用性和吞吐量的集群; 跨多個(gè)可用區(qū)域和區(qū)域進(jìn)行聯(lián)合;
  • 可插入的身份驗(yàn)證,授權(quán),支持TLS和LDAP。;
  • 提供了一個(gè)易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker 的許多方面;
  • 提供了許多插件,來(lái)從多方面進(jìn)行擴(kuò)展,也可以編寫(xiě)自己的插件。
  • 3. Kafka

    官網(wǎng):http://kafka.apache.org/

    簡(jiǎn)介:

    Kafka是由Apache軟件基金會(huì)開(kāi)發(fā)的一個(gè)開(kāi)源流處理平臺(tái),由Scala和Java編寫(xiě)。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者規(guī)模的網(wǎng)站中的所有動(dòng)作流數(shù)據(jù)。 這種動(dòng)作(網(wǎng)頁(yè)瀏覽,搜索和其他用戶的行動(dòng))是在現(xiàn)代網(wǎng)絡(luò)上的許多社會(huì)功能的一個(gè)關(guān)鍵因素。 這些數(shù)據(jù)通常是由于吞吐量的要求而通過(guò)處理日志和日志聚合來(lái)解決。 對(duì)于像Hadoop的一樣的日志數(shù)據(jù)和離線分析系統(tǒng),但又要求實(shí)時(shí)處理的限制,這是一個(gè)可行的解決方案。Kafka的目的是通過(guò)Hadoop的并行加載機(jī)制來(lái)統(tǒng)一線上和離線的消息處理,也是為了通過(guò)集群來(lái)提供實(shí)時(shí)的消息。

    Kafka它主要用于處理活躍的流式數(shù)據(jù),因此Kafaka在大數(shù)據(jù)系統(tǒng)中使用較多。

    特點(diǎn):

  • 同時(shí)為發(fā)布和訂閱提供高吞吐量。據(jù)了解,Kafka每秒可以生產(chǎn)約25萬(wàn)消息(50 MB),每秒處理55萬(wàn)消息(110 MB)。
  • 可進(jìn)行持久化操作。將消息持久化到磁盤(pán),因此可用于批量消費(fèi),例如ETL,以及實(shí)時(shí)應(yīng)用程序。通過(guò)將數(shù)據(jù)持久化到硬盤(pán)以及replication防止數(shù)據(jù)丟失。
  • 分布式系統(tǒng),易于向外擴(kuò)展。所有的producer、broker和consumer都會(huì)有多個(gè),均為分布式的。無(wú)需停機(jī)即可擴(kuò)展機(jī)器。
  • 消息被處理的狀態(tài)是在consumer端維護(hù),而不是由server端維護(hù)。當(dāng)失敗時(shí)能自動(dòng)平衡。
  • 支持online和offline的場(chǎng)景。
  • 4. RocketMQ

    官網(wǎng):http://rocketmq.apache.org/

    簡(jiǎn)介:

    RocketMQ是阿里開(kāi)源的消息中間件,目前在Apache孵化,使用純Java開(kāi)發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。RocketMQ思路起源于Kafka,但并不是簡(jiǎn)單的復(fù)制,它對(duì)消息的可靠傳輸及事務(wù)性做了優(yōu)化,目前在阿里集團(tuán)被廣泛應(yīng)用于交易、充值、流計(jì)算、消息推送、日志流式處理、binglog分發(fā)等場(chǎng)景,支撐了阿里多次雙十一活動(dòng)。

    特點(diǎn):

  • 支持發(fā)布/訂閱(Pub/Sub)和點(diǎn)對(duì)點(diǎn)(P2P)消息模型
  • 在一個(gè)隊(duì)列中可靠的先進(jìn)先出(FIFO)和嚴(yán)格的順序傳遞
  • 支持拉(pull)和推(push)兩種消息模式
  • 單一隊(duì)列百萬(wàn)消息的堆積能力
  • 支持多種消息協(xié)議,如 JMS、MQTT 等
  • 分布式高可用的部署架構(gòu),滿足至少一次消息傳遞語(yǔ)義
  • 提供 docker 鏡像用于隔離測(cè)試和云集群部署
  • 提供配置、指標(biāo)和監(jiān)控等功能豐富的 Dashboard
  • 區(qū)別(圖片來(lái)源慕課網(wǎng)):

    其實(shí)對(duì)于這些消息隊(duì)列的產(chǎn)品,每一種都在某一領(lǐng)域占有一席,雖然ActiveMQ目前在社區(qū)已經(jīng)不是很活躍,但是其下一代產(chǎn)品Apollo已經(jīng)問(wèn)世。ZeroMQ小而美,RabbitMQ大而穩(wěn),Kakfa和RocketMQ快而強(qiáng)勁。RocketMQ雖然目前還很多不完善,但是一旦在Apache孵化成為頂級(jí)項(xiàng)目,全球程序猿開(kāi)始貢獻(xiàn),前途也是不可限量的。

    下一篇文章我會(huì)詳細(xì)介紹ActiveMQ以及相關(guān)使用方法。

    歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(一個(gè)有溫度的微信公眾號(hào),期待與你共同進(jìn)步~~~堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源):

    總結(jié)

    以上是生活随笔為你收集整理的消息队列深入解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。