为什么要使用MQ?
异步、解耦、削峰填谷
使用了MQ之后有什么优缺点?
缺点:系统可用性降低、系统复杂度提高、数据一致性问题
怎么保证MQ消息不丢失?
生产者数据丢失:
1、事务方式:通过channel.txSelect
开启一个事务,接着发送消息,如果消息没有成功被RabbitMQ接收到,生产者会收到异常,此时就可以进行事务回滚channel.txRollback
然后重新发送。假如RabbitMQ收到了这个消息,就可以提交事务channel.txCommit
。
2、confirm机制:在生产者设置,每次写消息的时候会分配一个唯一的id,然后RabbitMQ收到之后会回传一个ack,告诉生产者这个消息ok了。
一般都是使用confirm机制。
Rabbitmq数据丢失:
在消息发送到RabbitMQ之后,默认是没有落地磁盘的,万一RabbitMQ宕机了,这个时候消息就丢失了。RabbitMQ提供了一个持久化的机制,消息写入之后会持久化到磁盘,哪怕是宕机了,恢复之后也会自动恢复之前存储的数据,这样的机制可以确保消息不会丢失。
步骤:
1、创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据;
2、发送消息的时候将消息的deliveryMode设置为2,就是将消息设置为持久化的,此时rabbitmq就会将消息持久化到磁盘上去。
消费端数据丢失:
RabbitMQ消费消息的机制:在消费者收到消息的时候,会发送一个ack给RabbitMQ,告诉RabbitMQ这条消息被消费到了,这样RabbitMQ就会把消息删除。默认情况下这个发送ack的操作是自动提交的,所以解决方案就是:关闭RabbitMQ消费者的自动提交ack,在消费者处理完这条消息之后再手动提交ack。
怎么保证MQ的高可用性?
rabbitmq有三种模式:单机模式,普通集群模式,镜像集群模式(ok)