標籤:虛擬機器主機 品質 queue 時間 應該 儲存 基礎 tcp 交換
Broker:訊息協商器。訊息佇列的實體,它在TCP/IP等連接埠上監聽AMQ訊息
vHost:虛擬機器主機。功能上類似於web的虛擬機器主機,都是把資料按照功能或項目的不同劃分為不同的虛擬機器主機;使用者只被授予訪問虛擬機器主機的許可權,而沒有其他比這進階的存取控制措施。用戶端與Broker溝通需要先建立串連,這些串連僅限於串連使用者和虛擬機器主機。
channel:通道。用戶端在串連中聲明一個通道,這個通道是客戶與Broker之間的一個邏輯串連;用戶端的操作都是通過通道來實現的。具體的操作需要用戶端聲明相應的組件。
常用的組件:
- 交換器(Exchange),它是發送訊息的實體;可以顯式命名
- 隊列(Queue),這是接收訊息的實體;可以顯式命名;如果不命名,系統會自動產生一個隊列,名稱也為隨機的,隨機產生的隊列生命週期會在當次產生它的串連斷開時結束
- 綁定器(Bind),將交換器和隊列串連起來,並且封裝訊息的路由資訊;綁定的交換器
message:訊息
訊息的組成:
- 中繼資料,例如內容的編碼或者表明來源的欄位。
- 標誌位,標記訊息投遞時候的一些保障機制。
- 一個特殊的欄位叫做routing key。
exchange:交換器
交換器負責把producer的訊息按指定的規則分配給queue
規則有四種:
- direct
- topic
- headers
- fanout 群發,向所有綁定的queue
queue:隊列
broker儲存訊息的位置,他可以由producer和consumer任意一方建立。
temporary queue:暫存佇列
聲明隊列時如果不指明隊列名稱,那麼聲明的隊列將是一個自動命名的隊列,這個隊列會在串連斷開時自動刪除,因為它屬於一次會話的專屬隊列,會話結束,它也就應該結束了。
訊息從發送到接收的流程:
訊息發送用戶端-create channel-》exchange-》queue-》-create channel -訊息接收用戶端 (接收端的接收流程還不確定)
broker在發送訊息成功後會立即刪除掉儲存在queue中的該條訊息。如果設定了回執,broker會在收到回執後執行刪除。
consumer關閉、broker服務關閉都會造成任務失敗和訊息丟失。
- consumer異常: message acknowledgment。如果consumer發生異常訊息未收到的情況下,broker不會刪除掉該訊息,而是重新發送,直到收到consumer返回回執才會刪除。
- broker異常: 對隊列和訊息進行持久化。
- 隊列持久化:在隊列聲明中將持久化的參數設定為true即可使隊列持久化;這個設定必須在producer和consumer同時設定;另外,已聲明並存在隊列的屬性是不能修改,因此需要重新聲明一個新的隊列
- 訊息持久化: 依據原始訊息資料,在執行個體化訊息對象時,傳入訊息持久化的參數
預設的這種持久化並不是非常的強壯,因為在broker接受訊息後有一小段時間內訊息是未儲存的。另外,rabbitmq不會對每條訊息執行fsync,因此訊息有可能是在記憶體的緩衝中,並未真正的寫到磁碟上。如果需要更妥當的持久化,需要用到事務Transaction 具體詳情:https://www.rabbitmq.com/confirms.html
round-robin dispatching:訊息輪詢分發
如果有多個worker,borker會將訊息按照奇偶數輪流分發給worker;
Qos:服務品質
訊息有的長,有短,如果一個worker分發到的訊息都很長,而一個worker分發到的都比較短,那麼一個worker會很繁忙,另一個會很閑。這樣就需要去平衡訊息的分發。
設定qos :basic_qos(null, 1, null)。1代表的是broker一次只發送一條訊息給worker,如果worker沒有完成上一條發送的訊息、沒有給broker發送回執,那麼則不會繼續給這個worker發送下一條訊息,下一條的訊息會發送給一個閒置worker來處理。
(未完待續....)
RabbitMQ 基礎概念