溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何部署使用消息隊(duì)列RabbitMQ

發(fā)布時(shí)間:2021-09-14 11:17:19 來(lái)源:億速云 閱讀:117 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何部署使用消息隊(duì)列RabbitMQ,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

什么是消息隊(duì)列

消息隊(duì)列拆開(kāi)了看,就是消息 + 隊(duì)列,消息是什么?其實(shí)就是程序之間通訊所用到的數(shù)據(jù),消息從生產(chǎn)者那里產(chǎn)生,進(jìn)入隊(duì)列后,安裝設(shè)計(jì)好的規(guī)則出隊(duì),由消費(fèi)者消費(fèi)。僅此而已。

為什么需要消息隊(duì)列

消息隊(duì)列,最重要的是隊(duì)列,可以想象一下沒(méi)有隊(duì)列的場(chǎng)景,你去銀行辦業(yè)務(wù)的時(shí)候,大家都不排隊(duì)的場(chǎng)景,大家都堆在一起,個(gè)子小沒(méi)力氣的根本辦不了業(yè)務(wù)。

如果沒(méi)有消息隊(duì)列,你的系統(tǒng)將嚴(yán)重耦合,在升級(jí)維護(hù)的時(shí)候牽一發(fā)而動(dòng)全身。

如果沒(méi)有消息隊(duì)列,你的系統(tǒng)的很多功能都是同步的,同步意味著前面的事件完成后,才可以進(jìn)行后續(xù)的操作,前端用戶(hù)的會(huì)覺(jué)得卡頓,體驗(yàn)很差。

如果沒(méi)有消息隊(duì)列,web 系統(tǒng)突然面對(duì)高并發(fā)的訪(fǎng)問(wèn)請(qǐng)求,可能會(huì)崩潰。

有了消息隊(duì)列,系統(tǒng)解耦、異步通信、流量削峰、延遲通知、最終一致性保證、順序消息、流式處理等需求都可以輕松解決。

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

比較常見(jiàn)的消息隊(duì)列產(chǎn)品主要有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、RocketMQ 等。

ActiveMQ

Apache ActiveMQ 是 Apache 軟件基金會(huì)所研發(fā)的開(kāi)放源碼消息中間件;由于 ActiveMQ 是一個(gè)純Java程序,因此只需要操作系統(tǒng)支持 Java 虛擬機(jī),ActiveMQ 便可執(zhí)行。

  • 支持Java消息服務(wù) (JMS) 1.1 版本

  • Spring Framework

  • 集群 (Clustering)

  • 協(xié)議支持包括:OpenWire、REST、STOMP、WS-Notification、MQTT、XMPP 以及 AMQP

RabbitMQ

RabbitMQ 實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理軟件(亦稱(chēng)面向消息的中間件)。RabbitMQ 服務(wù)器是用高性能、健壯以及可伸縮性出名的 Erlang 語(yǔ)言編寫(xiě)的,支持所有主流的操作系統(tǒng)如 Linux,Windows,MacOS??蛻?hù)端支持所有主要的編程語(yǔ)言。

  • 可伸縮性:集群服務(wù)

  • 消息持久化:從內(nèi)存持久化消息到硬盤(pán),再?gòu)挠脖P(pán)加載到內(nèi)存

ZeroMQ

ZeroMQ(也拼寫(xiě)作 0MQ 或 ZMQ )是一個(gè)為可伸縮的分布式或并發(fā)應(yīng)用程序設(shè)計(jì)的高性能異步消息庫(kù)。它提供一個(gè)消息隊(duì)列, 但是與面向消息的中間件不同,ZeroMQ 的運(yùn)行不需要專(zhuān)門(mén)的消息代理(message broker)。該庫(kù)設(shè)計(jì)成常見(jiàn)的套接字風(fēng)格的API。

ZeroMQ 是由 iMatix 公司和大量貢獻(xiàn)者組成的社群共同開(kāi)發(fā)的。ZeroQ 通過(guò)許多第三方軟件支持大部分流行的編程語(yǔ)言,從 Java 和Python 到 Erlang 和 Haskell。

Kafka

