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、队列满了,无法在添加

posted @   dogRuning  阅读(111)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示