常见面试题之MQ篇

news2024/11/8 21:26:08

1.1.你们为什么选择了RabbitMQ而不是其它的MQ

如图:

在这里插入图片描述

话术:

kafka是以吞吐量高而闻名,不过其数据稳定性一般,而且无法保证消息有序性。我们公司的日志收集也有使用,业务模块中则使用的RabbitMQ

阿里巴巴的RocketMQ基于Kafka的原理,弥补了Kafka的缺点,继承了其高吞吐的优势,其客户端目前以Java为主。但是我们担心阿里巴巴开源产品的稳定性,所以就没有使用。

RabbitMQ基于面向并发的语言Erlang开发,吞吐量不如Kafka,但是对我们公司来讲够用了。而且消息可靠性较好,并且消息延迟极低,集群搭建比较方便。支持多种协议,并且有各种语言的客户端,比较灵活。SpringRabbitMQ的支持也比较好,使用起来比较方便,比较符合我们公司的需求。

综合考虑我们公司的并发需求以及稳定性需求,我们选择了RabbitMQ

1.2.RabbitMQ如何确保消息的不丢失?

话术:

RabbitMQ针对消息传递过程中可能发生问题的各个地方,给出了针对性的解决方案:

  • 生产者发送消息时可能因为网络问题导致消息没有到达交换机:
    • RabbitMQ提供了publisher confirm机制
      • 生产者发送消息后,可以编写ConfirmCallback函数
      • 消息成功到达交换机后,RabbitMQ会调用ConfirmCallback通知消息的发送者,返回ACK
      • 消息如果未到达交换机,RabbitMQ也会调用ConfirmCallback通知消息的发送者,返回NACK
      • 消息超时未发送成功也会抛出异常
  • 消息到达交换机后,如果未能到达队列,也会导致消息丢失:
    • RabbitMQ提供了publisher return机制
      • 生产者可以定义ReturnCallback函数
      • 消息到达交换机,未到达队列,RabbitMQ会调用ReturnCallback通知发送者,告知失败原因
  • 消息到达队列后,MQ宕机也可能导致丢失消息:
    • RabbitMQ提供了持久化功能,集群的主从备份功能
      • 消息持久化,RabbitMQ会将交换机、队列、消息持久化到磁盘,宕机重启可以恢复消息
      • 镜像集群,仲裁队列,都可以提供主从备份功能,主节点宕机,从节点会自动切换为主,数据依然在
  • 消息投递给消费者后,如果消费者处理不当,也可能导致消息丢失
    • SpringAMQP基于RabbitMQ提供了消费者确认机制、消费者重试机制,消费者失败处理策略:
      • 消费者的确认机制:
        • 消费者处理消息成功,未出现异常时,Spring返回ACKRabbitMQ,消息才被移除
        • 消费者处理消息失败,抛出异常,宕机,Spring返回NACK或者不返回结果,消息不被异常
      • 消费者重试机制:
        • 默认情况下,消费者处理失败时,消息会再次回到MQ队列,然后投递给其它消费者。Spring提供的消费者重试机制,则是在处理失败后不返回NACK,而是直接在消费者本地重试。多次重试都失败后,则按照消费者失败处理策略来处理消息。避免了消息频繁入队带来的额外压力。
      • 消费者失败策略:
        • 当消费者多次本地重试失败时,消息默认会丢弃。
        • Spring提供了Republish策略,在多次重试都失败,耗尽重试次数后,将消息重新投递给指定的异常交换机,并且会携带上异常栈信息,帮助定位问题。

1.3.RabbitMQ如何避免消息堆积?

话术:

消息堆积问题产生的原因往往是因为消息发送的速度超过了消费者消息处理的速度。因此解决方案无外乎以下三点:

  • 提高消费者处理速度
  • 增加更多消费者
  • 增加队列消息存储上限

1)提高消费者处理速度

消费者处理速度是由业务代码决定的,所以我们能做的事情包括:

  • 尽可能优化业务代码,提高业务性能
  • 接收到消息后,开启线程池,并发处理多个消息

优点:成本低,改改代码即可

缺点:开启线程池会带来额外的性能开销,对于高频、低时延的任务不合适。推荐任务执行周期较长的业务。

2)增加更多消费者

一个队列绑定多个消费者,共同争抢任务,自然可以提供消息处理的速度。

优点:能用钱解决的问题都不是问题。实现简单粗暴

缺点:问题是没有钱。成本太高

3)增加队列消息存储上限

RabbitMQ1.8版本后,加入了新的队列模式:Lazy Queue

这种队列不会将消息保存在内存中,而是在收到消息后直接写入磁盘中,理论上没有存储上限。可以解决消息堆积问题。

优点:磁盘存储更安全;存储无上限;避免内存存储带来的Page Out问题,性能更稳定;

