一、如何确保消息不丢失?
消息持久化的前提是:将交换器/队列的durable属性设置为true,表示交换器/队列是持久交换器/队列,在服务器崩溃或重启之后不需要重新创建交换器/队列(交换器/队列会⾃动创建)。如果消息想要从Rabbit崩溃中恢复,那么消息必须:
1、在消息发布前,通过把它的 “投递模式” 选项设置为2(持久)来把消息标记成持久化
2、将消息发送到持久交换器
3、消息到达持久队列
RabbitMQ确保持久性消息能从服务器重启中恢复的⽅式是,将它们写⼊磁盘上的⼀个持久化⽇志⽂件,当发布⼀条持久性消息到持久交换器上时,Rabbit会在消息提交到⽇志⽂件后才发送响应(如果消息路由到了⾮持久队列,它会⾃动从持久化⽇志中移除)。⼀旦消费者从持久队列中消费了⼀条持久化消息,RabbitMQ会在持久化⽇志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前RabbitMQ重启,那么Rabbit会⾃动重建交换器和队列(以及绑定),并重播持久化⽇志⽂件中的消息到合适的队列或者交换器上。
二、使⽤RabbitMQ有什么好处?
1. 应⽤解耦(系统拆分)
2. 异步处理(预约挂号业务处理成功后,异步发送短信、推送消息、⽇志记录等,可以⼤⼤减⼩响应时间)
3. 消息分发
4. 流量削峰:将请求发送到队列中,短暂的⾼峰期积压是允许的。
5. 消息缓冲
三、消息队列有什么缺点?
1. 系统可⽤性降低:消息队列出问题影响业务;
2. 系统复杂性增加:加⼊消息队列,需要考虑很多⽅⾯的问题,⽐如:⼀致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。
四、MQ如何选型?
1. 中⼩型公司⾸选RabbitMQ:管理界⾯简单,⾼并发。
2. ⼤型公司可以选择RocketMQ:更⾼并发,可对rocketmq进⾏定制化开发。
3. ⽇志采集功能,⾸选kafka,专为⼤数据准备。
五、如何保证消息队列⾼可⽤
1.集群可以扩展消息通信的吞吐量,但是不会备份消息,备份消息要通过镜像队列的⽅式解决。
队列存储在单个节点、交换器存储在所有节点。
2. 镜像队列:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA⾼可⽤性。作⽤就是消息实体会主动在镜像节点之间实现同步,⽽不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占⽤⼤量的⽹络带宽。