AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議。支持不一樣語言和不一樣的產品windows
消息的建立者,發送到AMQP的消息中間件api
鏈接到AMQP的消息中間件,訂閱到隊列上,進行消息的消費。分爲持續訂閱(basicConsumer)和單條訂閱(basicGet)服務器
說明:性能
持續訂閱:只要有消息就不斷消費ui
單條訂閱:消費過一條消息之後就再也不消費了,要想繼續消費消息,就得從新訂閱到隊列上spa
包括有效載荷和標籤。有效載荷就是要傳輸的數據,標籤描述有效載荷的屬性,RabbitMQ用標籤來決定誰得到當前消息。消費者只能拿到有效載荷。.net
信道的概念:3d
虛擬的鏈接,創建在真實的TCP/IP鏈接之上的。信道的建立是沒有限制的。AMQP全部的消息和命令都是經過信道來傳輸的。日誌
使用信道的好處:中間件
創建在TCP/IP鏈接上性能更高,TCP/IP的鏈接數是有上限的,而且還要頻繁的建立鏈接和關閉鏈接,節約寶貴的TCP/IP鏈接資源
隊列經過路由鍵(routing key,某種肯定的規則)綁定到交換器,生產者把消息發送到了交換器,交換器根據綁定的路由鍵將消息路由到特定的隊列,訂閱了隊列的消費者進行接收。
問題:
1)若是消息達到無人訂閱的隊列會怎麼辦?
消息會一直在隊列中等待,直到內存溢出。RabbitMQ會默認隊列是無限長度的。
2)多個消費者訂閱到同一隊列怎麼辦?
消息會輪詢的方式發送給消費者,每一個消息只會發送給一個消費者
3)消息路由到了不存在的隊列怎麼辦?
會忽略,當消息不存在,消息丟失了。
消費者在聲明隊列時,指定autoAck參數(true:自動確認,false:自行確認),false時RabbitMQ會等到消費者顯示的發回一個ack信號纔會刪除消息。
消息確認機制的好處:
autoAck=false時,有足夠時間讓消費者處理消息,直到消費者顯示調用basicAck爲止。
autoAck=false時,Rabbitmq中消息分爲了兩部分:一、等待投遞的消息;二、已經投遞,可是尚未收到ack信號的。若是消費者斷連了,服務器會把消息從新入隊,投遞給下一個消費者。
未ack的消息是沒有超時時間的
1)消費者斷連
2)消費者使用reject命令(requeue=true,從新分發消息到其餘消費者,requeue=false移除消息)
3)nack命令(批量的拒絕,requeue=true,從新分發消息,requeue=false移除消息)
Nack命令是rabbitmq單獨實現的命令,其餘消息組件沒有
拒絕消息是爲了處理一些特殊的異常
生產者和消費者均可以建立隊列(declareQueue)。消費者訂閱了隊列,不能再聲明隊列了。
相關參數(exclusive:隊列是應用程序私有的,auto-delete:最後一個消費者取消訂閱時,隊列會自動刪除,durable:當前隊列是否持久化)
檢測隊列是否存在:Declare 時的passive參數
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)。
Vhost類比在物理機上裝虛擬機
Vhost,真實RabbitMQ服務器上的mini型虛擬的MQ服務器。有本身的權限機制。
Vhost提供了一個邏輯上的分離,能夠區分不一樣客戶端、避免隊列的名稱衝突、交換器的名稱衝突。
RabbitMq包含了一個缺省的vhost :"/",用戶名guest,口令 guest(guest用戶只能在本機訪問)。
1)隊列必須持久化
2)交換器也必須持久化
3)消息的投遞模式參數(int型)的值必須爲2
以上條件所有知足,消息才能持久化,寫入持久化日誌
持久化後帶來的問題:性能降低10倍
|
JMS |
AMQP |
定義 |
Java api |
協議 |
Model |
P2P Pub/Sub |
Direct Fanout Topic headers |
支持消息類型 |
5種 |
Byte[] 自行消息序列化,Json化 |
綜合評價 |
Java系統,模型知足要求,跨平臺較差 |
協議,自然跨平臺,跨語言 |
安裝和運行教程: