RabbitMQ面试题

ops/2024/11/15 4:49:34/

一、RabbitMQ如何保证消息的可靠性

RabbiMQ如果想要保证消息的可靠性有几种方式可以实现:

1、消费端消息可靠性保证:

1).消息确认
在消费端可以设置手动ACK模式,手动确认消息是否被正常处理,若存在异常或者未运行,则消息超时后不会被删除,会被重新投递
2).死信队列
当消息不被正常使用时,可以设置过期时间或死信交换器将消息转入死信队列中,分析处理这些消息

2、生产端消息可靠性保证:

1).消息持久化
在发布消息时,可以将消息标记为持久化(persistent),这样消息就会被持久化存储到磁盘上面,即使RabbitMQ服务器重启,消息也不会丢失
2).消息确认机制
启用confirm模式,在消费者发布消息后,由RabbitMQ服务器确认,根据确认信号判断消息是否正常路由到队列中并采取相应的重试策略

二、 如何保证消息的幂等性?

1、MQ中出现幂等性问题的主要原因

(1)生产者重复生产
当网络发生故障时,生产者可能会多次发出相同的信号
(2)MQ重复发送消息给消费者
当消费者拉取消息后,由于网络或者服务器宕机的原因,MQ没有及时响应导致超时,MQ会认为第一次消费失败再去发送一次消息,导致发送消息重复

2、解决幂等性问题的办法

  1. 状态检查:
    在消息发送出去之前,检查数据库中的消息状态是非被处理,已被处理就忽略,没有被处理则发送并标记为已处理
  2. 唯一标识:
    给消息加上一个业务ID(BizID),可以根据这个业务ID来判断两次消息是否是同一条,比如订单号,交易流水号

三、RabbitMQ中如何解决消息堆积问题

一般情况下消息堆积问题有三种解决方案:

  1. 增加更多消费者,提高消费能力
  2. 在消费者内开启线程池加快处理速度
  3. 最好的方法就是使用惰性队列,扩大队列容积
    惰性队列优点:
    基于磁盘存储,消息上限高,性能比较稳定
    但是由于是基于磁盘存储,受限于磁盘IO,时效会降低

四、如何保证消息有序性?

保证消息的有序性的办法:

  1. 单一队列:将消息都发送到一个队列里面,并确保消费者按顺序处理消息
  2. 分区排序:将消息按特定规则排序,并为每个分区维护一个队列,但不同的分区消息顺序无法保证
  3. 消息标识:给元素数据中添加序列号或者时间戳等标识,消费者处理消息时根据标记确保消息顺序
  4. 利用有序消息中间件:一些消息队列中间件提供了特定的功能来保证消息的有序性

http://www.ppmy.cn/ops/96687.html

相关文章

结构型模式之外观模式

一、概述 1、定义:为子系统的一组接口提供一个统一的入口,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 2、外观模式又称为门面模式,是迪米特法则的一种具体实现 3、通过引入一个新的外观角色来降低原有系统…

机器学习——第十四章 概率图模型

目录 1 隐马尔可夫模型2 马尔可夫随机场3 条件随机场4 学习与推断4.1 变量消去4.2 信念传播 5 近似推断5.1 MCMC采样5.2 变分推断 6 话题模型 1 隐马尔可夫模型 机器学习的主要任务是根据一些已观察到的证据来对感兴趣的未知变量进行估计和推测。概率模型提供了描述框架&#…

Vue、react父子组件生命周期

Vue 的父子组件生命周期 以下分为三部分,加载渲染阶段——更新阶段——销毁阶段,我们来一一介绍: 1、加载渲染阶段 在加载渲染阶段,一定得等子组件挂载完毕后,父组件才能挂载完毕,所以父组件的 mounted 在…

Linux安装最新版Docker完整教程

Linux安装最新版Docker完整教程 Docker基本概念介绍仓库 (repository)镜像(Image)容器(Container)Docker常用命令 1、安装Docker依赖包安装异常问题解决 2、安装Docker启动docker并设置开机自启配置国内镜像源安装Docker可视化管理工具Portainer Docker基本概念介绍 仓库 (rep…

富格林:可信策划防范欺诈陷阱

富格林认为,现货黄金市场的确可以让投资者获利,但是其中的一些欺诈陷阱也导致投资者上当受骗,尤其是对于经验不足的新手投资者。建议投资者入市前需要可信的知识,提高识别其中陷阱的能力,避免误入歧途受骗。下面富格林…

前端面试——如何判断对象和数组

给你一个值,如何判断其是对象还是数组??? 我们先给出数据 var lists [1,2,3,4,5]var objs {length:5 } 我们分别尝试如下五种方法 console.log((✘)使用length,lists.length,objs.length); console.log((✔)使用isArray,Arr…

Qt消息对话框的实现

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this -> setWindowIcon(QIcon(":/picture/hp.jpg"));//设置窗口图标this -> setW…

Ubuntu无法解析域名DNS指向127.0.0.53问题处理

首次尝试编辑/etc/resolved.conf文件DNS为114.114.114.114发现reboot重启后又恢复到127.0.0.53的内容再次尝试修改文件 vi /etc/systemd/resolved.conf 在其中添加dns信息 DNS114.114.114.114保存退出依次执行重启解析服务systemctl restart systemd-resolved设置解析服务开机…