缺点:磁盘存储受到IO性能的限制,消息时效性不如内存模式,但影响不大。

1.4.RabbitMQ如何保证消息的有序性?

话术:

其实RabbitMQ是队列存储,天然具备先进先出的特点,只要消息的发送是有序的,那么理论上接收也是有序的。不过当一个队列绑定了多个消费者时,可能出现消息轮询投递给消费者的情况,而消费者的处理顺序就无法保证了。

因此,要保证消息的有序性,需要做的下面几点:

  • 保证消息发送的有序性
  • 保证一组有序的消息都发送到同一个队列
  • 保证一个队列只包含一个消费者

1.5.如何防止MQ消息被重复消费?

话术:

消息重复消费的原因多种多样,不可避免。所以只能从消费者端入手,只要能保证消息处理的幂等性就可以确保消息不被重复消费。

而幂等性的保证又有很多方案:

  • 给每一条消息都添加一个唯一id,在本地记录消息表及消息状态,处理消息时基于数据库表的id唯一性做判断
  • 同样是记录消息表,利用消息状态字段实现基于乐观锁的判断,保证幂等
  • 基于业务本身的幂等性。比如根据id的删除、查询业务天生幂等;新增、修改等业务可以考虑基于数据库id唯一性、或者乐观锁机制确保幂等。本质与消息表方案类似。

1.6.如何保证RabbitMQ的高可用?

话术:

要实现RabbitMQ的高可用无外乎下面两点:

  • 做好交换机、队列、消息的持久化
  • 搭建RabbitMQ的镜像集群,做好主从备份。当然也可以使用仲裁队列代替镜像集群。

1.7.使用MQ可以解决那些问题?

话术:

RabbitMQ能解决的问题很多,例如:

  • 解耦合:将几个业务关联的微服务调用修改为基于MQ的异步通知,可以解除微服务之间的业务耦合。同时还提高了业务性能。
  • 流量削峰:将突发的业务请求放入MQ中,作为缓冲区。后端的业务根据自己的处理能力从MQ中获取消息,逐个处理任务。流量曲线变的平滑很多
  • 延迟队列:基于RabbitMQ的死信队列或者DelayExchange插件,可以实现消息发送后,延迟接收的效果。

服务之间的业务耦合。同时还提高了业务性能。

  • 流量削峰:将突发的业务请求放入MQ中,作为缓冲区。后端的业务根据自己的处理能力从MQ中获取消息,逐个处理任务。流量曲线变的平滑很多
  • 延迟队列:基于RabbitMQ的死信队列或者DelayExchange插件,可以实现消息发送后,延迟接收的效果。

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

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

相关文章

SQL——子查询

