rabbitmq如何保证消息不丢失?
先要看生产者发送消息再哪个环节会丢失?
1 生产者发送消息到交换机失败(生产者服务宕机)
2 交换机到队列失败
3队列中消息丢失
消息失败后怎么处理呢?
可以设置回调方法重发
记录日志
保存到数据库后定时发放,成功后删除表中数据
MQ宕机了会导致消息的丢失
mq是内存存储消息,要是宕机了话消息会丢失,我们需要开启消息持久化(持久化交换机,持久化队列,持久化消息)
消费者消费失败
消费者消息确认机制(手动ack 自动ack none)
RabbitMQ消息的重复消费问题如何解决
网络抖动和消费者挂了
- 每条消息设置一个唯一id 处理消息时先在数据库中查一下,没有的话再处理
- 幂等方案:比如说加锁,分布式锁,数据库锁(但是加锁会影响性能,一般不采用这种方案)
Rabbitmq死信交换机
消息没有被消费,消息过期,队列满了就形成了死信
如果有100万条数据堆积再mq,怎么解决?
1增加消费者,提高消费速度
2再消费者内开始线程池加快处理消息的速度
3扩大队列容积,提高堆积上限
使用惰性队列 接收到消息后存入磁盘而非内存,消费者消费的时候才会从磁盘中读取并加载到内存,支持数百万条的消息存储。
rabbitmq高可用机制有了解过吗
搭建集群,普通集群 镜像集群 仲裁队列
镜像集群本质上是主从模式,交换机 队列 以及消息都是会再镜像节点之间同步备份的,创建队列的节点称为主节点,备份到其他节点称为镜像节点,主节点也可能是另一个队列的镜像节点。
仲裁队列,同步的是强一致性。