Kafka 是由 Apache 軟件基金會(huì)開(kāi)發(fā)的一個(gè)開(kāi)源流處理平臺(tái),由 Scala 和 Java 編寫(xiě)。該項(xiàng)目的目標(biāo)是為處理實(shí)時(shí)數(shù)據(jù)提供一個(gè)統(tǒng)一、高吞吐、低延遲的平臺(tái)。其持久化層本質(zhì)上是一個(gè)“按照分布式事務(wù)日志架構(gòu)的大規(guī)模發(fā)布/訂閱消息隊(duì)列”,這使它作為企業(yè)級(jí)基礎(chǔ)設(shè)施來(lái)處理流式數(shù)據(jù)非常有價(jià)值。此外,Kafka 可以通過(guò) Kafka Connect 連接到外部系統(tǒng)(用于數(shù)據(jù)輸入/輸出),并提供了 Kafka Streams 的流式處理庫(kù)。該設(shè)計(jì)受事務(wù)日志的影響較大。

RocketMQ

RocketMQ 是一個(gè)分布式消息和流數(shù)據(jù)平臺(tái),具有低延遲、高性能、高可靠性、萬(wàn)億級(jí)容量和靈活的可擴(kuò)展性。RocketMQ 是 2012 年阿里巴巴開(kāi)源的第三代分布式消息中間件,2016 年 11 月 21 日,阿里巴巴向 Apache 軟件基金會(huì)捐贈(zèng)了 RocketMQ;第二年 2 月 20 日,Apache 軟件基金會(huì)宣布 Apache RocketMQ 成為頂級(jí)項(xiàng)目。

消息隊(duì)列的選型需要根據(jù)具體應(yīng)用需求而定,ZeroMQ 小而美,RabbitMQ 大而穩(wěn),Kakfa 和 RocketMQ 快而強(qiáng)勁。

RabbitMQ 的部署和使用

推薦 Docker 部署,在安裝 Docker 的環(huán)境下,執(zhí)行:

docker run -d --hostname my-rabbit -p 15672:15672 -p 5672:5672 -- name rabbit-server -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

現(xiàn)在在瀏覽器中打開(kāi) localhost:15672 。用戶(hù)名是 user ,密碼是 password

如何部署使用消息隊(duì)列RabbitMQ

接下來(lái),讓我們創(chuàng)建一個(gè)隊(duì)列,名字叫 my_app

如何部署使用消息隊(duì)列RabbitMQ

創(chuàng)建一個(gè) Exchange,名字叫 my_exchange

如何部署使用消息隊(duì)列RabbitMQ

點(diǎn)擊 Exchange 標(biāo)簽頁(yè),點(diǎn)擊 my_exchange 進(jìn)入詳情頁(yè), 將 my_exchange 和 my_app 綁定,路由密鑰設(shè)置為 test:

如何部署使用消息隊(duì)列RabbitMQ

Python 編寫(xiě)生產(chǎn)者

現(xiàn)在可以使用 Python 編寫(xiě)生產(chǎn)者,來(lái)生產(chǎn)一條消息放入隊(duì)列,并觀(guān)察 Web 頁(yè)面的變動(dòng)情況:

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials('user', 'password')))
channel = connection.channel() 
channel.basic_publish(exchange='my_exchange', routing_key='test', body='Test!')
connection.close()

執(zhí)行上面的代碼,即可將消息放入隊(duì)列,這里我執(zhí)行了四次,可以看到有四條消息:

如何部署使用消息隊(duì)列RabbitMQ

消息將保留在隊(duì)列中,直到消費(fèi)者把它取出,接下來(lái)我們寫(xiě)一個(gè)消費(fèi)消息的程序。

Python 編寫(xiě)消費(fèi)者

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials("user", "password")))
channel = connection.channel()
def callback(ch, method, properties, body):
    print(f'{body} is received')
channel.basic_consume(queue="my_app", on_message_callback=callback, auto_ack=True)
channel.start_consuming()

執(zhí)行:

如何部署使用消息隊(duì)列RabbitMQ

此時(shí),隊(duì)列已經(jīng)空了:

如何部署使用消息隊(duì)列RabbitMQ

這段代碼最低限度地演示了如何將消息發(fā)布到 RabbitMQ 中

上述就是小編為大家分享的如何部署使用消息隊(duì)列RabbitMQ了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI