RabbitMQ-發布/訂閱模式

1、發布/訂閱模式介紹

在普通的生產者、消費者模式,rabbitmq會將消息依次傳遞給每一個消費者,一個worker一個,平均分配,這就是Round-robin調度方式,為了實現更加復雜的調度,我們就需要使用發布/訂閱的方式。

2、交換機(exchange)

RabbitMQ中,消息模型的核心理念就是,生產者從來不能直接將消息發送到隊列,甚至生產者都不知道消息要被發送到隊列中。

相反,生產者只能將消息發送到交換機中,交換機一側從生產者接收消息,一側將消息發送到隊列中,交換機需要知道如何處理接收到的消息,是發送給一個隊列還是多個隊列?這是由交換機的類型決定的。

交換機共分為四類:??direct,?topic,?headers?and?fanout. 本章節以扇形交換機為例說明rabbitmq的使用。

3、fanout交換機的使用方式

扇形交換機,就像你猜測的那樣,他可以將他接收到的全部消息廣播到所有隊列里。

3.1 聲明交換機

首先聲明一個扇形交換機,type參數設置為『fanout』

err = ch.ExchangeDeclare("logs",   // name"fanout", // typetrue,     // durablefalse,    // auto-deletedfalse,    // internalfalse,    // no-waitnil,      // arguments
)

3.2 發送消息到交換機

交換機設定完成后,就可以往該交換機發送消息:

	body := "Hello World!"err = ch.Publish("logs", "", false, false, amqp.Publishing{ContentType: "text/plain",Body:        []byte(body),})

如果要在rabbitmq的頁面上查看發送的消息,需要提前創建一個隊列,并綁定到該交換機[logs]上,就可以查看發送的消息:

扇形交換機的特性,就是他會將收到的消息廣播給所有綁定到該交換機的隊列,我們可以創建多個隊列,并綁定到該交換機上,我們發送一次消息,就會看到,所有綁定到該交換機的隊列中都會有一條消息,先創建三個隊列,并分別綁定到logs交換機:

之后運行腳本,發送兩次消息:

?可以看到,三個隊列當中都有兩條消息。

3.2 扇形交換機發送消息代碼

package mainimport ("fmt"amqp "github.com/rabbitmq/amqp091-go"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("Failed to connect to RabbitMQ")return}defer conn.Close()ch, err := conn.Channel()if err != nil {fmt.Println("Failed to open a channel")return}err = ch.ExchangeDeclare("logs", "fanout", true, false, false, false, nil)if err != nil {fmt.Println("Failed to declare an exchange")return}body := "Hello World!"err = ch.Publish("logs", "", false, false, amqp.Publishing{ContentType: "text/plain",Body:        []byte(body),})if err != nil {fmt.Println("Failed to publish a message")return}
}

