消息中間件系列二:RabbitMQ入門(基本概念、RabbitMQ的安裝和運行)

1、基本概念

1. AMQP

 AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議支持不一樣語言和不一樣的產品windows

2. 生產者

消息的建立者,發送到AMQP的消息中間件api

3. 消費者

鏈接到AMQP的消息中間件,訂閱到隊列上,進行消息的消費。分爲持續訂閱(basicConsumer)和單條訂閱(basicGet)服務器

說明:性能

持續訂閱:只要有消息就不斷消費ui

單條訂閱:消費過一條消息之後就再也不消費了,要想繼續消費消息,就得從新訂閱到隊列上spa

4. 消息

包括有效載荷和標籤。有效載荷就是要傳輸的數據,標籤描述有效載荷的屬性,RabbitMQ用標籤來決定誰得到當前消息。消費者只能拿到有效載荷。.net

5. 信道

信道的概念:3d

虛擬的鏈接,創建在真實的TCP/IP鏈接之上的。信道的建立是沒有限制的。AMQP全部的消息和命令都是經過信道來傳輸的。日誌

使用信道的好處:中間件

創建在TCP/IP鏈接上性能更高,TCP/IP的鏈接數是有上限的,而且還要頻繁的建立鏈接和關閉鏈接,節約寶貴的TCP/IP鏈接資源

6.隊列、路由鍵、綁定、交換器之間的關係

隊列經過路由鍵(routing key,某種肯定的規則)綁定到交換器,生產者把消息發送到了交換器,交換器根據綁定的路由鍵將消息路由到特定的隊列,訂閱了隊列的消費者進行接收。

問題:

1)若是消息達到無人訂閱的隊列會怎麼辦?
  消息會一直在隊列中等待,直到內存溢出。RabbitMQ會默認隊列是無限長度的。
2)多個消費者訂閱到同一隊列怎麼辦?
  消息會輪詢的方式發送給消費者,每一個消息只會發送給一個消費者
3)消息路由到了不存在的隊列怎麼辦?
  會忽略,當消息不存在,消息丟失了。

7. 消息的確認機制

消費者收到的每一條消息都必須進行確認,分爲自動確認和消費者自行確認。

消費者在聲明隊列時,指定autoAck參數(true:自動確認,false:自行確認),false時RabbitMQ會等到消費者顯示的發回一個ack信號纔會刪除消息。
消息確認機制的好處:
autoAck=false時,有足夠時間讓消費者處理消息,直到消費者顯示調用basicAck爲止。
autoAck=false時,Rabbitmq中消息分爲了兩部分:一、等待投遞的消息;二、已經投遞,可是尚未收到ack信號的。若是消費者斷連了,服務器會把消息從新入隊,投遞給下一個消費者
未ack的消息是沒有超時時間的

8. 如何明確拒絕消息

1)消費者斷連
2)消費者使用reject命令(requeue=true,從新分發消息到其餘消費者,requeue=false移除消息)
3)nack命令(批量的拒絕,requeue=true,從新分發消息,requeue=false移除消息)
Nack命令是rabbitmq單獨實現的命令,其餘消息組件沒有
拒絕消息是爲了處理一些特殊的異常

9. 建立隊列 

生產者和消費者均可以建立隊列(declareQueue)。消費者訂閱了隊列,不能再聲明隊列了。

相關參數(exclusive:隊列是應用程序私有的,auto-delete:最後一個消費者取消訂閱時,隊列會自動刪除,durable:當前隊列是否持久化)

檢測隊列是否存在:Declare 時的passive參數

10. 四種交換器

direct,fanout,topic,headers
direct: 路由鍵徹底匹配時,消息才投放到對應隊列。AMQP實現都必須有一個direct交換器(默認交換器),名稱爲空白字符。隊列不聲明交換器,會自動綁定到默認交換器,隊列的名稱做爲路由鍵。
fanout:能夠理解爲廣播,會把交換器上的全部消息投放到綁定到這個交換機上的隊列上,不管這個隊列是經過哪一個路由鍵綁定到這個交換器上的
topic:主題,使來自不一樣源頭的消息到達同一個隊列
headers: 匹配消息頭,其他與direct同樣,實用性不大

topic使用場景舉例:
日誌處理場景:
1)有交換器(topic)log_exchange,日誌級別有 error,info,warning,應用模塊有 user,order,email,路由鍵的規則是日誌級別+「.」+應用模塊名(例如info.user)
2)發送郵件失敗,報告一個email的error,basicPublic(message,’log-exchange’,’error.email’)
隊列的綁定:queueBind(「email-error-queue」,’log-exchange’,’error.email’)
要監聽email全部的日誌怎麼辦?
queueBind(「email-log-queue」,’log-exchange’,’*.email’)
監聽全部模塊全部級別日誌?
queuebind(「all-log-queue」,’log-exchange’,’#’)
「.」會把路由鍵分爲好幾個標識符,「*」匹配一個標識符,「#」匹配一個或者多個(xxx.yyy.zzzz 能夠: xxx.*. zzzz , xxx.# , #.zzzz)。

11. 虛擬主機

Vhost類比在物理機上裝虛擬機
Vhost,真實RabbitMQ服務器上的mini型虛擬的MQ服務器。有本身的權限機制。
Vhost提供了一個邏輯上的分離,能夠區分不一樣客戶端、避免隊列的名稱衝突、交換器的名稱衝突。
RabbitMq包含了一個缺省的vhost :"/",用戶名guest,口令 guest(guest用戶只能在本機訪問)。

12. 消息持久化

1)隊列必須持久化
2)交換器也必須持久化
3)消息的投遞模式參數(int型)的值必須爲2
以上條件所有知足,消息才能持久化,寫入持久化日誌
持久化後帶來的問題:性能降低10倍

13. AMQP和JMS區別

      

JMS

AMQP

定義

Java api

協議

Model

P2P

Pub/Sub

Direct

Fanout

Topic

headers

支持消息類型

5

Byte[]

自行消息序列化,Json

綜合評價

Java系統,模型知足要求,跨平臺較差

協議,自然跨平臺,跨語言

 

 

 

 

 

 

 

 

 

 

 

 

2、RabbitMQ的安裝和運行

 安裝和運行教程:

windows10環境下的RabbitMQ安裝步驟(圖文)

相關文章
相關標籤/搜索