golang rabbitmq 面试题
本文来自 https://www.tizi365.com/course/2.html
11 如果确保消息不丢失
确保消息不丢失,首先是消息的持久化,消息 ACK 机制,RabbitMQ 集群模式
RabbitMQ主要是通过持久化机制,确保消息不丢失。RabbitMQ 持久化分为队列持久化,消息持久化,交换器持久化。
1、消息持久化
RabbitMQ 的消息默认存放在内存中,如果不特别声明,消息不会持久化保存到硬盘中,如果 rabbitmq 服务器节点重启或者挂了,消息就会丢失。
要做到消息的持久化,必须满足下面三个条件
1、exchange 设置为持久化
2、Queue 设置为持久化
3、Message 持久化:发送消息设置发送模式 deliveryMode =2 ,代表持久化消息
代码地址: https://github.com/lijiesheng/rabbitmq/tree/message-durability 【可以做到,消费者重启,数据不丢失【包括本次没有消费完的 数据】,服务器重启,数据不丢失】
代码分析:
在消费者中,声明的队列是持久化的

在消费者中,需要手动应答


在生产者代码中队列是持久化的
2、 消息的ACK机制
默认情况消费者收到消息,MQ 就会从队列中删除消息,如果消费者没有处理成功。消息就丢失了,可以使用手动的 ACK 机制,处理完成后手动调 用MQ 的 ACK 方法通知 MQ 删除消息。
3、RabbitMQ 集群模式
使用集群模式部署 RabbitMQ ,实现了消息的高可用,避免了单个 MQ 节点挂了,消息就没有了
4、消息补偿
有时候因为消息的过期 TTL 、或者消费者异常导致消息丢了,这个时候需要从业务的角度,写个脚本重新生成消息,投送到消息队列中。
13 RabbitMQ 面试题:什么事死信队列
DLX , 全称为 Dead-Letter_Exchange , 死信交换器。当消息在一个队列中变为死信【无法消费】,它能重新被发送到另外一个交换器中,这个交换器就是DLX,死信交换器,DLX 绑定的队列是死信队列。
导致死信的原因:
1、消息被拒绝
2、消息的TTL过期
3、队列满了,无法在添加

浙公网安备 33010602011771号