面试整理-rabbitMQ

本文介绍了rabbitMQ的web客户端界面和不同消息模型的使用,包括直连queue、workqueues、广播和路由模式。重点讨论了rabbitMQ如何通过confirm消息确认机制、消息持久化和ACK事务机制保证消息不丢失,以及如何通过全局消息ID和Redis实现消息幂等性,避免重复消费。
摘要由CSDN通过智能技术生成

目录

 一、rabbitMQ的web客户端界面介绍

二、不同消息模型的API使用

三、rabbitMQ的使用场景

四、rabbitMQ如何保证消息不丢失

五、rabbitMQ如何避免消息被重复消费(幂等性)


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值