2023-07-06:RabbitMQ中的AMQP是什么?
2023-07-06:RabbitMQ中的AMQP是什么?
答案2023-07-06:
AMQP
AMQP(Advanced Message Queuing Protocol)是一個應(yīng)用層協(xié)議的開放標(biāo)準(zhǔn),旨在設(shè)計面向消息的中間件?;贏MQP協(xié)議的客戶端和消息中間件可以自由地傳遞消息,不受客戶端、中間件產(chǎn)品或開發(fā)語言的限制。其目標(biāo)是實現(xiàn)一種被廣泛應(yīng)用于各行業(yè)的標(biāo)準(zhǔn)消息中間件技術(shù),以降低企業(yè)和系統(tǒng)集成的成本,并提供工業(yè)級的集成服務(wù)。RabbitMQ是AMQP協(xié)議的一個主要實現(xiàn)。

客戶端與RabbitMQ的通訊
連接
作為客戶端(生產(chǎn)者或消費(fèi)者),要與RabbitMQ通信,首先需要建立一條TCP連接。在建立連接后,客戶端需要發(fā)送一條"問候語",以確保彼此都遵循AMQP協(xié)議。這類似于與他人打招呼時說"你好",或者與外國人打招呼時說"hello"。一旦確認(rèn)了使用相同的"語言",客戶端和RabbitMQ就完成了"認(rèn)證"。然后,它們可以創(chuàng)建一個AMQP信道來進(jìn)行通信。
信道
信道是生產(chǎn)者和消費(fèi)者與RabbitMQ進(jìn)行通信的通道。它是在TCP連接上建立的虛擬連接。這意味著RabbitMQ可以在一條TCP連接上創(chuàng)建多個信道,以便處理多個線程。每個線程對應(yīng)一個唯一的信道ID,從而保證了信道的私有性,并與特定的線程相關(guān)聯(lián)。
為什么不使用多個TCP連接呢?這是因為通過多路復(fù)用技術(shù),RabbitMQ可以在單個TCP連接上支持成百上千的信道。每秒創(chuàng)建和銷毀大量的TCP連接對系統(tǒng)性能消耗較大。因此,選擇在一條TCP連接上建立多個信道是為了保證性能。
從技術(shù)上講,這被稱之為“多路復(fù)用”,對于執(zhí)行多個任務(wù)的多線程或者異步應(yīng)用程序來說,它非常有用。
虛擬主機(jī)
虛擬主機(jī)(Virtual Host),簡稱vhost,實質(zhì)上是一個精簡版的消息隊列服務(wù)器,擁有自己的隊列、交換器和綁定,而且最重要的是具備獨(dú)立的權(quán)限機(jī)制。虛擬主機(jī)能夠在邏輯上實現(xiàn)客戶端之間的隔離,避免隊列和交換器名稱的沖突。在連接到RabbitMQ時,必須指定虛擬主機(jī)。RabbitMQ默認(rèn)包含一個名為"/"的虛擬主機(jī),通過默認(rèn)的用戶和密碼(guest)進(jìn)行訪問。
在RabbitMQ中創(chuàng)建用戶時,必須將其分配給至少一個虛擬主機(jī),并且該用戶只能訪問其所分配的虛擬主機(jī)中的隊列、交換器和綁定。虛擬主機(jī)的創(chuàng)建需要通過RabbitMQ的管理控制工具進(jìn)行操作。
交換器類型
交換器類型共有四種:direct、fanout、topic和headers。其中,headers類型與direct類型非常相似且不常使用,可以忽略不計。
Direct
Direct交換器是一種路由鍵完全匹配的交換器類型,它將消息按照路由鍵的完全匹配進(jìn)行投遞到相應(yīng)的隊列。Direct交換器是RabbitMQ的默認(rèn)交換器。當(dāng)聲明一個隊列時,它會自動綁定到默認(rèn)的Direct交換器,并以隊列名稱作為路由鍵進(jìn)行消息的發(fā)布:channel->basic_public($msg,’’,’queue-name’)。

Fanout
Fanout交換器將消息廣播到所有綁定的隊列,不管隊列是否綁定了特定的路由鍵。當(dāng)消息經(jīng)過Fanout交換器時,每個隊列都會收到一份復(fù)制的消息。

Topic
Topic交換器通過使用“”和“#”通配符來處理消息的路由鍵,從而將來自不同源頭的消息投遞到同一個隊列。在Topic交換器中,路由鍵可以包含多個標(biāo)識符,通過使用“.”進(jìn)行分隔?!啊蓖ㄅ浞糜谄ヅ湟粋€標(biāo)識符,而“#”通配符用于匹配一個或多個標(biāo)識符。
