消息中间件之八股面试回答篇:三、RabbitMQ如何解决消息堆积问题(100万条消息堆积)+RabbitMQ高可用性和强一致性机制+回答模板

RabbitMQ中的消息堆积问题

当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题。

解决消息堆积有三种种思路:

  • 增加更多消费者,提高消费速度
  • 在消费者内开启线程池加快消息处理速度
  • 采用惰性队列,扩大队列容积,提高堆积上限

惰性队列

惰性队列的特征如下:

  • 接收到消息后直接存入磁盘而非内存,所以可以支持数百万条的消息存储
  • 消费者要消费消息时才会从磁盘中读取并加载到内存
  • 性能较稳定,但是受限于磁盘IO,时效性会降低。

实现惰性队列只需要在声明队列的时候设置属性x-queue-mode为lazy。

面试不需要掌握,本人存档用的

声明队列时:
在这里插入图片描述
如果是用的注解的话,如下:
在这里插入图片描述

RabbitMQ高可用性和强一致性机制

RabbitMQ有三种集群模式:普通集群、镜像集群、仲裁队列

普通集群

普通集群,或者叫标准集群(classic cluster)
会在集群的各个节点间共享部分数据,包括:交换机、队列元信息(实际上就是队列的地址引用)。不包含队列中的消息

所以队列所在节点宕机,队列中的消息就会丢失。为此出现了镜像集群。

镜像集群

镜像集群:本质是主从模式,具备下面的特征:

  • 交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份。
  • 创建队列的节点被称为该队列的主节点,备份到的其它节点叫做该队列的镜像节点。
  • 一个队列的主节点可能是另一个队列的镜像节点
  • 所有操作都是主节点完成,然后同步给镜像节点
  • 主节点宕机后,镜像节点会替代成新的主节点。
    在这里插入图片描述

但是也可能出现主节点还未来得及同步数据给镜像节点就宕机,从而导致数据丢失的情况。虽然该情况概率比较小,但是某些情况我们需要保证数据的强一致性,为此出现了仲裁队列。

仲裁队列

仲裁队列是3.8版本以后才有的新功能,用来替代镜像队列,具备下列特征:

  • 与镜像队列一样,都是主从模式,支持主从数据同步
  • 使用非常简单,没有复杂的配置
  • 主从同步基于Raft协议,强一致

其中的Raft协议就保证了数据的强一致性,不过与之相对的是性能会降低些。
目前使用最多的还是镜像集群。

问题及回答模板

如果有100万消息堆积在MQ , 如何解决 ?

回答:(背熟以下回答,大概用时1min)

我在实际的开发中,没遇到过这种情况,不过,如果发生了堆积的问题,解决方案也所有很多的。
第一,我们可以使用多线程消费任务。
第二,我们可以增加更多消费者,提高消费速度 。
第三,我们可以扩大队列容积,提高堆积上限 。譬如可以使用RabbitMQ惰性队列,惰性队列与普通队列不同的主要是:接收到消息后直接存入磁盘而非内存,只有消费者要消费消息时才会从磁盘中读取并加载到内存。基于这个性质,使得它可以支持数百万条的消息存储。

RabbitMQ的高可用机制有了解过嘛?、

回答:(背熟以下回答,大概用时1min)

候选人

嗯,熟悉的~

我们当时项目在生产环境下,使用的集群,当时搭建是镜像模式集群,使用了3台机器。

镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完成前,主节点就已经宕机,可能出现数据丢失

面试官:那出现丢数据怎么解决呢?

候选人

我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,保证了数据的强一致。并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是仲裁队列即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络工程师必学知识:2、数据链路层-II型以太帧的封装

1.概述: 针对于链路层,华为官网IP报文格式大全里面包含了很多。如下图: 今天主要分析Ethernet II以太帧。 2.Frame Format: 12Byte(inter frame gap)|7B(同步码)|1B(定界符)|6B(DMAC)|6B(SMAC)|2B(Type)…

【Demo】基于CharacterController组件的角色控制

项目介绍 项目名称:Demo1 项目版本:1.0 游戏引擎:Unity2020.3.26f1c1 IDE:Visual Studio Code 关键词:Unity3D,CharacterController组件,角色控制,自定义按键,Scrip…

解决PyCharm的Terminal终端conda环境默认为base无法切换的问题

问题描述 在使用PyCharm的Terminal终端时,打开的默认环境为base。 在使用切换命令时,依旧无法解决。 解决方法 1、输入以下命令以查看conda的配置信息: conda config --show2、在输出中找到 auto_activate_base 的行,发现被…

IMX6ULL驱动学习——通过总线设备驱动模型点亮野火开发板小灯【参考韦东山老师教程】

参考:【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分)-CSDN博客 韦东山课程:LED模板驱动程序的改造_总线设备驱动模型 我使用的开发板:野火imx6ull pro 欢迎大家一起讨论学习 实现了总线设…

uniapp 实现路由拦截,权限或者登录控制

