日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ (五) 订阅者模式之分发模式 ( fanout )

發(fā)布時(shí)間:2024/8/26 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ (五) 订阅者模式之分发模式 ( fanout ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面講到了簡(jiǎn)單隊(duì)列和工作隊(duì)列.

這兩種隊(duì)列有個(gè)非常明顯的缺點(diǎn) : 生產(chǎn)者發(fā)送的消息,只能進(jìn)入到一個(gè)隊(duì)列.

消息只能進(jìn)入到一個(gè)隊(duì)列就意味著消息只能被一個(gè)消費(fèi)者消費(fèi).

盡管工作隊(duì)列模式中,一個(gè)隊(duì)列中的消息可以被多個(gè)消費(fèi)者消費(fèi),但是,具體到每一條消息,卻只能被一個(gè)消費(fèi)者消費(fèi).

如果想要一個(gè)消息被多個(gè)消費(fèi)者消費(fèi),那么生產(chǎn)者就必須把這條消息發(fā)送到多個(gè)隊(duì)列中去.

RabbitMQ 在這個(gè)點(diǎn)的設(shè)計(jì)是 :

在生產(chǎn)者和隊(duì)列兩者之間加入了一個(gè)叫做"交換機(jī)"的東西.

生產(chǎn)者發(fā)送消息時(shí),不直接發(fā)送到隊(duì)列,而是發(fā)送到"交換機(jī)"(其實(shí)簡(jiǎn)單隊(duì)列和工作隊(duì)列也是這樣的...前面的文章有提到,它們用的是默認(rèn)的交換機(jī)).

"交換機(jī)"再根據(jù)聲明的類(lèi)型(fanout,direct,topic,headers),轉(zhuǎn)發(fā)給符合要求的隊(duì)列.

這里有個(gè)非常重要的知識(shí)點(diǎn):

交換機(jī)只是一個(gè)"中轉(zhuǎn)的機(jī)器",它不是一個(gè)消息隊(duì)列,它沒(méi)有存儲(chǔ)消息的能力.這點(diǎn)很重要!

這意味著,當(dāng)生產(chǎn)者把消息發(fā)送給某個(gè)交換機(jī)時(shí),如果這時(shí)候,這個(gè)交換機(jī)沒(méi)有被任何隊(duì)列綁定,那么這些消息將會(huì)丟失!

?

這種利用交換機(jī),將消息"發(fā)送"到多個(gè)隊(duì)列的模式叫做 : 訂閱者模式.

這篇文章主要介紹訂閱者模式中的分發(fā)模式,

這種模式下,消息會(huì)被所有消費(fèi)者消費(fèi).也就是說(shuō),只要是"綁定"到某個(gè)交換機(jī)的隊(duì)列,都會(huì)收到生產(chǎn)者發(fā)送到該交換機(jī)的消息.

?

生產(chǎn)者

public class Producer{/// <summary>/// 交換機(jī)名稱(chēng)/// </summary>private const string ExchangeName = "test_exchange_fanout";public static void Send(){IConnection connection = ConnectionHelper.GetConnection();IModel channel = connection.CreateModel();//聲明交換機(jī),第2個(gè)參數(shù)為交換機(jī)類(lèi)型channel.ExchangeDeclare(ExchangeName, "fanout", false, false, null); for (int i = 0; i < 50; i++){string msg = "hello world " + i;//第2個(gè)參數(shù)為路由鍵,這種模式顯然不需要路由鍵了,因?yàn)槲覀兪前严l(fā)送到所有綁定到該交換機(jī)的隊(duì)列.channel.BasicPublish(ExchangeName, "", null, Encoding.Default.GetBytes(msg));Console.WriteLine($"send {msg}");}channel.Close();connection.Close();}}

?

消費(fèi)者1

public class Consumer1{private const string QueueName = "test_exchange1_queue";private const string ExchangeName = "test_exchange_fanout";public static void Receive(){IConnection connection = ConnectionHelper.GetConnection();IModel channel = connection.CreateModel();channel.QueueDeclare(QueueName, false, false, false, null);//將隊(duì)列綁定到交換機(jī)上 channel.QueueBind(QueueName, ExchangeName, "", null);//添加消費(fèi)者EventingBasicConsumer consumer = new EventingBasicConsumer(channel);//注冊(cè)事件consumer.Received += (s, e) =>{byte[] bytes = e.Body;string str = Encoding.Default.GetString(bytes);Console.WriteLine("consumer1 : " + str);};channel.BasicConsume(QueueName, true, "", false, false, null, consumer);}}

?

消費(fèi)者2

只有這兩句不一樣

private const string QueueName = "test_exchange2_queue";Console.WriteLine("consumer2 : " + str);

?

運(yùn)行結(jié)果就不上圖.

?

轉(zhuǎn)載于:https://www.cnblogs.com/refuge/p/10350875.html

總結(jié)

以上是生活随笔為你收集整理的RabbitMQ (五) 订阅者模式之分发模式 ( fanout )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。