在SQL语言中,一个SELECT-FROM-WHERE语句 称为一个查询块。 子查询(或内层查询)是一个 SELECT 查询,它嵌套在 (1)SELECT、UPDATE、INSERT、DELETE 语句的 WHERE 、 (2)带GROUP BY 的 HAVING 子句内, (3)或其它子查询中 (与比较(6个…

JDBC MySQL ORM 实现登录功能(避免SQL注入)

目录 一、创建数据库表 二、创建Users类 三、登录类 四、存在的漏洞 (1)SQL注入 (2)分析 (3)补救 一、创建数据库表 CREATE DATABASE jdbcdatabase;CREATE TABLE IF NOT EXISTS user( uid INT PRIMARY KE…

windows 配置 libxml2

1、下载需要的包 1)libconv LibIconv for Windows 2) libxml2 Releases GNOME / libxml2 GitLab 2、配置文件 将 libxml2 的包解压到一个目录,并在该目录下创建 include 和 lib 目录 将如下的 iconv.h 复制到新建的 include 目录 路径&#xff…

013 - C++引用

本期我们要讲的是 C 中的引用。 上期我们讨论了指针,如果你没有看过那期内容,你一定要回去看看,因为引用实际上只是指针的扩展,你至少需要在基本层面上理解指针是如何工作的,然后才能继续学习本期的内容,本…

UI Toolkit(1)

UI ToolkitUI Toolkit界面画布设置背景制作UI布局UI Toolkit界面 在Unity 2021LTS版本之后UI Toolkit也被内置在Unity中,Unity有意的想让UI Toolkit 成为UI的主要搭建方式,当然与UGUI相比还是有一定的差别。他们各有有点,这次我们就开始介绍…

【Homebrew】MacBook的第二个AppStore

英文官网:Homebrew — The Missing Package Manager for macOS (or Linux) 中文官网:macOS(或 Linux)缺失的软件包的管理器 — Homebrew 1 简介 Homebrew 由开发者 Max Howell 开发,并基于 BSD 开源,是一…

基于K-最近邻算法构建红酒分类模型

基于K-最近邻算法构建红酒分类模型 描述 Wine红酒数据集是机器学习中一个经典的分类数据集,它是意大利同一地区种植的葡萄酒化学分析的结果,这些葡萄酒来自三个不同的品种。数据集中含有178个样本,分别属于三个已知品种,每个样本…

4.10-4.11学习总结

目录 MySql 关系型库数据 mysql启动方法 SQL通用语法 查询表 创建表 Mysql数据类型 表操作-修改 MySQL图形化界面 DCL 函数 约束 JDBC MySql 关系型库数据 建立在关系模型基础上,由多张相互连接的二维表组成的数据库 特点: 使用表存储数据,格式…

【C++】哈希(位图,布隆过滤器)

今天的内容是哈希的应用:位图和布隆过滤器 目录 一、位图 1.位图概念 2.位图的应用 二、哈希切分 三、布隆过滤器 1.布隆过滤器的概念 2.布隆过滤器的应用 四、总结 一、位图 1.位图概念 今天的内容从一道面试题开始引入: 给40亿个不重复的无符…

chapter-5 数据库设计

以下课程来源于MOOC学习—原课程请见:数据库原理与应用 考研复习 引言 设计的时候: 我们为什么不能设计成R(学号,课程号,姓名,所咋系,系主任,成绩)? 因为存在数据冗余…

BGP与OSPF混合组网

如图。R1和R2之间是OSPF Area 0,R23和R4之间是OSPF Area 1,R5和R6之间是OSPF Area2。除了R1和R2之间的cost是100,其余链路的cost都是10. AR1/2/3/4/5/6之间通过Loopback口建立IBGP全互联邻居关系,并且都是AS11520,和外部建立EBGP邻居访问100.100.100.1的网络。(不确定图中…

企业内训视频如何防范被盗录和下载?

企业内训视频如何防范被盗录和下载? 1. 【防下载】:实现视频文件的加密混淆、防下载; 2. 【防录屏】:A.(ID跑马灯防录屏)实现不同学员观看视频,实时显示该学员的姓名手机号时间;B.&…

线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(下)

在上一篇文章中,通过一个例子来说明最小二乘在拟合直线时所发挥的作用,也通过两个插图的比较进一步的阐明了投影与最小化e之间的密切关系。 线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(上)_松下J27的博客-CSD…

【UE Sequencer系列】08-副镜头切换、摄像机绑定摇臂的使用、摄像机绑定滑轨的使用

目录 一、副镜头切换 二、摄像机绑定摇臂的使用 三、摄像机绑定滑轨的使用 一、副镜头切换 1. 为“shot_05”新建镜头(复制资产,创建新的关卡序列) 同样的步骤再创建一个“Shot_07_02” 此时我们就可以对“Shot_07”中的两个副镜头进行切换…

最简单明了vite+ts+sass无loaders配置,利用ts读取scss文件中的变量并在App.vue中使用

做后端的,前端水平有限,最近练手,遇到了左侧菜单是展开关闭的问题,接触到了scss中定义全局变量,利用typescript读取的问题,在此记录一下 vitetssass 环境:package.json中内容如下,…

利用KMean算法进行分类

什么是KMean算法?简要说明什么是KMean算法,以及KMean算法的应用场景。 KMeans是一种聚类算法,它将数据集分成K个不同的类别(簇),使得每个数据点都属于一个簇,并且每个簇的中心点(质…

网络通信的安全性(HTTPS)

网络通信的安全性(HTTPS) 互联网是由无数网络节点组成的,两点之间的通信一般会经过很多个网络节点,因此,我们难免会有疑问: 作为发送方,我发送的消息内容会不会被中间人看到?&…

4.2 矩阵乘法的Strassen算法

1.伪代码以及用到的公式 ​ ​ ​ 2.代码 package collection; ​ public class StrassenMatrixMultiplication {public static int[][] multiply(int[][] a, int[][] b) {int n a.length;int[][] result new int[n][n]; ​if (n 1) {result[0][0] a[0][0] * b[0][0]…

为什么是毫末智行成为了DriveGPT的破壁人?

作者 | 魏启扬 来源 | 洞见新研社 毫末智行有着天生的紧迫感。 很多科技公司一年才举办一次的品牌日活动,毫末智行硬是办成了一个季度一次,活动频次的提高,则意味着组织内部新陈代谢的提速,从研发到落地乃至运营,都要…

ChatGPT 这个风口,普通人怎么抓住?

最近在测试ChatGPT不同领域的变现玩法,有一些已经初见成效,接下来会慢慢分享出来。 今天先给大家分享一个,看完就能直接上手的暴力引流玩法。 所需工具: 1)ChatGPT(最好是plus版,需要保证快速…