go連接rabbitmq(golang amqp)

    本文主要介紹連接rabbitmq(golang amqp),下面一起看看連接rabbitmq(golang amqp)相關(guān)資訊。
    1.rabbitmq簡(jiǎn)介rabbitmq是amqp(高級(jí)消息隊(duì)列協(xié)議)的開源消息隊(duì)列中間件,由erlang編程語(yǔ)言實(shí)現(xiàn)。
    消息隊(duì)列中間件的作用:
    應(yīng)用解耦流量調(diào)峰異步處理緩存存儲(chǔ)消息通信提高系統(tǒng)可擴(kuò)展性
    1.1 rabbitmq特點(diǎn)可靠性:通過(guò)持久化和傳輸確認(rèn),保證消息傳輸?shù)目煽啃院涂蓴U(kuò)展性。多個(gè)rabbitmq節(jié)點(diǎn)可以組成一個(gè)高可用性的集群。隊(duì)列可以在rabbitmq集群中鏡像,這樣即使某些節(jié)點(diǎn)掛起,隊(duì)列仍然可以支持多種協(xié)議:原生支持amqp,也可以支持stomp、mqtt等協(xié)議豐富的客戶端。常見的編程語(yǔ)言都有客戶端管理接口。它帶有一個(gè)webui界面插件機(jī)制。rabbitmq提供了各種插件,可以根據(jù)需要擴(kuò)展插件。
    1.2 rabbitmq的基本概念一般來(lái)說(shuō),rabbit mq是生產(chǎn)者和消費(fèi)者模型,用于接收、存儲(chǔ)和轉(zhuǎn)發(fā)消息。
    生產(chǎn)者:消息的生產(chǎn)者和傳遞方。
    消費(fèi)者:消息的消費(fèi)者。
    rabbitmq代理(rabbitmq mq服務(wù)節(jié)點(diǎn)。在單機(jī)環(huán)境中,它代表rabbitmq服務(wù)器。
    隊(duì)列:在rabbitmq中,隊(duì)列是存儲(chǔ)消息數(shù)據(jù)的唯一形式。
    綁定:rabbitmq中的綁定是exchange將消息路由到隊(duì)列時(shí)需要遵循的規(guī)則。如果你想指定 交換機(jī)e將消息路由到隊(duì)列q ,那么q需要綁定到e,綁定操作需要為某些類型的交換機(jī)定義可選的路由關(guān)鍵字屬性。路由鍵的意義是從發(fā)送到交換機(jī)的眾多消息中選擇一些消息,路由到綁定隊(duì)列。
    routingkey:當(dāng)一個(gè)報(bào)文被投遞到交換機(jī)時(shí),通常會(huì)指定一個(gè)routingkey,報(bào)文的路由規(guī)則就是通過(guò)這個(gè)routing key定義的。routingkey通常意味著生產(chǎn)者和消費(fèi)者已經(jīng)就一個(gè)密鑰策略達(dá)成一致,因此消費(fèi)者可以合法地從生產(chǎn)者那里獲取數(shù)據(jù)。此routingkey主要用于交換交換模式設(shè)置為direct和topic模式時(shí),扇出模式不使用routingkey。
    交換:生產(chǎn)者將消息發(fā)送到交換機(jī),交換機(jī)將取消它。信息被路由到相應(yīng)的隊(duì)列。有四種類型的開關(guān):扇出、直接、主題和標(biāo)題。
    1.3有四種類型的交換開關(guān):扇出、直接、主題和標(biāo)題。
    1.3.1扇出可以理解為扇形開關(guān)。
    它將通過(guò)這種類型的交換機(jī)發(fā)送的消息路由到綁定到該交換機(jī)的所有隊(duì)列,并像風(fēng)扇一樣傳播到所有隊(duì)列。
    扇出型交換機(jī)忽略routingkey的存在,直接向所有綁定隊(duì)列廣播消息。
    1.3.2直接可以理解為直接切換。
    它根據(jù)消息攜帶的routingkey將消息傳遞到相應(yīng)的隊(duì)列。
    直接類型的交換是rabbitmq代理的默認(rèn)類型,它有一個(gè)特殊的屬性,對(duì)于一些簡(jiǎn)單的應(yīng)用程序非常有用。當(dāng)使用這種類型的交流,你不 不需要指定路由關(guān)鍵字的名稱。在這種類型下創(chuàng)建的隊(duì)列有一個(gè)默認(rèn)的路由關(guān)鍵字,它通常與隊(duì)列同名。1.3.3話題可以理解為主題的切換。
    主題切換在routingkey和bindkey匹配規(guī)則方面更加靈活,這些規(guī)則也將消息路由到routingkey和bindkey匹配的隊(duì)列,但是匹配規(guī)則具有以下特征:
    routingkey是除以的字符串。比如go.log.info,java.log.errorbindkey也是一個(gè)字符串除以。但是在bindkey中,可以用兩個(gè)特殊字符*和#來(lái)匹配一個(gè)單詞,用#來(lái)匹配多規(guī)格單詞(零個(gè)或多個(gè)單詞)。routingkey和bindkey是一種 模糊匹配 ,所以a 模糊匹配 是必需的。
    不匹配的消息將被丟棄或返回給生成器。
    1.3.4集管可以理解為頭部開關(guān)。
    標(biāo)頭型開關(guān)不常用。
    標(biāo)題交換的一個(gè)簡(jiǎn)單易懂的解釋是:
    有時(shí)候一個(gè)消息的路由操作會(huì)涉及到多個(gè)屬性,所以使用消息頭比使用路由鍵更容易表達(dá),頭交換就是為此而誕生的。頭交換機(jī)使用多個(gè)消息屬性而不是路由關(guān)鍵字來(lái)建立路由規(guī)則。通過(guò)判斷消息頭的值是否能匹配指定的綁定來(lái)建立路由規(guī)則。我們可以將一個(gè)隊(duì)列綁定到頭交換機(jī),并使用多個(gè)匹配的頭進(jìn)行它們之間的綁定。呃).在這種情況下,消息代理必須從應(yīng)用程序開發(fā)人員那里獲得更多信息。換句話說(shuō),它需要考慮消息是需要部分匹配還是完全匹配。 還有一條消息上面提到的是 x-match 參數(shù)。何時(shí) x-match 被設(shè)置為 任何 ,消息頭的任何值都可以滿足條件,而when x-match 被設(shè)置為 所有 消息頭的所有值都需要匹配成功。頭交換機(jī)可以看作是直接連接交換機(jī)的另一種形式。頭交換機(jī)可以像直連交換機(jī)一樣工作,但區(qū)別在于頭交換機(jī)的路由規(guī)則基于頭屬性值,而不是路由關(guān)鍵字。路由關(guān)鍵字必須是字符串,但標(biāo)頭屬性值沒(méi)有此限制。它們甚至可以是整數(shù)或哈希值(字典)。
    1.4 rabbitmq工作流程1.4.1消息產(chǎn)生流程消息產(chǎn)生者與rabbitmq broker建立連接,連接建立后,打開通道聲明切換,并設(shè)置相關(guān)屬性(切換類型、持久性等。)來(lái)聲明隊(duì)列。并設(shè)置其相關(guān)屬性(排他性、持久性、自動(dòng)刪除等。)將消息從交換機(jī)綁定的消息生成器發(fā)送到rabbitmq broker,并通過(guò)路由鍵進(jìn)行排隊(duì)。該報(bào)文包含路由關(guān)鍵字、交換機(jī)等信息,交換機(jī)根據(jù)接收到的路由關(guān)鍵字成功找到匹配隊(duì)列,但未能將該報(bào)文存儲(chǔ)在隊(duì)列中找到匹配。根據(jù)生產(chǎn)者配置的屬性,選擇丟棄或返回生產(chǎn)者關(guān)閉通道,關(guān)閉連接。1.4.2消息消費(fèi)流程消費(fèi)者與rabbitmq broker建立連接。連接建立后,打開一個(gè)通道,消費(fèi)方向rabbitmq broker請(qǐng)求消費(fèi)方對(duì)應(yīng)隊(duì)列中的消息,等待rabbitmq broker響應(yīng)并交付對(duì)應(yīng)隊(duì)列中的消息。當(dāng)消費(fèi)者收到消息時(shí),消費(fèi)者確認(rèn)消息(ack),rabbitmq broker刪除確認(rèn)的消息以關(guān)閉通道并關(guān)閉連接。
    2.rabbitmq安裝個(gè)人學(xué)習(xí)推薦使用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:
    啟動(dòng)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參數(shù)的含義如下:
    -d后臺(tái)運(yùn)行-p端口映射-name指定容器名rabbitmq_default_user指定用戶帳號(hào),不指定guestabitmq _ default _ pass的默認(rèn)用戶密碼,不指定guest的默認(rèn)用戶密碼。
    訪問(wèn) p: 15672是rabbitmq的webui界面,默認(rèn)用戶名密碼為guest/guest。
    3.去吧,拉比github.com/streadway/amqp tmq客戶推薦的依賴包
    演示的目錄結(jié)構(gòu)如下:
    $樹。├──消費(fèi)者│└──consumer.go├──go.mod├──go.sum├──lib│├──common-func . go│└──error.go├──生產(chǎn)者│ └── producer.go├──任務(wù)│ └── task.go└──工人└──工人. go
    3.1客戶端連接//rabbit mq conn get rabbit mq broker連接funcrabbit mq conn(conn * amqp . connection,err error){ var(user string = 行政及管理pwd字符串= 行政及管理主機(jī)字符串= xx . xx . xx . xx 端口字符串= 5672 )網(wǎng)址: = ;amqp:// 用戶 : 殘疾人和殘疾人協(xié)會(huì)@ 主持人 : 港口和碼頭/ /new connection conn,err = amqp。撥號(hào)(url)return}
    3.2使用簡(jiǎn)單隊(duì)列模式的基本隊(duì)列是rabbitmq的常規(guī)用法。簡(jiǎn)單理解就是消息生產(chǎn)者將消息發(fā)送到一個(gè)隊(duì)列,然后消息消費(fèi)者從隊(duì)列中讀取消息。
    當(dāng)多個(gè)使用者訂閱同一個(gè)隊(duì)列時(shí),隊(duì)列中的消息會(huì)平均分配給多個(gè)使用者進(jìn)行處理。
    首先,定義消息的生產(chǎn)者:
    鍵入簡(jiǎn)單的演示結(jié)構(gòu){ name string ` json : 姓名和名稱json : addr `} func main{//連接rabbitmq服務(wù)器conn,erricoh 5-@ .com = lib . rabbit mq connlib . error handle(err,lib . errconnectabbit)defer conn . close//新建一個(gè)channelch,err: = conn . channellib . error handle(呃,lib。erroropenchannel) defender ch。close//聲明或創(chuàng)建一個(gè)隊(duì)列來(lái)保存消息q,err : = ch . queue declare( 簡(jiǎn)單: queue ,//namefalse,// durablefalse,unusedfalse時(shí)刪除,// exclusivefalse,// no-waitnil,// argument)lib。錯(cuò)誤句柄(err,lib。errdeclaqueue)data : = simpl: ;tom;,addr: 上海 ,}databyt:= json。封送(數(shù)據(jù))庫(kù)。錯(cuò)誤句柄(err,lib。errmarshaljson)err = ch。發(fā)布( ,// exchangeq。name,// routing keyfalse,// mandatoryfalse,//immediateamqp.publishing{cont: ;t:數(shù)據(jù)字節(jié),},)lib。錯(cuò)誤句柄(err,lib。errpublishmsg)日志。printf( [x]發(fā)送了% s 數(shù)據(jù)字節(jié))}
    定義消息使用者:
    func main {conn,:= lib。rabbitmqconnlib。錯(cuò)誤句柄(err,lib。errconnectrabbit)defer conn . closech,err : = conn . channellib。錯(cuò)誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( simple: queue ,// namefalse,//durablefalse,//未使用時(shí)刪除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。錯(cuò)誤句柄(err,lib。errregisterconsumer)go func{ for d : = rang: % s ,d.body)}}log。printf( [*]等待消息。要退出,請(qǐng)按ctrl c )選擇{}}
    我們啟動(dòng)一個(gè)生產(chǎn)者和一個(gè)消費(fèi)者,運(yùn)行結(jié)果是:
    $ go run producer . go 2022/05/19 16 : 06 : 25[x]已發(fā)送{ 姓名和名稱: 湯姆 , addr : 上海 }
    $ go run consumer . go 2022/05/19 16 : 06 : 33[*]等待消息。要退出,請(qǐng)按ctrl c 2022/05/19 16 : 06 : 33收到一個(gè)m:姓名和名稱: 湯姆 , addr : 上海 }
    3.3工作隊(duì)列工作隊(duì)列也叫任務(wù)隊(duì)列。
    任務(wù)隊(duì)列是為了避免等待一些耗時(shí)的任務(wù)被執(zhí)行,而是將需要執(zhí)行的任務(wù)封裝成消息發(fā)送到工作隊(duì)列,后臺(tái)運(yùn)行的工作進(jìn)程取出任務(wù)消息并執(zhí)行。關(guān)閉任務(wù)
    多個(gè)后臺(tái)工作進(jìn)程同時(shí)進(jìn)行,它們共享任務(wù)(搶占)。
    定義用于生成任務(wù)消息的任務(wù)生成器。
    func body from(args[]string)string { var s stringif(l:], )}return s}func main {conn,:= lib。rabbitmqconnlib。錯(cuò)誤句柄(err,lib。errconnectrabbit)defer conn . closech,err : = conn . channellib。錯(cuò)誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( task: queue ,// namefalse,// durablefalse,unusedfalse時(shí)刪除,// exclusivefalse,// no-waitnil,// args)lib。錯(cuò)誤句柄(err,lib。errdeclaqueue)body : = body from(os。args)err = ch。發(fā)布( ,q.name,false,false,amqp.publishing{cont: ;t: amqp.p:[]byte(body),},)lib。錯(cuò)誤句柄(err,lib。errpublishmsg)日志。printf( 發(fā)送了% s ,正文)}
    定義員工:
    func main {conn,:= lib。rabbitmqconnlib。錯(cuò)誤句柄(err,lib。埃爾科內(nèi)ctrabbit)defer conn.closech,err : = conn . channellib。錯(cuò)誤句柄(err,lib。erropenchannel)延遲更改。clos:= ch。queue declare( task: queue 假,假,假,假,零)lib。錯(cuò)誤句柄(err,lib。errdeclaqueue)///將預(yù)取計(jì)數(shù)器設(shè)置為1//將消息分發(fā)到并行處理中的不同工作進(jìn)程err = ch.qos (1,//預(yù)取計(jì)數(shù)0,//預(yù)取大小fals:= ch。消費(fèi)(q . name ,false,false,false,false,nil),lib。錯(cuò)誤句柄(err,lib。errregisterconsumer)forever : = make(chan bool)go func{ for d : = rang: % s 主體)日志。printf( 完成和)d.ack(false)}}log。printf( [*]等待消息。要退出,請(qǐng)按ctrl c )-永遠(yuǎn)}
    我們打開兩個(gè)worker,運(yùn)行結(jié)果是:
    $ go run task . go hello world 2022/05/19 16 : 03 : 31發(fā)送hello world $ go run task . go hello golang 2022/05/19 16 : 03 : 53發(fā)送h:03:59發(fā)來(lái)hello rabbitmq
    $ go運(yùn)行worker . go 2022/05/19 16 : 03 : 44[*]等待消息。要退出,請(qǐng)按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運(yùn)行worker . go 2022/05/19 16 : 03 : 47[*]等待消息。要退出請(qǐng)按ctrl c 2022/05/19 16 : 03 : 59收到一個(gè)m:你好rabbit mq 2022/05/19 16 : 03 : 59完成
    同時(shí)可以查看rabbitmq的w
    blog . csdn . net/ _ 42402854/articl
    標(biāo)簽:
    信息排隊(duì)
    了解更多連接rabbitmq(golang amqp)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。

    sata固態(tài)硬盤分區(qū)教程圖解,雙SATA如何對(duì)第二塊硬盤分區(qū)
    win7旗艦版正式版(win7 正版)
    windows10有哪幾個(gè)版本,Windows10怎么退回上版本
    三星9格怎么解鎖,怎樣解開手機(jī)九格鎖屏
    windows11魔獸爭(zhēng)霸(電腦玩不了魔獸爭(zhēng)霸)
    go連接rabbitmq(golang amqp)
    在電腦上看手機(jī)的內(nèi)容(如何在電腦上看手機(jī)上的文件)
    mac m1 安裝windows(2020款macbook安裝win10)
    谷歌星空怎么用,谷歌相機(jī)星空模式
    nvme轉(zhuǎn)sata3硬盤盒,求助m2接口如何轉(zhuǎn)換SATA3
    魅族怎么反饋bug,魅族反饋在哪里
    iphone上安裝安卓模擬器(蘋果如何安裝安卓模擬器)
    w10怎么取消圖標(biāo)上的小盾牌(window10怎么去掉圖標(biāo)盾牌)
    win7更改右鍵菜單(如何設(shè)置電腦右鍵菜單背景)
    雷蛇鍵盤fn鍵在哪(怎么打開雷蛇鍵盤)
    五千多的辦公筆記本哪個(gè)好,五千左右筆記本電腦什么品牌好點(diǎn)
    酷比魔方i10拆機(jī)教程,酷比魔方平板機(jī)殼咋拆開
    如何給蘋果電腦安裝win10(蘋果電腦window10安裝教程)
    炒股用什么筆記本比較好(炒股用筆記本電腦推薦)
    手機(jī)上填電子表格下載什么(電子表格用手機(jī)怎么填寫)
    主站蜘蛛池模板: 国产高清视频一区二区| 一区二区在线视频| 精品人妻少妇一区二区三区在线| 日韩一区二区三区精品| 国产乱码精品一区二区三区中| 成人国产精品一区二区网站| 亚拍精品一区二区三区| 日韩精品无码一区二区视频| 午夜视频一区二区| 无码中文人妻在线一区二区三区| 国产无套精品一区二区| 波多野结衣一区二区三区88| 中文字幕日韩丝袜一区| 一区二区三区观看免费中文视频在线播放| 午夜AV内射一区二区三区红桃视| 久久亚洲AV午夜福利精品一区| 红桃AV一区二区三区在线无码AV | 日本精品少妇一区二区三区| 无码喷水一区二区浪潮AV | 亚洲精品日韩一区二区小说| 日韩中文字幕精品免费一区| 中文字幕无线码一区二区 | 日韩精品一区二区三区色欲AV| 无码人妻少妇色欲AV一区二区| 国产乱码一区二区三区爽爽爽| 精品少妇一区二区三区视频| 亚洲AV综合色区无码一区爱AV | 丰满少妇内射一区| 国产伦精品一区二区三区女| 91久久精品无码一区二区毛片| 久久精品无码一区二区三区不卡| 亚洲AV无码国产一区二区三区| 老熟妇高潮一区二区三区| 国产成人精品一区在线| 一区二区三区四区免费视频| 人妻视频一区二区三区免费| 国产一区二区三区在线观看精品| 一区二区三区观看免费中文视频在线播放| 亚洲中文字幕在线无码一区二区| 最新中文字幕一区二区乱码| 波多野结衣AV无码久久一区|