本文主要介紹連接rabbitmq(golang amqp),下面一起看看連接rabbitmq(golang amqp)相關資訊。
1.rabbitmq簡介rabbitmq是amqp(高級消息隊列協議)的開源消息隊列中間件,由erlang編程語言實現。
消息隊列中間件的作用:
應用解耦流量調峰異步處理緩存存儲消息通信提高系統可擴展性
1.1 rabbitmq特點可靠性:通過持久化和傳輸確認,保證消息傳輸的可靠性和可擴展性。多個rabbitmq節點可以組成一個高可用性的集群。隊列可以在rabbitmq集群中鏡像,這樣即使某些節點掛起,隊列仍然可以支持多種協議:原生支持amqp,也可以支持stomp、mqtt等協議豐富的客戶端。常見的編程語言都有客戶端管理接口。它帶有一個webui界面插件機制。rabbitmq提供了各種插件,可以根據需要擴展插件。
1.2 rabbitmq的基本概念一般來說,rabbit mq是生產者和消費者模型,用于接收、存儲和轉發消息。
生產者:消息的生產者和傳遞方。
消費者:消息的消費者。
rabbitmq代理(rabbitmq mq服務節點。在單機環境中,它代表rabbitmq服務器。
隊列:在rabbitmq中,隊列是存儲消息數據的唯一形式。
綁定:rabbitmq中的綁定是exchange將消息路由到隊列時需要遵循的規則。如果你想指定 交換機e將消息路由到隊列q ,那么q需要綁定到e,綁定操作需要為某些類型的交換機定義可選的路由關鍵字屬性。路由鍵的意義是從發送到交換機的眾多消息中選擇一些消息,路由到綁定隊列。
routingkey:當一個報文被投遞到交換機時,通常會指定一個routingkey,報文的路由規則就是通過這個routing key定義的。routingkey通常意味著生產者和消費者已經就一個密鑰策略達成一致,因此消費者可以合法地從生產者那里獲取數據。此routingkey主要用于交換交換模式設置為direct和topic模式時,扇出模式不使用routingkey。
交換:生產者將消息發送到交換機,交換機將取消它。信息被路由到相應的隊列。有四種類型的開關:扇出、直接、主題和標題。
1.3有四種類型的交換開關:扇出、直接、主題和標題。
1.3.1扇出可以理解為扇形開關。
它將通過這種類型的交換機發送的消息路由到綁定到該交換機的所有隊列,并像風扇一樣傳播到所有隊列。
扇出型交換機忽略routingkey的存在,直接向所有綁定隊列廣播消息。
1.3.2直接可以理解為直接切換。
它根據消息攜帶的routingkey將消息傳遞到相應的隊列。
直接類型的交換是rabbitmq代理的默認類型,它有一個特殊的屬性,對于一些簡單的應用程序非常有用。當使用這種類型的交流,你不 不需要指定路由關鍵字的名稱。在這種類型下創建的隊列有一個默認的路由關鍵字,它通常與隊列同名。1.3.3話題可以理解為主題的切換。
主題切換在routingkey和bindkey匹配規則方面更加靈活,這些規則也將消息路由到routingkey和bindkey匹配的隊列,但是匹配規則具有以下特征:
routingkey是除以的字符串。比如go.log.info,java.log.errorbindkey也是一個字符串除以。但是在bindkey中,可以用兩個特殊字符*和#來匹配一個單詞,用#來匹配多規格單詞(零個或多個單詞)。routingkey和bindkey是一種 模糊匹配 ,所以a 模糊匹配 是必需的。
不匹配的消息將被丟棄或返回給生成器。
1.3.4集管可以理解為頭部開關。
標頭型開關不常用。
標題交換的一個簡單易懂的解釋是:
有時候一個消息的路由操作會涉及到多個屬性,所以使用消息頭比使用路由鍵更容易表達,頭交換就是為此而誕生的。頭交換機使用多個消息屬性而不是路由關鍵字來建立路由規則。通過判斷消息頭的值是否能匹配指定的綁定來建立路由規則。我們可以將一個隊列綁定到頭交換機,并使用多個匹配的頭進行它們之間的綁定。呃).在這種情況下,消息代理必須從應用程序開發人員那里獲得更多信息。換句話說,它需要考慮消息是需要部分匹配還是完全匹配。 還有一條消息上面提到的是 x-match 參數。何時 x-match 被設置為 任何 ,消息頭的任何值都可以滿足條件,而when x-match 被設置為 所有 消息頭的所有值都需要匹配成功。頭交換機可以看作是直接連接交換機的另一種形式。頭交換機可以像直連交換機一樣工作,但區別在于頭交換機的路由規則基于頭屬性值,而不是路由關鍵字。路由關鍵字必須是字符串,但標頭屬性值沒有此限制。它們甚至可以是整數或哈希值(字典)。
1.4 rabbitmq工作流程1.4.1消息產生流程消息產生者與rabbitmq broker建立連接,連接建立后,打開通道聲明切換,并設置相關屬性(切換類型、持久性等。)來聲明隊列。并設置其相關屬性(排他性、持久性、自動刪除等。)將消息從交換機綁定的消息生成器發送到rabbitmq broker,并通過路由鍵進行排隊。該報文包含路由關鍵字、交換機等信息,交換機根據接收到的路由關鍵字成功找到匹配隊列,但未能將該報文存儲在隊列中找到匹配。根據生產者配置的屬性,選擇丟棄或返回生產者關閉通道,關閉連接。1.4.2消息消費流程消費者與rabbitmq broker建立連接。連接建立后,打開一個通道,消費方向rabbitmq broker請求消費方對應隊列中的消息,等待rabbitmq broker響應并交付對應隊列中的消息。當消費者收到消息時,消費者確認消息(ack),rabbitmq broker刪除確認的消息以關閉通道并關閉連接。
2.rabbitmq安裝個人學習推薦使用docker安裝。
直接安裝管理版就行了,搜索圖片。
$ docker搜索rabbit mq:管理
拉鏡像
$碼頭工人拉rabbitmq:manag:拉從library/rabbitmq7b1a6ab2:拉完成37f453d83d8f:拉完整e64e769bc4fd:拉完整c288a913222f:拉完整12addf9c8bf9:拉完整t:拉完整b63d48599313:拉完整05c99d3d2a57:拉完整43665bfbc3f9:拉完整digest: 4c 4b 66 ad 5 ec 40 b2 c 27943 b 9804d 307 bf 31 c 17 c 8537 cd 0 cd 1072362 00 a9cd 2814 status:
啟動rabbitmq容器
$ docker run-d-p 15672 : 15672-p 5672 : 5672-e rabbit mq _ default _ user = admin-e rabbit mq _ default _ pass = admin-name rabbit mq-hos tname = rabbit mq hostone rabbit mq: management參數的含義如下:
-d后臺運行-p端口映射-name指定容器名rabbitmq_default_user指定用戶帳號,不指定guestabitmq _ default _ pass的默認用戶密碼,不指定guest的默認用戶密碼。
訪問 p: 15672是rabbitmq的webui界面,默認用戶名密碼為guest/guest。
3.去吧,拉比github.com/streadway/amqp tmq客戶推薦的依賴包
演示的目錄結構如下:
$樹。├──消費者│└──consumer.go├──go.mod├──go.sum├──lib│├──common-func . go│└──error.go├──生產者│ └── producer.go├──任務│ └── task.go└──工人└──工人. go
3.1客戶端連接//rabbit mq conn get rabbit mq broker連接funcrabbit mq conn(conn * amqp . connection,err error){ var(user string = 行政及管理pwd字符串= 行政及管理主機字符串= xx . xx . xx . xx 端口字符串= 5672 )網址: = ;amqp:// 用戶 : 殘疾人和殘疾人協會@ 主持人 : 港口和碼頭/ /new connection conn,err = amqp。撥號(url)return}
3.2使用簡單隊列模式的基本隊列是rabbitmq的常規用法。簡單理解就是消息生產者將消息發送到一個隊列,然后消息消費者從隊列中讀取消息。
當多個使用者訂閱同一個隊列時,隊列中的消息會平均分配給多個使用者進行處理。
首先,定義消息的生產者:
鍵入簡單的演示結構{ name string ` json : 姓名和名稱json : addr `} func main{//連接rabbitmq服務器conn,erricoh 5-@ .com = lib . rabbit mq connlib . error handle(err,lib . errconnectabbit)defer conn . close//新建一個channelch,err: = conn . channellib . error handle(呃,lib。erroropenchannel) defender ch。close//聲明或創建一個隊列來保存消息q,err : = ch . queue declare( 簡單: queue ,//namefalse,// durablefalse,unusedfalse時刪除,// exclusivefalse,// no-waitnil,// argument)lib。錯誤句柄(err,lib。errdeclaqueue)data : = simpl: ;tom;,addr: 上海 ,}databyt:= json。封送(數據)庫。錯誤句柄(err,lib。errmarshaljson)err = ch。發布( ,// exchangeq。name,// routing keyfalse,// mandatoryfalse,//immediateamqp.publishing{cont: ;t:數據字節,},)lib。錯誤句柄(err,lib。errpublishmsg)日志。printf( [x]發送了% s 數據字節)}
定義消息使用者:
func main {conn,:= lib。rabbitmqconnlib。錯誤句柄(err,lib。errconnectrabbit)defer conn . closech,err : = conn . channellib。錯誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( simple: queue ,// namefalse,//durablefalse,//未使用時刪除false,//exclusive false,//no-waitnil,//args) lib.errorhandle (err,lib . errdeclaqu:= ch。consume(q.name,//queue ,// consumertrue,// auto-ackfalse,// exclusivefalse,// no-localfalse,// no-waitnil,// args)lib。錯誤句柄(err,lib。errregisterconsumer)go func{ for d : = rang: % s ,d.body)}}log。printf( [*]等待消息。要退出,請按ctrl c )選擇{}}
我們啟動一個生產者和一個消費者,運行結果是:
$ go run producer . go 2022/05/19 16 : 06 : 25[x]已發送{ 姓名和名稱: 湯姆 , addr : 上海 }
$ go run consumer . go 2022/05/19 16 : 06 : 33[*]等待消息。要退出,請按ctrl c 2022/05/19 16 : 06 : 33收到一個m:姓名和名稱: 湯姆 , addr : 上海 }
3.3工作隊列工作隊列也叫任務隊列。
任務隊列是為了避免等待一些耗時的任務被執行,而是將需要執行的任務封裝成消息發送到工作隊列,后臺運行的工作進程取出任務消息并執行。關閉任務
多個后臺工作進程同時進行,它們共享任務(搶占)。
定義用于生成任務消息的任務生成器。
func body from(args[]string)string { var s stringif(l:], )}return s}func main {conn,:= lib。rabbitmqconnlib。錯誤句柄(err,lib。errconnectrabbit)defer conn . closech,err : = conn . channellib。錯誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( task: queue ,// namefalse,// durablefalse,unusedfalse時刪除,// exclusivefalse,// no-waitnil,// args)lib。錯誤句柄(err,lib。errdeclaqueue)body : = body from(os。args)err = ch。發布( ,q.name,false,false,amqp.publishing{cont: ;t: amqp.p:[]byte(body),},)lib。錯誤句柄(err,lib。errpublishmsg)日志。printf( 發送了% s ,正文)}
定義員工:
func main {conn,:= lib。rabbitmqconnlib。錯誤句柄(err,lib。埃爾科內ctrabbit)defer conn.closech,err : = conn . channellib。錯誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( task: queue 假,假,假,假,零)lib。錯誤句柄(err,lib。errdeclaqueue)///將預取計數器設置為1//將消息分發到并行處理中的不同工作進程err = ch.qos (1,//預取計數0,//預取大小fals:= ch。消費(q . name ,false,false,false,false,nil),lib。錯誤句柄(err,lib。errregisterconsumer)forever : = make(chan bool)go func{ for d : = rang: % s 主體)日志。printf( 完成和)d.ack(false)}}log。printf( [*]等待消息。要退出,請按ctrl c )-永遠}
我們打開兩個worker,運行結果是:
$ go run task . go hello world 2022/05/19 16 : 03 : 31發送hello world $ go run task . go hello golang 2022/05/19 16 : 03 : 53發送h:03:59發來hello rabbitmq
$ go運行worker . go 2022/05/19 16 : 03 : 44[*]等待消息。要退出,請按ctrl c 2022/05/19 16 : 03 : 44收到m: hello world 2022/05/19 16 : 44 done 2022/05/19 16 : 03 : 53收到m: hello golang 2022/05/19 16 echo
$ go運行worker . go 2022/05/19 16 : 03 : 47[*]等待消息。要退出請按ctrl c 2022/05/19 16 : 03 : 59收到一個m:你好rabbit mq 2022/05/19 16 : 03 : 59完成
同時可以查看rabbitmq的w
blog . csdn . net/ _ 42402854/articl
標簽:
信息排隊
了解更多連接rabbitmq(golang amqp)相關內容請關注本站點。
sata固態硬盤分區教程圖解,雙SATA如何對第二塊硬盤分區
win7旗艦版正式版(win7 正版)
windows10有哪幾個版本,Windows10怎么退回上版本
三星9格怎么解鎖,怎樣解開手機九格鎖屏
windows11魔獸爭霸(電腦玩不了魔獸爭霸)
go連接rabbitmq(golang amqp)
在電腦上看手機的內容(如何在電腦上看手機上的文件)
mac m1 安裝windows(2020款macbook安裝win10)
谷歌星空怎么用,谷歌相機星空模式
nvme轉sata3硬盤盒,求助m2接口如何轉換SATA3
魅族怎么反饋bug,魅族反饋在哪里
iphone上安裝安卓模擬器(蘋果如何安裝安卓模擬器)
w10怎么取消圖標上的小盾牌(window10怎么去掉圖標盾牌)
win7更改右鍵菜單(如何設置電腦右鍵菜單背景)
雷蛇鍵盤fn鍵在哪(怎么打開雷蛇鍵盤)
五千多的辦公筆記本哪個好,五千左右筆記本電腦什么品牌好點
酷比魔方i10拆機教程,酷比魔方平板機殼咋拆開
如何給蘋果電腦安裝win10(蘋果電腦window10安裝教程)
炒股用什么筆記本比較好(炒股用筆記本電腦推薦)
手機上填電子表格下載什么(電子表格用手機怎么填寫)