背景: 项目需要判断token,即是否登录,登录之后权限 参考uni-app官方: 为了兼容其他端的跳转权限控制,uni-app并没有用vue router路由,而是内部实现一个类似此功能的钩子:拦截器,由…

数字图像处理(实践篇)三十三 OpenCV-Python从立体图像创建深度图实践

目录 一 方案 二 实践 双眼视觉是指人类使用两只眼睛同时观察同一场景,通过左右眼的视差来感知深度。左眼和右眼的视差是由于它们在空间中的位置不同而产生的,这种差异可以被大脑解读为物体的距离和深度。为了从立体图像构建深度图,找到两个图像之间的视差,可以初始化并创…

Java强训day7(选择题编程题)

选择题 public class Test01{private static int x 100;public static void main(String[] args) {Test01 hs1 new Test01();hs1.x;Test01 hs2 new Test01();hs2.x;hs1new Test01();hs1.x;Test01.x--;System.out.println("x"x);} }public class Test01{private …

倒排索引的构建与查询

倒排索引是信息检索的重要技术,本文将基于中文短信数据(数据集可在本文所附资源处下载或点击此处链接下载),编程构建倒排索引并实现布尔查询。 1. 功能设计 用户输入查询,按下回车键,如果该查询作为单独的…

Mybatis-Plus入门

Mybatis-Plus入门 MyBatis-Plus 官网:https://mp.baomidou.com/ 1、简介 MyBatis-Plus (简称 MP) 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、 提高效率而生。 https://github.com/baomidou/mybatis-p…

【Java】Spring注解开发

一、Spring注解开发 1 注解开发定义Bean对象【重点】 目的:xml配置Bean对象有些繁琐,使用注解简化Bean对象的定义 问题导入 问题1:使用什么标签进行Spring注解包扫描? 问题2:Component注解和Controller、Service、R…

Blender教程(基础)-初始用户界面-01

开始第一天的Blender学习、也是业余学习。希望记录下这一份学习的过程、并且分享给大家。今天带大家认识Blender这一款软件,先说说我为什么选择了Blender,我在软件市场找了好久,市场上其他雷同软件都是要么收费要么不好用,最终决定…

【Vitest】 Vitest测试框架的简单使用

简言 在了解vue源码的时候接触到了vitest测试框架,它的官网语言有中文,所以本篇只作简单的使用介绍。 Vitest官网 Vitest 旨在将自己定位为 Vite 项目的首选测试框架,即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法…

寒假思维训练计划day16 A. Did We Get Everything Covered?

今天更新一道1月27号晚上div2的C题作为素材,感觉用到了我的构造题总结模型,我总结了一系列的模型和例题。 摘要: Part1 定义"边界贪心法" Part2 题意 Part3 题解 Part4 代码 Part5 思维构造题模型和例题 Part1 边界贪心…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

全球唯一使用Python生成双色球和大乐透

生成双色球和大乐透代码: import randomdef gen_union_lotto(nums: int):"""随机生成N个双色球:param nums::return:"""union_list []for i in range(0, nums):data []for data_ in range(0, 6):random_num random.randint(1, 33…

电脑 文件夹内 显示是 文件在一起 ,实际存储硬盘的不同地方?

是的,在电脑上,文件夹内显示在一起的文件可能实际上存储在硬盘的不同物理位置。这是因为现代操作系统使用的是文件系统来管理磁盘上的数据,常见的如NTFS(Windows)、HFS(旧版Mac)或APFS&#xff…

【GitHub项目推荐--如何构建项目】【转载】

这是一个 138K Star 的开源项目,这个仓库汇集了诸多优质资源,教你如何构建一些属于自己的东西,内容主要分为增强现实、区块链、机器人、编辑器、命令行工具、神经网络、操作系统等几大类别。 开源地址:https://github.com/danist…

【贪吃蛇:C语言实现】

文章目录 前言1.了解Win32API相关知识1.1什么是Win32API1.2设置控制台的大小、名称1.3控制台上的光标1.4 GetStdHandle(获得控制台信息)1.5 SetConsoleCursorPosition(设置光标位置)1.6 GetConsoleCursorInfo(获得光标…

滴水逆向三期笔记与作业——02C语言——10 Switch语句反汇编

滴水逆向三期笔记与作业——02C语言——10 Switch语句反汇编 一、Switch语句1、switch语句 是if语句的简写2、break加与不加有什么特点?default语句可以省略吗?3、游戏中的switch语句(示例)4、添加case后面的值,一个一个增加&…

深兰科技入选亿欧《“制”敬不凡先锋榜·智能机器人Top10》榜单

日前,由亿欧协办的2023工博会工业智能化发展高峰论坛于上海成功举办,会上发布了《2023智能制造:“制”敬不凡先锋者》系列名单。深兰科技凭借在智能机器人开发中的技术创新和模式应用,入选《“制”敬不凡先锋榜——智能机器人Top1…