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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在前一個教程中,我們創建了一個工作隊列。工作隊列背后的假設是每個任務會被交付給一個【工人】。在這一部分我們將做一些完全不同的事情--我們將向多個【消費者】傳遞信息。這種模式被稱為“發布/訂閱”。

?? 為了說明這種模式,我們將構建一個簡單的日志系統。它將包括兩個程序,第一個將發出日志消息,第二個將接收并打印它們。

?? 在我們的日志系統中每個接收程序的運行副本都會得到消息。這樣我們就可以運行一個接收者程序,將日志記錄到磁盤;同時我們可以運行另一個接收者程序,并在屏幕上看到打印出來的日志。

?? 從本質上講,已發布的日志消息將被廣播到所有的接收者程序。

1、消息交換機【Exchange】

?? 在教程的前面部分,我們從隊列中發送和接收消息。在RabbitMQ中,現在是時候引入全消息模型。

?? 讓我們快速看看我們以前的教程講了什么:

?? 【生產者】:就是一個用于發送消息的用戶程序
? ?
?? 【消費者】:就是一個用于接收和使用消息的用戶程序

?? 【隊列】:是一個暫存消息的緩存區

?? RabbitMQ消息傳遞模型的核心思想是,【生產者】不直接發送任何信息到隊列。事實上,【生產者】根本就不知道消息是否會被傳送到任何隊列。

?? 相反,【生產者】只能發送消息到【消息交換機】。交換是件很簡單的事。一方面它接收來自【生產者】的消息,另一方面是將接收到消息推送到隊列中?!鞠⒔粨Q機】必須知道它如何處理接收消息的確切方法。是否應該發送到特定隊列?它應該被發送到多個隊列呢?或者它應該被丟棄。該規則由【消息交換機】的類型來定義。

?這里有一些可用的【消息交換機】的類型:【Direct】直接,【Topic】主題,【Headers】標題和【Fanout】扇出。我們將集中關注最后一個-【Fanout】扇出。讓我們創建一個這種類型的【消息交換機】,并給它命名為Logs:

channel.ExchangeDeclare("logs", "fanout");


?? 【Fanout】類型的【消息交換機】非常簡單。正如你從名字可能猜出的,它只是傳播它收到的所有消息去它知道所有的隊列中。這正是我們需要我們的日志記錄器。

??? 顯示【消息交換機】的列表:

??? 使用Rabbitmqctl列出在服務器上可以運行的最有用的【消息交換機】

sudo rabbitmqctl list_exchanges

??? 在這個列表中會有一些amq.*【消息交換機】和默認(未命名)消息交換機。這些都是默認創建的,但現在不太可能需要使用它們。

????默認的消息交換機

??? 在教程前面的部分我們隊【消息交換機】是一無所知,但是我依然可以發送消息去想去的隊列,那是因為我們使用了默認的【消息交換機】,這些默認的消息 交換機我用使用兩個雙引號“”來標識。

?? 我們回憶一下以前是如何發送消息的:

var message = GetMessage(args);var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);

?? 第一個參數是【消息交換機】的名稱。空字符串表示默認或未命名的消息交換機:消息會被路由到指定的routingkey名稱的隊列,如果它存在的話。

?? 現在,我們可以發布到我們命名的【消息交換機】:

var message = GetMessage(args);var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchange: "logs", routingKey: "", ?basicProperties: null, body: body);


2、臨時隊列

?? 也許你還記得以前我們使用的隊列所指定的名稱(記得Hello和task_queue嗎?)對我們來說,能夠給一個隊列指定名稱是至關重要的--因為我們需要把【Worker】指向同一個隊列。如果要在【生產者】和【消費者】之間共享隊列,給隊列命名是很重要的。

??? 但這不是我們的日志記錄器的情況。我們想聽到所有的日志消息,而不僅僅是其中的一個子集。我們也只對當前剛剛收到的消息感興趣,而不是對舊的。為了解決上述問題,我們需要做兩件事。

?? 首先,無論何時當我們連接到Rabbit的時候,我們都需要一個新的并且是空的隊列。要做到這一點,我們可以創建一個具有隨機名稱的隊列,或者,甚至更好一點-讓服務器為我們選擇一個隨機隊列名稱。

?? 其次,一旦我們斷開與【消費者】的隊列就應該自動刪除該隊列。

?? 在.NET客戶端中,當我們沒有為queueDeclare()提供參數時,我們創建了一個具有生成名稱的非持久,排他,自動刪除隊列:

var queueName = channel.QueueDeclare().QueueName;

?? 在這點上,QueueName包含隨機隊列名稱。例如,它可能看起來像amq.gen-jzty20brgko-hjmujj0wlg。

3、綁定【Binding】?

frameborder="0" scrolling="no" style="">

?我們已經創建了一個【Fanout】類型的【消息交換機】和隊列?,F在我們需要告訴【消息交換機】向我們的隊列發送消息?!鞠⒔粨Q機】和【隊列】之間的關系稱為綁定。


channel.QueueBind(queue: queueName, exchange: "logs", routingKey: "");


?? 從現在開始,日志的【消息交換機】就可以將消息推送到我們定義的隊列中去了。

?? 我們可以通過以下語句查看【binding】列表數據:
??

rabbitmqctl list_bindings

4、把所有的代碼整合到一起

?? 【生產者】的程序,它發出的日志消息,看起來并沒有和以前的教程有很大的不同。最重要的變化是,我們現在想發送的消息是到達我們指定名稱的日志【消息交換機】,而不是無名的。我們在發送消息的時候需要提供一個routingkey表示的名稱,但【Fanout】類型的【消息交換機】會容忽視該routingKey的值的。這里有EmitLog.cs文件代碼:

相關文章:

  • RabbitMQ系列教程之一:我們從最簡單的事情開始!Hello World

  • RabbitMQ系列教程之二:工作隊列(Work Queues)

  • 如何優雅的使用RabbitMQ

  • .NET 使用 RabbitMQ 圖文簡介

  • RabbitMQ 高可用集群搭建及電商平臺使用經驗總結

  • 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驅動連接

  • RabbitMQ消息隊列應用

  • 體驗Rabbitmq強大的【優先級隊列】之輕松面對現實業務場景

原文地址:http://www.cnblogs.com/PatrickLiu/p/6943830.html


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

總結

以上是生活随笔為你收集整理的RabbitMQ系列教程之三:发布\/订阅(Publish\/Subscribe)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。