天天看點

消息中間件Rabbitmq(07)

Rabbitmq主體架構

消息中間件Rabbitmq(07)

首先這個過程走分三個部分, 

1、用戶端(生産消息隊列)。 

2、RabbitMQ服務端(負責路由規則的綁定與消息的分發)。 

3、用戶端(消費消息隊列中的消息);由圖可以看出,一個消息可以走一次網絡卻被分發到不同的消息隊列中,然後被多個的用戶端消費,那麼這個過程就是RabbitMQ的核心機制,RabbitMQ的路由類型與消費模式。

RabbitMQ中間件分為服務端(RabbitMQ Server)和用戶端(RabbitMQ Client),服務端可以了解為是一個消息的代理消費者,用戶端又分為消息生産者(Producer)和消息消費者(Consumer)。

運作原理圖

消息中間件Rabbitmq(07)

Exchange(交換器):用于接受、配置設定消息;

Direct Exchange

在我們之前的日志系統中,所有的消息被廣播給所有的消費者,但是本章的需要是希望有一個程式可以隻接收error級别的日志并儲存到磁盤中,而不用浪費空間去存儲那些info、warning級别的日志。

  我們正在用的廣播模式的交換器并不夠靈活,它隻是不加思索地進行廣播。是以,需要使用direct exchange來代替。直連交換器的路由算法非常簡單:将消息推送到binding key與該消息的routing key相同的隊列。

為了說明這點,請看下圖:

消息中間件Rabbitmq(07)

在該圖中,直連交換器X上綁定了兩個隊列。第一個隊列綁定了綁定鍵orange,第二個隊列有兩個綁定鍵:black和green。在這種場景下,一個消息在布時指定了路由鍵為orange将會隻被路由到隊列Q1,路由鍵為black和green的消息都将被路由到隊列Q2。其他的消息都将被丢失。

多重綁定

消息中間件Rabbitmq(07)

同一個綁定鍵可以綁定到不同的隊列上去,在上圖中,我們也可以增加一個交換器X與隊列Q2的綁定鍵,在這種情況下,直連交換器将會和廣播交換器有着相同的行為,将消息推送到所有比對的隊列。一個路由鍵為black的消息将會同時被推送到隊列Q1和Q2。

Topic Exchange

發送到主題交換器的消息不能有任意的routing key,必須是由點号分開的一串單詞,這些單詞可以是任意的,但通常是與消息相關的一些特征。比如以下是幾個有效的routing key:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit",routing key的單詞可以有很多,最大限制是255 bytes。

  binding key必須與routing key模式一樣。Topic交換器的邏輯與direct交換器有點相似:使用特定路由鍵發送的消息将被發送到所有使用比對綁定鍵綁定的隊列,然而,綁定鍵有兩個特殊的情況,如下:

•表示比對任意一個單詞 #表示比對任意一個或多個單詞   下圖很好地表示這這兩個通配符的用法:

消息中間件Rabbitmq(07)

在這個例子中,我們将發送所有跟動物有關的消息,這些消息将會發送到由三個單詞,兩個點号組成的routing key,第一個單詞了表示的是速度,第二個單詞表示顔色,第三個單詞表示種類:

.."。

  我們建立三個綁定關系:隊列Q1綁定到綁定鍵

.orange.

,隊列Q2綁定到

.

.rabbit和lazy.#。

  總結下來就是:

隊列Q1對橘黃色(orange)顔色的所有動物感興趣;隊列Q2對所有的兔子(rabbit)和所有慢吞吞(lazy)的動物感興趣。

Queue(隊列)

用于存儲生産者的消息;

消息持久化

Rabbit隊列和交換器有一個不可告人的秘密,就是預設情況下重新開機伺服器會導緻消息丢失,那麼怎麼保證Rabbit在重新開機的時候不丢失呢?答案就是消息持久化。

當你把消息發送到Rabbit伺服器的時候,你需要選擇你是否要進行持久化,但這并不能保證Rabbit能從崩潰中恢複,想要Rabbit消息能恢複必須滿足3個條件:

