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、队列满了,无法在添加
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!