RabbitMQ(三) 發布訂閱

2022-07-10 13:09:13 字數 2320 閱讀 2455

rabbitmq(三)

——發布訂閱

一、概述

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

發布訂閱模式如下圖所示:

二、交換機(exchange)

生產者生產完訊息之後,都是將訊息通過channel交給交換機,即生產者並不直接和佇列聯絡。在沒有定義交換機的時候,rabbitmq會啟用內部預定義的交換機。即所有沒有定義交換機,直接採用生產者傳送訊息到佇列的,都是將訊息傳送給預設交換機。

交換機是乙個很簡單的東西,即將生產者傳送的訊息,按照預先定好的規則,**給對應的佇列。

1、廣播傳送

rabbitmq中,交換機的規則有fanout、direct、topic、headers等。本節的發布訂閱模式,主要可以採用fanout模式。

fanout,類似網路技術中,子網的廣播傳送模式。即,fanout模式下,交換機會將資訊傳送給所有與其繫結的佇列,即實現「發布」的功能。通常,再將每個佇列給不同的消費者去消費,實現每個消費者都可以取到該訊息,並各自進行後續相應的處理。

fanout模式如下圖所示:

2、注意事項

1)提前繫結

fanout模式下,需要提前將交換機與佇列進行繫結,乙個交換機可以繫結多個佇列,乙個佇列可以同多個交換機進行繫結。接受到訊息的交換機沒有與任何佇列繫結,則訊息會被拋棄。

2)該模式不需要routing key。

3、使用

1)使用

$channel->exchange_declare('logs', 'fanout', false, false, false);

$channel->basic_publish($msg, 'logs');

其中,第乙個引數是交換機的名字,第二個引數,是交換機的模式。如果沒有定義交換機的名稱、模式,則採用預設的交換機**生產者的訊息。即可以看作,空字串』』也是交換機的乙個名字。

2)檢視當前交換機數量

cli模式下,sudo rabbitmqctl list_exchanges

三、臨時佇列(temporary queues)

當rabbitmq執行時,佇列的名字非常重要,因為其在生產者方,交換機會將資訊按照名字傳送給佇列,而消費者方,消費者需要通過佇列的名字去佇列取訊息。因此,佇列是rabbitmq中連線生產者與消費者的橋梁。

當開始使用時,需要的是乙個空的、未被使用的佇列;當連線斷開,需要將佇列關閉。

1、佇列取名

為了保證佇列是乙個全新的佇列,需要將給佇列取乙個隨機的名字。rabbitmq提供了系統隨機給生成佇列名的方式,如下:

list($queue_name, ,) = $channel->queue_declare("");

即,當queue_declare時沒有指定名字,採用空字串"",則rabbitmq會給佇列取乙個隨機的名字,形如amq.gen-jzty20brgko-hjmujj0wlg,則可以使用$queue_name,其就是佇列的名字。

2、php的list

上述list是php中的list的用法,上述式子表示$channel->queue_declare("");的結果是乙個含有3個元素的陣列,將第乙個元素賦值給$queue_name。

list()不是乙個函式,而是類似array()一樣的用法。

php官方文件中,list的示例:

$info = array('coffee', 'brown', 'caffeine');

list( , , $power) = $info;//$power=』caffeine』

四、繫結(binding)

上述提到,交換機必須與佇列繫結,如果沒有佇列和交換機繫結,交換機會丟棄接收到的訊息。繫結方式如下:

$channel->queue_bind($queue_name, 'logs');

其中,第乙個引數是佇列的名字,第二個引數是交換機的名字。

在cli中,檢視繫結的方式如下:rabbitmqctl list_bindings。

RabbitMQ學習系列 三 發布 訂閱

編寫生產者 編寫消費者 有幾個概念介紹一下 1 生產者 生產者是傳送訊息的使用者的應用程式2 路由 處理生產者訊息發到哪個佇列3 佇列 佇列是儲存訊息的緩衝器4 消費者 消費者是接收訊息的使用者的應用程式 exchangedeclare string exchange,string type,boo...

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

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

RabbitMQ 原文譯03 發布和訂閱

在之前的案例中我們建立了乙個工作佇列,這個工作佇列的實現思想就是乙個把每乙個任務平均分配給每乙個執行者,在這個篇文章我們會做一些不一樣的東西,把乙個訊息傳送給多個消費者,這種模式就被稱作 發布 訂閱 為了說明這個模式,我們將要建立乙個簡單的日誌系統,乙個負責發布訊息,另外乙個負責接收列印他們.在我們...