RabbitMQ學習系列 三 發布 訂閱

2021-08-20 07:54:25 字數 2445 閱讀 4630

編寫生產者

編寫消費者

有幾個概念介紹一下

1、生產者

生產者是傳送訊息的使用者的應用程式
2、路由

處理生產者訊息發到哪個佇列
3、佇列

佇列是儲存訊息的緩衝器
4、消費者

消費者是接收訊息的使用者的應用程式

exchangedeclare(string exchange, string type, boolean durable, boolean autodelete, maparguments)
exchange :路由名

type : 路由型別

durable: 是否持久化

autodelete:是否自動刪除

arguments: 其它引數

1、fanout

廣播。這個型別的路由會忽略routingkey。收到生產者訊息後會直接傳送給繫結在該路由上的所有佇列

2、direct

單播。該型別的路由會根據routingkey去匹配佇列,將訊息傳送給該路由上繫結的並且routingkey完全匹配上的佇列

3、topic

多播。該型別路由的routingkey可以使用萬用字元進行匹配。即 * 代表乙個單詞,# 代表多個單詞。routingkey 的定義不能是任意字元,只能是由點號分隔的字串,如: 「 stock.usd.nyse 」,「 nyse.vmw 」,「 quick.orange.rabbit 」。

如下圖

q1佇列的與路由繫結的routingkey 是*.orange.*

q2佇列的與路由繫結的routingkey 是*.*.rabbit 與 lazy.#

如果我們傳送訊息時指定的routingkey為:quick.orange.rabbit ,則訊息會被路由傳送到q1與q2兩個佇列中。

如果我們傳送訊息時指定的routingkey為:lazy.brown.fox ,則訊息會被路由傳送到q2佇列

如果指定的routingkey為 lazy.pink.rabbit,也會被傳送到q2,但只會傳送一次,即使它匹配到了兩個繫結的routingkey

這種型別的路由不處理路由鍵,而是根據傳送訊息的headers屬性進行匹配,在佇列繫結交換機的時候會指定一組鍵對值;

queuebind(string queue, string exchange, string routingkey)
前面我們說過 rabbitmq中的訊息傳遞模型的核心思想是生產者永遠不會將任何訊息直接傳送到佇列中。所以我們每個佇列都需要繫結在乙個路由上。從生產者傳送到該路由的訊息只會被傳遞到與路由繫結的佇列上。繫結時還需要指定乙個routingkey,路由根據發布訊息時傳遞過來的routintkey來匹配到相應佇列並傳送訊息到該佇列中。

queue: 佇列名

exchange: 路由名

routingkey: 佇列與路由繫結的key

public

class

emitlogtopic

}

傳送訊息時我們指定的routingkey為 rabbit.log.error 因為是topic型別的路由,所以需要用點分隔的形式寫routingkey ,如果是direct型別則不需要。

public

class

receivedlogstopic

};channel.basicconsume(queuesname,true,consumer);}}

這裡佇列繫結topic 型別路由時指定的匹配規則為*.log.*前面生產者傳送時的routingkey 為 rabbit.log.error 所以這條訊息會被路由監聽到。 如果我們將繫結的匹配規則修改為 log.# 並重新啟動乙個消費者b,通過生產者再次傳送訊息,則消費者b不會監聽到這條訊息,因為routingkey 無法匹配上,路由不會把這條訊息傳遞給消費者b

RabbitMQ(三) 發布訂閱

rabbitmq 三 發布訂閱 一 概述 rabbitmq的發布訂閱 publish subscribe 其將生產者和消費者進一步解耦,生產者生產訊息後,交付給交換機,消費者上線後,主動主動去佇列中取資料進行處理。該模式也符合上一節工作佇列中的ack 預取等規則。發布訂閱模式如下圖所示 二 交換機 ...

RabbitMQ學習筆記(三) 發布與訂閱

在我們使用手機傳送訊息的時候,即可以選擇給單個手機號碼傳送訊息,也可以選擇多個手機號碼,訊息。前面學習工作佇列的時候,我們使用的場景是乙個訊息只能被乙個消費者程式例項接收並處理,但是如果想要 訊息,僅憑之前學到的東西是實現不了的。所以這裡需要引入rabbitmq的發布與訂閱模式。rabbitmq通訊...

RabbitMQ入門學習系列 四 發布訂閱模式

發布訂閱模式 把訊息傳送給多個訂閱者。也就是有多個消費端都完整的接收生產者的訊息 換句話說 把訊息廣播給多個消費者 rabbitmq不傳送訊息給佇列,生產者也不知道訊息傳送到佇列 生產者只傳送訊息到exchange 交換器,exchange一方面從生產者接收訊息,另一方面把訊息推送到佇列中。exch...