导航
参考大佬的博客,点此跳转
1.RabbitMQ怎么保证数据可靠性传输?
开启comfirm,生产端发送消息到消息队列后,如果mq成功收到,返回ack确认信息,生产端收到确认信息就认为发送成功,否则就会再次尝试发送。
mq收到消息后,将消息持久化到磁盘。
mq发送消息到消费端后,如果消费端成功收到也会返回确认信息(这里应该关掉自动ack,改用程序员手动ack确保消费成功后再发送确认消息)。这样保证了数据的可靠性传输。
为了避免mq在持久化前出现数据丢失,将mq收到信息后的确认信息放在成功持久化后发送给生产端,当持久化前数据丢失时,生产端会再次发送。
2.RabbitMQ的优点和缺点是什么?
优点很明显,解耦,异步,削峰。
缺点:
复杂化系统。原本客户端和服务端直接一一对应结构也相当简单,但是现在加了一个消息队列的话,增加了系统的复杂度。
增加系统的风险。如果消息队列挂了的话,那么整个系统直接崩溃。
一致性问题。没有在消费端写成功。
3.怎么保证消息队列的高可用性?
RabbitMQ的镜像集群模式可以体现消息队列的高可用性。每次创建队列的时候,他都会创建多个实例,就算一台机器宕机,数据也不会丢失。
4.怎么避免重复消费的情况?
如果直接写数据库的话需要查询确认下,是否数据已经在数据库中。如果写redis的话,不会出现重复消费的情况,因为redis天然幂等。
5.怎么保证消息的顺序?
将队列拆分,每个消费者对应一个队列。
6.如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
积压消息:检查消费者是否故障,修复消费速度,队列扩容,增加消费者。
延时过期失效导致数据丢失:修复消费者的消费速度,并将丢失的数据手动批量导入。
队列满了怎么办:修复消费速度。设置过期失效,如果造成数据丢失,那么批量导入丢失的数据。
7.如果让你自己写一个消息队列,你怎么设计架构?
具有吞吐量伸缩性。在必要时可以方便的扩容,每个partition放在一台机器上,当需要扩容时增加机器。(参考了kafka,broker->topic->partition)
高可用性。采用分布式多副本,当leader宕机,通过选举重新产生leader对外服务。
数据可靠性。队列消息要落地磁盘持久化。队列同时创建多副本,保证数据0丢失。