rabbitmq:企業級訊息佇列,遵循
amqp
協議,基於
erlang
語言開發,在可靠性、易用性和高可用等方面都比較優秀的乙個訊息中介軟體。在網際網路專案中,常見用途:
- 服務之間的業務解耦,避免發布時互相影響
- 非同步資料處理,以快速返回應答,包括日誌的收集和業務的處理
- 流量控制,避免瞬間突發資料影響到下游處理
傳統意義上的佇列,是一種資料結構,只是先進先出的乙個模組而已,
而amqp協議定義了如下兩種角色和三個功能模組:
- 訊息生產者
publisher
角色:只負責發布訊息,不關心訊息給誰了
- 訊息消費者
consumer
角色:負責接收和處理訊息
- exchange:接收生產者發布的訊息,並根據規則**給
queue
- queue:儲存訊息,並等待消費者過來接收處理
- binding:定義
exchange
和queue
之前的關聯,以及訊息**規則
routingkey
so,正確的使用
rabbitmq
的方式,是要進行如下
5個步驟的:
1. 建立乙個
exchange
2. 建立乙個
queue
3. 建立乙個
binding
,把exchange
和queue
關聯起來
4. 應用程式a給
exchange
發布訊息
5. 應用程式b從
queue
監聽訊息並處理
注意:exchange和
queue
之間可以新增多個繫結,例如:
1. 乙個
exchange
繫結到乙個
queue
2. 乙個
exchange
繫結到多個
queue
3. 多個
exchange
繫結到乙個
queue
4. 乙個
exchange
多次繫結到乙個
queue
,routingkey
不同高階概念:
exchange、
queue
和binding
,在建立時會有一些引數,這些引數指示了工作方式的不同,常用如下:
exchange型別:
exchange有
4種型別
fanout
、direct
、topic
、headers(第4
種本文不作介紹)
- fanout:廣播型別,該
exchange
收到的所有訊息,會**給繫結到它的所有
queue
,即使設定了**規則
routingkey
也不生效,因此該種型別的效能是最高的。
- direct:該
exchange
會根據**規則
routingkey
進行精確匹配,把訊息**給完全匹配
routingkey
的queue
。- topic:該
exchange
會根據**規則
routingkey
進行模糊匹配,把訊息**給匹配
routingkey
的queue
,模糊匹配支援和
#,其中匹配乙個詞,
#匹配乙個或多個詞。—
-注意:
rabbitmq
中,模糊匹配必須以小數點分隔,如
test.*
或test.*.abc
或test.#
或test.#.abc
,不支援
test*
,也不支援
test.*abc
exchange常用引數:
durable:是否持久化,如果設定為
false
,在rabbitmq
重啟後,該
exchange
會消失,需要重新建立。
autodelete:是否自動刪除,如果設定為
true
,並且繫結了
queue
或其它exchange
,那麼在最後乙個取消繫結事件後,該
exchange
會自動刪除自己。
internal:如果設定為
true
,該exchange
將不能用於接收生產者訊息,只能用於繫結到其它
exchange
。alternate-exchange:配置值為另乙個
exchange
,當該exchange
收到的訊息,無法**(沒有匹配的
route
)時,會**到配置的這個
exchange
queue常用引數:
durable:是否持久化,如果設定為
false
,在rabbitmq
重啟後,該
queue
會消失,需要重新建立。
autodelete:是否自動刪除,如果設定為
true
,並且有消費者成功連線,那麼在最後乙個消費者取消連線後,該
queue
會自動刪除自己。
x-expires:閒置時長,毫秒,如果達到閒置時長,該
queue
會自動刪除自己,閒置表示:沒有消費者連線、沒有重新定義、沒有呼叫過
basic.get
,注:可以與
autodelete
共用。x-message-ttl:訊息生存時長,毫秒,如果指定時間內入隊的訊息沒有被消費,那麼該訊息會被拋棄。
x-max-length:處於
ready
狀態的訊息最大個數,訊息數超過該數量時,會刪除最早入隊的訊息,以保證新訊息入隊。
x-max-length-bytes:同上,只是單位變成了訊息占用空間位元組數。
x-max-priority:該
queue
支援的訊息優先級數,例如設定為
10,表示支援
0~10共11
個優先順序,數字越大優先順序越高,越優先投遞,預設為
0,注:非必要情況不建議使用優先順序,會導致額外的
cpu、記憶體和磁碟消耗和額外的
erlang
程序。x-dead-letter-exchange:設定了
messagettl
時,過期的死信會**到這個
exchange
。x-dead-letter-routing-key:對應
x-dead-letter-exchange
的**規則,如果未設定,將使用死信本身的
routingkey
。持久化簡述:
rabbitmq支援
3個級別的持久化:
exchange
、queue
、message
,所以如果要確保已進入mq的訊息不丟失,那麼要在這
3個物件上都設定持久化。
場景示例:
乙個exchange多次繫結到乙個
queue
,routingkey
不同的使用場景:
做的乙個配置中心,給其它專案新增和讀取配置用,不同專案之前的配置有些要隔離,有些有共用,
比如a專案和
b專案都有個配置叫
dbconstr
,儲存資料庫連線串,但是
value
不同;a和b
的公司名要共用,可以:
定義乙個direct型別的
exchange
:exg1
a專案定義乙個
queuea
,跟exg1做2
次繫結:
bind exg1 routingkey:key.0
和 bind exg1 routingkey:key.a
b專案定義乙個
queueb
,跟exg1做2
次繫結:
bind exg1 routingkey:key.0
和 bind exg1 routingkey:key.b
發布公共訊息時,訊息的routingkey為:
key.0
發布a專案的訊息時,訊息的
routingkey
為:key.a
發布b專案的訊息時,訊息的
routingkey
為:key.b
rabbitMq 使用詳解
傳送訊息 所謂的生產者 rabbitmq host 127.0.0.1 listener acknowledge mode manual password 自己的密碼 port 5672 username 自己的使用者名稱 virtual host develop 虛擬伺服器,相當於許可權設定 mq...
RabbitMQ 詳解以及使用場景
mq全稱為message queue,訊息佇列 mq 是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息 針對應用程式的資料 來通訊,而無需專用連線來鏈結它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊,而不是通過直接呼叫彼此來通訊,直接呼叫通常是用於諸如遠端過程呼叫的技術。...
rabbitmq 配置詳解
一般情況下,rabbitmq的預設配置就足夠了。如果希望特殊設定的話,有兩個途徑 乙個是環境變數的配置檔案 rabbitmq env.conf 乙個是配置資訊的配置檔案 rabbitmq.config 注意,這兩個檔案預設是沒有的,如果需要必須自己建立。rabbitmq env.conf 這個檔案的...