簡介
越來越多的消息中間件很容易讓人產生混淆,在學習一種消息中間件的時候,最好先了解他的幾種抽象概念,方便你理解,明白了這些概念,你學習起來的時候也就得心應手,同時也是使用好RabbitMQ的基礎。
核心概念
- Producer
- Message
- Consumer
- AMQP
- Queue
- Message acknowledgment
- Message durability
- Prefetch count
- Exchange
- RoutingKey
- Binding
- Binding key
- Exchange Types
AMQP
Producer Message Consumer 過於簡單,我就不介紹了。AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標准,為面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。
RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫。用於在分布式系統中存儲轉發消息
Message acknowledgment
message ackonwledgment 即消息回執,消費者在消費完消息后發送一個回執給rabbitmq,rabbtiMq收到回執后才將消息從隊列中刪除,如果沒有收到回執並檢測到消費者的RabbitMQ連接斷開,那么會將該消息發送給其他消費者進行處理。這里不存在timeout概念,一個消費者處理消息時間再長也不會導致該消息被發送給其他消費者,除非它的RabbitMQ連接斷開。
Message durability
消息持久化,即RabbitMQ服務重啟的情況下,也不會丟失消息,我們可以將Queue與Message都設置為(durable),這樣可以保證絕大部分情況下我們的RabbitMQ消息不會丟失。小概率丟失事件無法避免(比如RabbitMQ服務器已經接收到生產者的消息,但還沒來得及持久化該消息時RabbitMQ服務器就斷電了),如果我們需要對這種情況也要處理,那么我們要用到事務。
Prefetch count
消費者在開啟acknowledge的情況下,對接收到的消息可以根據業務的需要異步對消息進行確認,prefetch允許為每個consumer指定最大的unacked messages數目。例如:設置prefetchCount=10,則Queue每次給每個消費者(假設一共2個AB)發送10條消息,消費者無需馬上回應,消費者將10條消息緩存本地客戶端;當一個消費者處理完1條消息后Queue會再給該消費者發送一條消息。如果兩個消費者都沒有回復任何一條ack,則queue就不會繼續發送消息。
Exchange
在RabbitMQ中生產者不會直接將消息發送隊列。實際的情況是,生產者將消息發送到Exchange,由Exchange將消息路由到一個或多個Queue中(或者丟棄)。
RoutingKey
routingKey針對生產者而言,發送消息時一般需要指定routingkey,而這個routing key需要與Exchange Type及binding key聯合使用才能最終生效。
Binding
Binding將Exchange與Queue關聯起來,這樣RabbitMQ就知道如何正確地將消息路由到指定的Queue了。
BindingKey
在綁定Exchange與Queue的同時,一般會指定一個binding key;生產者將消息發送給Exchange時,一般會指定一個routing key;當binding key與routing key一致,或者符合模式匹配,消息就會被路由到對應的Queue中。在綁定多個Queue到同一個Exchange的時候,這些Binding允許使用相同的binding key。binding key 並不是在所有情況下都生效,它依賴於Exchange Type,比如fanout類型的Exchange就會無視binding key,而是將消息路由到所有綁定到該Exchange的Queue。
Exchange Types
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers這四種
參考文獻
[http://www.rabbitmq.com/getstarted.html]
[https://www.jianshu.com/p/4d043d3045ca]