RabbitMQ訊息佇列(一基本概念和常用命令)
常用命令
/etc/init.d/rabbitmq-server start|stop|restart|reload
rabbitmqctl add_vhost vhostname ##建立vhost
rabbitmqctl delete_vhost vhostname ##刪除vhost
rabbitmqctl list_vhosts ##變數所有的虛擬主機資訊
rabbitmqctl add_user username passwd ##新增一個使用者
rabbitmqctl change_password username password ##修改使用者密碼
rabbitmqctl set permissions -p v_host user ".*" ".*" ".*" ##繫結許可權,並且具備讀寫的許可權
rabbitmqctl list_quenens ##顯示所有佇列
生產者建立訊息,釋出到代理伺服器(rabbitmq),訊息包括有效載荷和標籤
有效載荷時實際要傳輸的資料,標籤描述了有效載荷
消費者連線到代理伺服器,訂閱佇列,消費者接收訊息時,只得到有效載荷,得不到標籤
basic.consume:訂閱訊息
basic.get獲取單條訊息
basic.ack確認接收訊息
basic.reject拒絕接收訊息,引數設為true轉發到下一個消費者,設為false從訊息佇列刪除
queue.declare建立佇列,引數exclusive設為true時,變為私有佇列,auto_delete,當最後一個消費者取消訂閱時,欄位刪除訊息,一般和exclusive一起使用,你的消費者斷開連線時,佇列被移除
宣告佇列時,如已存在,rabbit什麼都不做,返回true如果只想檢測佇列存在,將passive引數設為true,此時,存在->true,不存在返回一個錯誤,不建立佇列
rabbit會丟棄沒有消費者的佇列
rabbit的許可權控制是以vhost為單位的,在叢集上建立vhost時,整個叢集上都會建立該vhost
rabbitmqctl vhost_list ##檢視所有的vhost節點
rabbitmqctl add_vhost [hostname] ##新增一個vhost
rabbitmqctl delete_vhost [hostname] ##刪除一個vhost
可以直接執行rabbitmqctl 來管理自己的mq節點,也可以指定-n [email protected][servername] 來管理遠端節點
servername可以是ip或者域名
佇列和交換器的durable屬性預設false,斷電重啟之後重新建立佇列,訊息丟失,將它設為true可以不用重建佇列
持久化訊息:能從伺服器崩潰中恢復的訊息,
(1)訊息釋出前,把它的投遞模式設定為2標記持久化,
(2)傳送到持久化的交換器
(3)並投放到持久化佇列
恢復:寫入磁碟上的持久化檔案,rabbit會在訊息提交到日誌後才傳送響應,但,若訊息路由到了非持久化佇列,RQM會自動從永續性日誌刪除,並無法再重啟中自動恢復
消費之後,標記為待垃圾回收
消費之前,RMQ重啟,會自動重建佇列和交換器,並重播日誌中的訊息到對應的地方
AMQP的事務概念:把通道設定為事務模式後,傳送一條命令後的一系列命令的執行取決於第一條命令是否執行成功,如果失敗,後邊的命令不會執行,填補了訊息釋出到持久化到磁碟這段時間的伺服器宕機,但會大大損耗rabbit的效能
confirm機制:寫入磁碟之後傳送包含訊息id的確認訊息,否則傳送not ack訊號
交換機的四種類型:
direct,fanout,topic,headers(直接匹配amqp的header,而非路由鍵)
direct如果路由鍵匹配,就傳送到相應佇列
$channel ->basic_publish($msg,'','queue_name);
$msg要傳送的資訊內容 ''指定使用預設交換器 'queue_name'路由鍵
預設的路由器不能滿足時,使用exchange.declare來宣告佇列
broker訊息佇列的伺服器實體
exchange交換機,指定訊息投入到哪個佇列裡邊
queue訊息佇列載體,每個訊息的投放之處
binding把exchage和queue對應起來
routing key路由關鍵字,exchange根據這個關鍵字進行訊息的投遞
vhost虛擬主機,一個broker可以開設多個vhost,用於不同使用者的許可權分離
producer:訊息生產者,就是投遞訊息的程式
consumer:訊息消費者,就是接收訊息的程式
channel:訊息通道,可以建立多個channel,每個channel代表一個會話
使用大致流程:
客戶端連線到訊息伺服器,開啟一個channel(會話)
客戶端宣告一個exchange,設定相關熟悉
客戶端宣告一個queue並設定相關屬性
客戶端使用routing key,在exchange和queue之間建立繫結關係
客戶端投遞訊息
type:direct binding key和routing key完全一致時投遞
topic:用於模糊匹配,*匹配一個單詞 #用於匹配多個,可以是0個,匹配不到的訊息將被廢棄
headers:不根據routing key和binding key決定訊息的轉發,而是根據傳送訊息中header資訊
fanout:廣播模式,最簡單的模式,直接忽略routingkey
注意一點:指定了持久化的交換機,在重新啟動時才能重建,否則需要客戶端重新宣告生成才可以
#交換機的持久化並不等於訊息的持久化,只有在持久化佇列中的訊息,才能持久化,如果沒有佇列,訊息是沒有地方儲存的,訊息本身在投遞的時候也是有一個持久化標誌的,php預設投遞到持久化交換機的訊息就是持久的訊息,不用特別指定
#多個客戶端監聽同一個佇列的時候採用的是輪詢的機制
###
新增使用者:rabbitmqctl add_user rainbird password
新增許可權:rabbitmqctl set_permisions -p "/" rainbird ".*"".*"".*"
刪除測試使用者:rabbit delete_user guest