目录
8、如何确保消息正确的发送到rabbitMQ,如何确保消费者正确的消费了消息?
13、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
1、什么是rabbitMQ?
采用AMQP高级消息队列协议的一种消息队列技术,特点就是消费不需要确保提供方存在,实现了服务之间的高度解耦。
2、为什么要使用rabbitMQ?
围绕“解耦”、“异步、“削峰”聊
1、在分布式系统下,具有异步、削峰、负载均衡等高级功能
2、拥有持久化机制,进程中的消息,队列中的消息,可以保存下来
3、实现消费者和生产者之间的解耦
4、高并发场景下,利用消息队列可以使同步访问变成串行访问,达到一定限流作用
5、可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。
3、使用rabbitMQ的场景?
1、服务间异步通讯
2、顺序消费
3、定义任务
4、请求削峰
4、什么是消息?
消息是不具名的,具有消息头和消息体。消息体是不透明的,消息头通常由可选的属性构成,如
路由键、相对于其他消息的优先权、是否需要持久化等
5、什么是exchange?
交互器,用于接收生产者发送的消息,并将这些消息根据分发策略路由至指定的队列。
6、什么是信道?
信道(channel),多路复用连接中的一条数据传输通道。信道是建立在TCP连接内的虚拟连接。对于系统来说,创建和销毁TCP连接都会产生较大开销。
7、什么是broker?
消息队列服务器实体。
8、如何确保消息正确的发送到rabbitMQ,如何确保消费者正确的消费了消息?
发送方确认模式
将信道设置成confirm模式,所有在信道上发布的消息都会被指派一个唯一的ID,
一旦消息成功投放到目标队列或者成功写入磁盘后,信号会发送一个确认给生产者,(确认消息中包含此ID),如果rabbitMQ内部发生错误导致消息丢失,会发送一条nack消息。
发送方确认模式是异步的
接收方确认模式
消费者每收到一条消息后都必须进行确认。只有消费者确认了消息,rabbitMQ才能安全的将消息从队列中删除。
rabbitMQ针对两种特殊情况的处理
1、消费者接受了消息,在发送确认之前断开了连接或者取消了订阅。
rabbitMQ会将该消息重新分发给下一个订阅的消费者。(这里就会存在消息重复消费的问题)
2、消费者接受了消息,连接没有断开,却一直没有确认消息
rabbitMQ会认为该消费者繁忙,将不会给他分发更多的消息。
9、如何解决消息重复投递或者消息重复消费的问题?
在消息生产时,MQ内部针对每条生产者生产的消息生成一个 inner-msg-id,作为去重的依据,避免重复的消息进入队列。
在消息消费时,要求消息体中必须包含一个bizId,作为去重的依据,避免重复消费。
1、基于数据库事务插入消息表
开启事务,插入消息表(必须要有业务上的唯一键),更新订单,提交事务
劣势:跨库问题
10、消息基于什么传输?
由TCP连接的创建和销毁开销大,并且并发数量受系统资源控制,会造成性能瓶颈。
所以rabbitMQ使用信道的方式来传输数据,信道是建立在真实TCP连接内的虚拟连接,且tcp连接上的信道数量是没有限制的。
11、常见的消息分发模式有哪几种?
1、fanout: 如果交换机接收到消息,会广播到所有绑定的队列上
2、direct: 路由键完全匹配策略
3、topic: 路由键模糊匹配策略
12、rabbitMQ的缺点?
1、系统可用性降低
2、系统复杂度提高
3、数据一致性问题
13、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景?
14、rabbitMQ是如何保证高可用的?
1、rabbitMQ有三种模式,单机模型,集群模式,镜像集群模式
普通集群模式,指多台机器启动多个rabbitMQ示例,每台机器启动一个。你创建的queue,只会存在于其中一个实例上,每个实例共享此队列的消息。
镜像集群模式,与普通集群模式的区别为 创建的queue,无论是元数据还是队列里的消息,每个实例都会保存一份。每次写消息,都会进行数据同步。
15、如何保证消息的可靠传输,消息丢失怎么办?
保证消息的可靠传输,从消息传输的三个阶段触发
1、保证生产者发送消息时不丢失
指:生产者发送消息的传输过程中由于网络等原因,造成消息丢失
解决办法:
①、开启事务
发送消息以后,如果rabbitMQ没有接收到,生产者会接收到异常报错,然后回滚事务,重发消息。接收到消息以后,会提交事务。
缺点:事务机制是同步的,太耗性能,吞吐量下降。
② 生产者开启confirm模式
每次写消息都会分配一个innner-msg-id,如果写入成功,rabbitMQ会返回一个ack,失败会返回一个nack。confirm模式是异步的,一般情况下,保证消息的可靠性,一般采用此方案。
2、保证rabbitMQ不丢失消息
解决办法: 开启rabbitMQ的持久化。
共分为两步 1、队列设置为持久化队列 2、 发送消息时将消息设置为持久化消息
一般情况下rabbitMQ持久化与confirm模式配合使用,只有当接收消息并持久化完成后才返回ack给生产者
3、保证消费者不丢失消息
原因:多是由于采用的自动ack模式,当消费到消息,还没进行业务处理,结果进程挂了。
解决办法:采用手动ack模式,处理完业务后,再手动ack.