目录
rabbitMQ使用erlang语言开发,遵循在tcp/ip基础上构建的AMQP协议
AMQP协议不是从API层开始限定的,而是直接限定了网络交换的数据格式,使得AMQP的provider是跨平台。AMQP协议模型如下

生产者 —> 服务(虚拟主机(交换机(队列)))
消费者 <— 服务(虚拟主机(交换机(队列)))
一、rabbitMQ的web客户端界面介绍
使用来宾账户guest密码guest登录,web访问地址默认端口15672,服务端默认端口5672

1.添加用户 2.创建虚拟主机 3.绑定虚拟主机和用户
生产者通过通道发送消息,每个生产者对应一个虚拟主机,需要将虚拟主机和用户绑定后才有访问权限;消息是放在交换机中还是放在队列中,这取决于使用具体的消息模型
AMQP支持的消息模型
1.queue 2.work queues 3.广播(订阅/发布) 4.路由 5.动态路由 ...
二、不同消息模型的API使用
引入rabbitmq amqp client的以来
1. 直连queue
一个生产者——>发送消息到队列
一个消费者——>监听该队列,有消息就消费

2. work queues
当消息的生产速度远大于消费速度时,消息就容易产生堆积,无法及时处理,就可以使用该模型
一个生产者——>发送消息到队列
多个消费者——>监听该队列,有消息就消费,一旦被消费,消息就消失,不会被重复消费

默认rabbitMQ是将消息顺序发送给每一个消费者,无论消费者对消息的处理速度快慢,其消费的消息数都是分配均匀的,这种分发方式称为循环
消息确认机制
消息确认即消息被确认是否消费。当多个消费者对消息的处理速度不同时,可以关闭消息的自动确认,并设置每次消费的消息个数,而通过手动消息确认,就能实现‘能者多劳’。
3. fanout(广播)

每个消费者都有自己的队列(queue),每个queue都要绑定到交换机(Exchange)
一个生产者——>通过通道发送消息到交换机——>交换机把消费发送给绑定过的所有队列
多个消费者——>通过交换机绑定的队列获取消息——>实现一条消息被多个消费者消费
4. routing(路由-Direct模式)

队列和交换机的绑定不能时随意绑定,而是指定一个routingKey(路由key)
一个生产者——>通过通道发送指定routingKey的消息到交换机——>交换机发送消息到绑定过并且与该routingKey相匹配的队列
多个消费者——>通过交换机绑定的指定routingKey队列获取消息
5. routing(路由-Topic模式)

和路由-Direct模式相似,只是routingKey可以使用通配符
*即可以配以任意一个单词
#可以匹配一个或多个单词(包含0个)
三、rabbitMQ的使用场景
1. 异步处理 2. 应用解耦 3. 流量肖峰
四、rabbitMQ如何保证消息不丢失
三种消息丢失场景:
①.生产者给MQ服务器发消息过程中,消息丢失
②.MQ服务器在消息持久化的过程中,消息丢失
③.消费者在获取消息或者消费消息时,消息丢失
对应的解决方案:
①.confirm消息确认机制(MQ ----> 生产者)
②.消息持久化机制(rabbitMQ服务器)
③.ACK事务机制(消费者 ----> MQ)
1.confirm消息确认机制(MQ ----> 生产者)
confirm模式是rabbitMQ提供的一种消息可靠性保证机制。当生产者通过confirm模式发送消息时,会等待rabbitMQ的确认:
消息正确投递到queue时,MQ返回ack给生产者
消息没有正常投递到queue,MQ返回nack给生产者
使用方法:
a.通过confirmSelect()方法将Channel设置为confirm模式
b.消息发送后,通过addConfirmListener()回调方法监听消息的确认状态
2.消息持久化机制(rabbitMQ服务器)
消息持久化是将消息存储到磁盘,以保证rabbitMQ服务器宕机或重启时,消息不丢失
使用方法:
a.消息持久化:生产者将消息的delivery_mode属性设置为2,即消息持久化
b.交换机持久化:交换机的durable属性设置为true,即交换机持久化
c.队列持久化:Rabbit分三中队列,经典队列、仲裁队列、流式队列。经典队列只需要将队列的 durable属性设置为true即可,而仲裁队列和流式队列默认必须持久化保存。
3.ACK事务机制(消费者 ----> MQ)
ack事务机制用于消息被正常消费,即消息只要到达消费者,不管消费者是否消费成功,消费者就会向MQ会发送一条ack确认指令,表示消息已被成功消费,MQ收到ack指令,会把该消息从本地删除,这一过程是自动的
因此为了保证消息被消费者正常消费,通过手动显式发送ack
使用方法:
关闭rabbitMQ默认开启的ack机制即可;把auto_ack参数设置为false,即手动发送ack
consumer向MQ发送ack的方式分为三种:reject拒收,nack消费异常,ack成功消费

五、rabbitMQ如何避免消息被重复消费(幂等性)
消息幂等性,其实就是保证同一个消息不被消费者重复消费
方法1.全局消息id作为唯一标识,如时间戳、UUID等
该id作为主键插入到数据库,每次推送数据,先根据主键id查询数据库中是否存在?
若存在,则过滤此消息,不插入,即不消费
若不存在,则插入此消息,即正常消费
方法2.利用redis,思路同方法1
本文介绍了rabbitMQ的web客户端界面和不同消息模型的使用,包括直连queue、workqueues、广播和路由模式。重点讨论了rabbitMQ如何通过confirm消息确认机制、消息持久化和ACK事务机制保证消息不丢失,以及如何通过全局消息ID和Redis实现消息幂等性,避免重复消费。
361

被折叠的 条评论
为什么被折叠?