?3.2 聲明隊列,用于接收消息

	q, err := ch.QueueDeclare("",    // namefalse, // durablefalse, // delete when unusedtrue,  // exclusivefalse, // no-waitnil,   // arguments)

聲明隊列時,沒有指定隊列名稱,這時,系統會返回一個隨機名稱存儲在q變量中。?

3.3 binding

隊列聲明完成后,需要將該隊列綁定到交換機上,這樣交換機才能把消息廣播給該隊列:

綁定代碼:?

    err = ch.QueueBind(q.Name, // queue name"",     // routing key"logs", // exchangefalse,nil,)

消費者側全部代碼如下:

package mainimport ("fmt"amqp "github.com/rabbitmq/amqp091-go"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {fmt.Println("Failed to connect to RabbitMQ")return}defer conn.Close()ch, err := conn.Channel()if err != nil {fmt.Println("Failed to open a channel")return}err = ch.ExchangeDeclare("logs", "fanout", true, false, false, false, nil)if err != nil {fmt.Println("Failed to declare an exchange")return}q, err := ch.QueueDeclare("",    // namefalse, // durablefalse, // delete when unusedtrue,  // exclusivefalse, // no-waitnil,   // arguments)err = ch.QueueBind(q.Name, // queue name"",     // routing key"logs", // exchangefalse,nil,)msgs, err := ch.Consume(q.Name, // queue"",     // consumertrue,   // auto-ackfalse,  // exclusivefalse,  // no-localfalse,  // no-waitnil,    // args)var forever chan struct{}go func() {for d := range msgs {fmt.Printf(" [x] %s\n", d.Body)}}()fmt.Printf(" [*] Waiting for logs. To exit press CTRL+C")<-forever
}

程序啟動后,控制臺上會增加一個隨機命名的隊列。

?運行【3.2】的生產者程序,發送消息到扇形交換機,這個時候消費者就會同步消費到消息,并進行打印:

4、總結

關于扇形交換機,核心的一點需要我們記住,發送到扇形交換機的消息,他會將消息廣播給所有綁定到該交換機的隊列上,無腦廣播,所有隊列會同時接受到交換機上全部的消息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19704.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EXSI虛擬機新增磁盤并將空間擴充到已有分區

這里寫自定義目錄標題 1、在EXSI虛擬機中新增一塊磁盤配置大小2、確認新磁盤3、格式化新分區4、添加新分區到LVM5、將新增分區添加到已有分區里 1、在EXSI虛擬機中新增一塊磁盤配置大小 注意事項&#xff1a; (1)需確保虛擬機已關閉活處于維護模式&#xff0c;避免數據丟失 (2…

Spring Boot詳解:深入了解與實踐

文章目錄 1. Spring Boot簡介1.1 什么是Spring Boot&#xff1f;1.2 Spring Boot的歷史背景1.3 Spring Boot的核心特點 2. Spring Boot的核心概念2.1 自動配置2.1.1 自動配置原理2.1.2 自定義配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模塊3.1…

網橋、路由器和網關有什么區別

在計算機網絡領域&#xff0c;網橋、路由器和網關都是常見的網絡設備&#xff0c;它們在網絡通信中扮演著不同的角色。雖然它們都有連接不同網絡的功能&#xff0c;但在實際應用中卻具有各自獨特的作用和特點。 1.網橋&#xff08;Bridge&#xff09; 定義&#xff1a;網橋是…

最佳 Mac 數據恢復:恢復 Mac 上已刪除的文件

嘗試過許多 Mac 數據恢復工具&#xff0c;但發現沒有一款能達到宣傳的效果&#xff1f;我們重點介紹最好的 Mac 數據恢復軟件 沒有 Mac 用戶愿意擔心數據丟失&#xff0c;但您永遠不知道什么時候會發生這種情況。無論是意外刪除 Mac 上的重要文件、不小心弄濕了 Mac、感染病毒…

CSS:list-style作用

list-style作用 介紹屬性1. list-style-type2.list-style-image3.list-style-position 常見用法1.設置列表項標記類型2.設置列表項標記圖像3.設置列表項標記位置4.組合使用5.為不同列表項設置不同的樣式6.重置列表樣式 示例 介紹 在Web開發中&#xff0c;list-style 是CSS的一…

ORACLE 查詢SQL優化

1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查詢的執行計劃&#xff0c;這可以幫助你理解查詢是如何被Oracle執行的。基于執行計劃&#xff0c;你可以確定是否存在索引缺失、不必要的全表掃描等問題。 以下是幾種使用EXPLAIN PLAN的方法&#xff1a; 使用EXPLAIN PLAN FOR: 你可以…

【Epoch,Batch,Iteration】深度學習模型訓練相關基礎概念光速理解!

&#x1f525;模型訓練相關基礎概念&#xff01; Epoch: 一次 epoch 代表整個訓練數據集已經被完整地送入神經網絡進行了一輪訓練。通常&#xff0c;模型需要多次 epoch 才能充分學習數據集中的模式。Batch: 由于數據集可能過大&#xff0c;無法一次性全部加載到內存中進行訓練…

解決VSCode右鍵沒有Open In Default Browser問題

在VSCode進行Web小程序測試時&#xff0c;我們在新建的HTML文件中輸入 !會自動生成頁面代碼骨架&#xff0c;寫入內容后&#xff0c;我們想要右鍵在瀏覽器中預覽。發現右鍵沒有“Open In Default Browser”選項。原因是沒有安裝插件。 下面是解決方案&#xff1a;首先在VSCode找…

探索Lora:微調大型語言模型和擴散模型的低秩適配方法【原理解析,清晰簡潔易懂!附代碼】

探索Lora&#xff1a;微調大型語言模型和擴散模型的低秩適配方法 隨著深度學習技術的快速發展&#xff0c;大型語言模型&#xff08;LLMs&#xff09;和擴散模型&#xff08;Diffusion Models&#xff09;在自然語言處理和計算機視覺領域取得了顯著的成果。然而&#xff0c;這…

3d渲染的常用概念和技術,渲染100邀請碼1a12

之前我們介紹了3D渲染的基本原理和流程&#xff0c;這次說下幾個常用概念和技術。 3D渲染中涉及到很多專業的概念和技術&#xff0c;它們決定了渲染質量和效果&#xff0c;常用的有以下幾個。1、光線追蹤 光線追蹤是一些專業渲染器&#xff08;如V-Ray和Corona等&#xff09;…

Android UI控件詳細解析(四)

1.UI控件 1.1 TextView控件 常用屬性 屬性含義id給當前控件定義了一個唯 一標識符layout_width高度&#xff0c;單位&#xff1a;dp (wrap_content, match_parent)layout_height寬度&#xff0c;單位&#xff1a;dp (wrap_content, match_parent)background設置背景圖片text…

Django學習一:創建Django框架,介紹Django的項目結構和開發邏輯。創建應用,編寫主包和應用中的helloworld

文章目錄 前言一、Django環境配置1、python 環境2、Django環境3、mysql環境4、IDE&#xff1a;pycharm 二、第一次創建Django項目1、創建項目door_web_django_system2、運行啟動 三、Django項目介紹1、介紹Django項目結構2、第一個helloword4、django的項目邏輯&#xff08;和j…

React + Taro 項目 實際書寫 感受

之前我總結了部分react 基礎 根據官網的內容 以及Taro 框架的內容 今天我試著開始寫了一下頁面和開發 說一下我的感受 我之前寫的是vue3 今天是第一次真正根據需求做頁面開發 和邏輯功能 代碼的書寫 主體就是開發了這個頁面 雖說這個頁面 很簡單 但是如果你要是第一次寫 難說…

CATIA入門操作案例——壓縮彈簧繪制,螺旋線的使用,法則曲線應用

目錄 引出畫壓縮彈簧畫等距部分畫兩端的壓縮部分曲線縫合和掃掠封閉曲面得實體 總結異形彈簧新建幾何體草圖編輯&#xff0c;畫一條樣條線進行掃掠&#xff0c;圓心和半徑畫出曲面上的螺旋線再次選擇掃掠&#xff0c;圓心和半徑 其他自定義信號和槽1.自定義信號2.自定義槽3.建立…

Aigtek功率放大器的主要性能要求有哪些

功率放大器是電子系統中的重要組件&#xff0c;用于將低功率信號放大到高功率水平。功率放大器的性能直接影響到信號的放大質量和系統的整體性能。下面西安安泰將介紹功率放大器的主要性能要求。 增益&#xff1a;功率放大器應當具有足夠的增益&#xff0c;即將輸入信號的幅度放…

【仿真建模-anylogic】指定服務端口

Author&#xff1a;趙志乾 Date&#xff1a;2024-05-31 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 問題&#xff1a;anylogic動畫模型可以在瀏覽器中進行展示&#xff0c;且訪問端口在模型啟動時隨機生成&#xff1b;為了將其動畫頁面嵌…

讀取YUV數據到AVFrame并用多線程控制幀率

文件樹&#xff1a; 1.xvideo_view.h class XVideoView { public:// 像素格式枚舉enum Format { RGBA 0, ARGB, YUV420P };// 渲染類型枚舉enum RenderType { SDL 0 };// 創建渲染對象的靜態方法static XVideoView* Create(RenderType type SDL);// 繪制幀的方法bool DrawF…

影響生產RAG流水線5大瓶頸

檢索增強生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;已成為基于大型語言模型的生成式人工智能應用的關鍵組成部分。其主要目標是通過將通用語言模型與外部信息檢索系統集成&#xff0c;增強通用語言模型的能力。這種混合方法旨在解決傳統語言模…

無法刪除dll文件

碰到xxxxxx.dll文件無法刪除不要慌&#xff01; 通過Tasklist /m dll文件名稱 去查看它和哪個系統文件綁定運行&#xff0c;發現是explorer.exe。 我們如果直接通過del命令【當然需要在該dll文件所在的路徑中】。發現拒絕訪問 我們需要在任務管理器中&#xff0c;將資源管理器…

如何處理網安發出的網絡安全監督檢查限期整改通知

近期&#xff0c;很多客戶都收到了網安發出的限期整改通知。大家都比較關心的問題是&#xff0c;如何應對處理這些限期整改通知。后續是否有其他的影響&#xff0c;需要如何做進一步的優化整改和調整。今天就這些問題給大家做一些分享。 一. 為什么會有網安的網絡安全檢查 主…