1.投遞消息的時候durable設定為true,消息持久化,代碼:channel.queueDeclare(x, true, false, false, null),參數2設定為true持久化;2.設定投遞模式deliveryMode設定為2(持久),代碼:channel.basicPublish(x, x, MessageProperties.PERSISTENT_TEXT_PLAIN,x),參數3設定為存儲純文字到磁盤;3.消息已經到達持久化交換器上;4.消息已經到達持久化的隊列;

持久化工作原理

Rabbit會将你的持久化消息寫入磁盤上的持久化日志檔案,等消息被消費之後,Rabbit會把這條消息辨別為等待垃圾回收。

持久化的缺點

消息持久化的優點顯而易見,但缺點也很明顯,那就是性能,因為要寫入硬碟要比寫入記憶體性能較低很多,進而降低了伺服器的吞吐量,盡管使用SSD硬碟可以使事情得到緩解,但他仍然吸幹了Rabbit的性能,當消息成千上萬條要寫入磁盤的時候,性能是很低的。是以使用者要根據自己的情況,選擇适合自己的方式。

rabbitmqctl 指令

指令格式

rabbitmqctl [-n ] [-q] []

-n node #預設node名稱是"rabbit@server",如果你的主機名是'server.example.com',那麼node名稱是'rabbit@server' -q #安靜輸出模式,資訊會被禁止輸出

基礎指令

停止在erlang node上運作的rabbitmq,會使rabbitmq停止 stop

停止erlang node上的rabbitmq的應用,但是erlangnode還是會繼續運作的 stop_app

啟動erlan node上的rabbitmq的應用 start_app

等待rabbitmq服務啟動 wait

初始化node狀态,會從叢集中删除該節點,從管理資料庫中删除所有資料,例如vhosts等等。在初始化之前rabbitmq的應用必須先停止 reset

無條件的初始化node狀态 force_reset

輪轉日志檔案 rotate_logs

叢集管理

clusternode表示node名稱,--ram表示node以ram node加入叢集中。預設node以disc node加入叢集,在一個node加入cluster之前,必須先停止該node的rabbitmq應用,即先執行stop_app join_cluster [--ram]

顯示cluster中的所有node cluster_status

改變一個cluster中節點的模式,該節點在轉換前必須先停止,不能把一個叢集中唯一的disk node轉化為ram node stop_app change_cluster_node_type disc | ram start_app

遠端移除cluster中的一個node,前提是該node必須處于offline狀态,如果是online狀态,則需要加--offline參數 forget_cluster_node [--offline]

更新叢集節點 update_cluster_nodes clusternode

同步鏡像隊列 sync_queue queue

取消同步鏡像隊列 cancel_sync_queue queue

使用者管理指令

在rabbitmq的内部資料庫添加使用者 add_user

删除一個使用者 delete_user

改變使用者密碼(也是改變web管理登陸密碼) change_password

清除使用者的密碼,該使用者将不能使用密碼登陸,但是可以通過SASL登陸如果配置了SASL認證 clear_password

設定使用者tags set_user_tags ...

列出使用者 list_users

建立一個vhosts add_vhost

删除一個vhosts delete_vhost

列出vhosts list_vhosts [ ...]

針對一個vhosts給使用者賦予相關權限 set_permissions [-p ]

清除一個使用者對vhosts的權限 clear_permissions [-p ]

列出哪些使用者可以通路該vhosts list_permissions [-p ]

列出該使用者的通路權限 list_user_permissions

政策管理

政策用來控制和修改queues和exchange在叢集中的行為,政策可以應用到vhost。

設定一個policy,"name"為該policy的名字,"pattern"為一個正規表達式,所有比對該正規表達式的資源都會應用該policy,"definition"是policy的定義,為json格式。"priority"為優先權,整數值。set_policy [-p vhostpath] {name} {pattern} {definition} [priority]

清除一個政策 clear_policy [-p ]

列出已有的政策 list_policies [-p ]

消息中間件Rabbitmq(01)

消息中間件Rabbitmq(02)

消息中間件Rabbitmq(03)

消息中間件Rabbitmq(04)

消息中間件Rabbitmq(05)

消息中間件Rabbitmq(06)

繼續閱讀