Golang客户端#
关注白日梦,后台回复:rbmq 即可获取如下资料:
本文中涉及到的:Golang Case、Java Case以及erlang虚拟机rpm包、rabbitmq-server的rpm包等软件,直接通过yum安装即可。
文末有二维码
下载依赖包:
go get github.com/streadway/amqp
Hello World#
发送端:
Step1: 获取连接: Dial最后面的//test
比较迷惑,其实/test
是我的virtualhost,如果只写成/host会把错说:"no access to this vhost"
Step2: 创建channel
Step3: 声明queue,后续往这个队列中发送消息
Step5: 发送消息
接受端:
消费者同样需要建立连接和channel、然后声明我们想消费的channel,和上面的生产者代码相同,就不粘出来了。
消费者从channel中接受消息:
处理消息:
Worker 模型#
同样的Worker模型和Simple模型也是相似的。无外乎是simple模型的消费者启动了多个实例。
消息分发策略:默认情况下RabbitMQ后将P生产的消息以round-robin的策略分发给C1、C2。
你也可以像下图这样设置一个相对公平的分发策略: 当消费者把消息处理完后MQ才会给他新的消息,这样可以实现能者多劳。
消息确认机制:
什么是ACK机制,你可以往下翻看 Golang客户端/消息确认机制/ACK机制部分的描述。
如果手动ACK如下:
当我们像上面这样设置手动ACK之后,可以确保如果消费者没处理完消息就挂了,MQ中的消息不会丢失。
但是如果这时MQ挂了,消息同样会丢失。
为了避免这种情况,可以将设置将MQ中的消息也持久化
订阅模型#
订阅模型借助一个新的概念:Exchange(交换机)实现,不同的订阅模型本质上是根据交换机(Exchange)的类型划分的。
订阅模型有三种
- Fanout(广播模型): 将消息发送给绑定给交换机的所有队列(因为他们使用的是同一个RoutingKey)。
- Direct(定向): 把消息发送给拥有指定Routing Key (路由键)的队列。
- Topic(通配符): 把消息传递给拥有 符合Routing Patten(路由模式)的队列。
订阅模型之Fanout模型
这个模型的特点就是它在发送消息的时候,并没有指明Rounting Key , 或者说他指定了Routing Key,但是所有的消费者都知道,大家都能接收到消息,就像听广播。
生产者:在获取channel之后紧接着创建一个交换机,交换机的类型为 fanout 扇出。
注意,fanout对应的routingkey(路由key为空)
消费者:需要消费者获取到channel后也要声明交换机。消费者的queue无名称,queue没有routingkey。注意交换机的名字别写错。
订阅模型之Direct模型
生产者:和Fanout类似,注意交换机的名称为direct 以及添加 特定的routingkey
消费者:
订阅模型之Topic模型
和Direct模型相似,不同点:type为topic、并别routingkey支持正则表达式。
详细代码不再重复贴了。可以自行领取源码学习。
消息确认机制#
ACK机制
所谓的ACK确认机制:
自动ACK:消费者接收到消息后自动发送ACK给RabbitMQ。
手动ACK:我们手动控制消费者接收到并成功消息后发送ACK给RabbitMQ。
你可以看上图:如果使用自动ACK,当消息者将消息从channel中取出后,RabbitMQ随即将消息给删除。接着不幸的是,消费者没来得及处理消息就挂了。那也就意味着消息其实丢失了。
你可能会说:会不会存在重复消费的情况呢?这其实就不是MQ的问题了。你完全可以在你代码的逻辑层面上进行诸如去重、插入前先检查是否已存在等逻辑规避重复消费问题。
具体的实现方式可以参考上面的Golang或JAVA客户端的Worker模型部分。
持久化交换机
持久化队列
持久化消息
资料获取#
参考:
get start:https://www.rabbitmq.com/getstarted.html
download rabbitmq:https://www.rabbitmq.com/download.html
rabbitmq和erlang版本对应关系:https://www.rabbitmq.com/which-erlang.html
download erlang:https://www.erlang-solutions.com/resources/download.html
rabbitmq推荐的erlang:https://www.rabbitmq.com/releases/erlang/
了解更多rabbitmq3.8.X配置:https://www.cnblogs.com/masy-lucifer/p/13551067.html
rabbitmq3.8.9 GitHub:https://github.com/rabbitmq/rabbitmq-server/tree/v3.8.9/docs
认证、授权、访问控制:https://www.rabbitmq.com/access-control.html