1、RabbitMq如何保证消息可靠性
主要从四个层面来考虑
- 生产者方面:开启生产者确认机制, 给每个消息指定一个唯一ID , 消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功 (发送者确认:ack和nack,发送者回执:ack,路由失败原因),来确保生产者的消息能到达队列。
- mq自身方面,开启消息持久化(交换机持久化、队列持久化、消息持久化)功能,确保消息在mq中不会因为宕机丢失
- 开启消费者确认机制为auto,由spring来监听消费者是否出现异常, 出现异常时返回nack,消息回滚到mq;没有异常,返回ack 。
- 开启消费者失败重试机制,并设置重试策略,多次重试失败后将消息投递给处理异常的交换机,交给人工处理。
2、RabbitMq如何实现延迟队列
死信交换机和TTL实现 如下图:
死信:消息过期无人消费;队列满了,早期消息会成为死信;消费无效;
TTL:过期时间,超时未被消费,消息过期。
实现过程原理:给队列绑定一个死信交换机,在死信交换机上绑定一个队列,消费者监听这个队列,然后发送消息的时候,设置TTL超时时间,就可以实现延时队列。
死信插件:DelayExchange:只需要申明交换机的时候,指定为死信交换机,发消息指定ttl就行。
3、消息堆积问题
解决方案:
- 绑定多个消费者,提高消费速度
- 给消费者开启线程池,提高消费速度
- 使用惰性队列,在mq中存储更多的消息
惰性队列:优点:基于磁盘存储,消息上限高,性能比较稳定;支持数百万条的消息存储
缺点:消息时效的会降低;性能受限于磁盘IO
4、RabbitMq集群
- 普通集群:分布式集群,将队列分散到集群的各个节点,从而提升整体并发能力。
- 镜像集群:主从集群,在普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。
- 仲裁队列:RabbitMq 3.8版本以上,代替镜像集群,确保主从集群的数据一致性。