本文主要介绍连接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安装教程)
炒股用什么笔记本比较好(炒股用笔记本电脑推荐)
手机上填电子表格下载什么(电子表格用手机怎么填写)