RabbitMQ消息队列常见面试题

前言

本文是对RabbitMQ的常见面试题问答的总结,同时也是一个RabbitMQ的入门学习,还没了解的同学快来认识一下。

1.RabbitMQ消息模型有哪些?

(1)HelloWorld 模型(点对点模型)

  • 一个生产者
  • 一个消息队列
  • 一个消费者

(2)WorkQueues 模型(任务模型)

  • 一个生产者
  • 一个消息队列
  • 多个消费者

(3)Publish/Subscribe 模型(广播模型)

  • 一个生产者
  • 一个 fanout 交换机
  • 多个消息队列
  • 多个消费者
  • 交换机绑定多个队列
  • 每个消息队列绑定一个消费者

(4)Routing 模型(路由模型)

  • 一个生产者
  • 一个 direct 交换机
  • 多个消息队列
  • 多个消费者
  • 交换机绑定多个队列
  • 每个消息队列绑定一个消费者

(5)Topics 模型(动态路由模型)

  • 一个生产者
  • 一个 topic 交换机
  • 多个消息队列
  • 多个消费者
  • 交换机绑定多个队列
  • 每个消息队列绑定一个消费者

参考资料:https://blog.csdn.net/F0217911/article/details/126621205

2.RabbitMQ的使用场景有哪些?

(1)异步处理:比如用户注册或登录时,生产者发送消息到MQ队列,消费者再读取处理消息,执行发送短信和邮件动作。
(2)系统解耦:比如用注册完成,再加一个发送微信通知。只需要新增发送微信消息模块,从MQ中读取任务,发送消息即可。无需改动注册模块的代码,这样注册模块与发送模块通过MQ解耦。
(3)流量削峰:秒杀和抢购等场景经常使用MQ进行流量削峰。活动开始时流量暴增,用户的请求写入MQ,超过MQ最大长度丢弃请求,业务系统接收 MQ中的消息进行处理,达到流量削峰、保证系统可用性的目的。

3.你们用RabbitMQ实现了什么功能?

(1)基于RabbitMQ+Redis+DiyThreadPool实现按顺序幂等消费消息执行任务。

4.如何保证消息幂等性?

消息幂等性是指对于同一条消息,无论重复发送多少次,接收端都只接收到一次消息,且消息的处理结果相同。

(1)生产者生成消息时,每条消息都有唯一ID字段,可以使用UUID或者Snowflake算法等方式生成。
(2)消费者在处理消息时,先根据ID去Redis查询是否存在该消息,若不存在则正产消费,消费完存入此ID到Redis,若存在则说明此消息已被消费过,直接丢弃。

5.如何保证消息顺序性?

很多时候,消息的消费是不用保证顺序的,比如借助mq实现订单超时的处理。但有些时候,业务中可能会存在多个消息需要顺序处理的情况,比如生成订单和扣减库存消息,那肯定是先执行生成订单的操作,再执行扣减库存的操作。

(1)一个消息队列对应一个消费者:这种方法最简单,保证消息是按照顺序进行的。
(2)一个消息队列对应多个消费者:要想保证消息是按照顺序进行的,就得开启单活模式,表示是否最多只允许一个消费者消费,如果有多个消费者同时绑定,则只会激活第一个,除非第一个消费者被取消或者死亡,才会自动转到下一个消费者。

参考资料:https://baijiahao.baidu.com/s?id=1773108861109586675

6.如何避免消息堆积?

消息队列的消息堆积可能是由于消费者无法及时处理消息、消费者处理消息的速度跟不上消息的产生速度、消息队列的容量不足等原因造成的。

(1)增加消息队列数量。
(2)增加消费者数量。
(3)通过自定义线程池异步消费。

7.如何避免消息丢失?

丢失情况主要有生产者丢失消息、消息队列丢失消息、消费者丢失消息三种情况。

(1)消息确认机制。
(2)消息持久化。

8.RabbitMQ中推模式和拉模式的区别

(1)推模式是中间件将消息提前推送给消费者,消费者需设置一个缓冲区缓存消息。好处是消费者总是有一堆在内存中待处理的消息,所以效率高,缺点是缓冲区可能会溢出。
(2)拉模式是消费者有需要时才去中间件拉取消息。
(3)推模式更关注实时性,拉模式更关注消费者的消费能力。

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

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

相关文章

三种 SqlSession

三种 SqlSession ​SqlSession​ 是一个接口,并且里面包含了许多 CRUD 操作数据库等方法。 ​SqlSession​​ 它有三个实现类,分别是 SqlSessionManager​​ 、DefaultSqlSession​​ 和 SqlSessionTemplate​​,其中 DefaultSqlSession​​…

使用函数的选择法排序

本题要求实现一个用选择法对整数数组进行简单排序的函数。 函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。 裁判测试程序样例&am…

15、Kubernetes核心技术 - 探针

目录 一、概述 二、探针类型 2.1、就绪探针(Readiness Probe) 2.2、存活探针(Liveness Probe) 三、探针探测方法 3.1、exec 3.2、httpGet 3.3、tcpSocket 四、探针配置项 五、探针使用 5.1、就绪探针(Readin…

自定义异常面试及答案(2024)

1、为什么要使用自定义异常? 使用自定义异常(Custom Exceptions)在程序设计中是一个良好的实践,它有几个重要的好处: 提高代码可读性: 自定义异常的名称如果能清晰表达出异常的情况,那么阅读代…

springboot整合ftp服务器实现上传与下载

springboot整合ftp服务器实现上传与下载 1. 添加依赖 在项目的pom.xml文件中添加spring-boot-starter-web和commons-net的依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…

Java框架相关高频面试题

一&#xff0c;Spring 1&#xff0c;Spring框架中单例bean是线程安全的吗&#xff1f; 2&#xff0c;什么是AOP&#xff1f;你项目有用过吗&#xff1f; 3&#xff0c;Spring事务的失效场景有哪些&#xff1f; 发生自身调用&#xff08;类中使用this调用本类的方法&#xff0…

全国计算机等级考试| 二级Python | 真题及解析(9)

一、选择题 1. 以下关于程序设计语言的描述,错误的选项是: A Python语言是一种脚本编程语言 B汇编语言是直接操作计算机硬件的编程语言 C程序设计语言经历了机器语言、汇编语言、脚本语言三个阶段 D编译和解释的区别是一次性翻译程序还是每次执行时都要翻译程序 正确答…

java每日一题——找出区间内的素数(答案及编程思路)

前言&#xff1a; 学习编程还是要做大量练习呀&#xff0c;不能只学不练&#xff0c;一个题目可以从多个角度去解决&#xff0c;可以全方面巩固知识点。每天记录一点点&#xff0c;daydayup&#xff01; 题目&#xff1a;判断101-200之间有多少个素数&#xff0c;并输出所有素数…

这货能大大增强ChatGpt的战斗力

今天我给你介绍一个能大大增强ChatGpt的战斗力的工具&#xff1a; gapier。 注册gapier ChatGpt推出了GPTs的功能&#xff0c;在创建GPTs的时候有个Actions的选项&#xff0c;是给我们调用第三方接口用的&#xff0c;以前一直不知道这么用。 直到我发现了一个网站&#xff1a…

11.盛水最多的容器(双指针,C解法)

题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;…

FX3U-1PG使用

作为扩展模块的安装 伺服驱动器的参数设置 1.设置为0&#xff0c;为位置模式&#xff0c;发送脉冲控制&#xff1b; 2. 设置旋转方向&#xff0c;以及脉冲方式&#xff0c;通常设置为01&#xff0c;因为FX3U-1PG只支持正方向脉冲负方向脉冲方式&#xff1b; 当然想改变电机运…

图灵完备 / 图灵机 / 状态转移

图灵完备 "图灵完备"是计算理论中的一个概念&#xff0c;指的是一种计算系统或编程语言具有足够的能力来模拟图灵机&#xff08;Turing machine&#xff09;。 艾伦图灵提出了图灵机的概念&#xff0c;这是一种理论计算机模型&#xff0c;可以执行算法。图灵完备性…

PostgreSQL学习笔记01

RDS RDS是Relational Database Service&#xff08;关系型数据库服务&#xff09;的简称&#xff0c;它是亚马逊AWS提供的一种托管式关系型数据库服务。RDS旨在简化数据库的设置、运维和扩展&#xff0c;使开发人员可以专注于应用程序的开发&#xff0c;而不必关注基础设施的管…

docker如何配置阿里云镜像加速?

登录阿里云后&#xff0c;我们点击右上角的控制台&#xff0c;控制台中搜索镜像加速服务&#xff0c;然后点击帮助文档的官方镜像加速&#xff1a; 点击容器镜像服务控制台&#xff1a; 在镜像工具里面的镜像加速器中就可以看到&#xff1a; 分别执行即可&#xff1a; 之后我们…

Python调用C++/C

#include<iostream> extern "C" {int foo(int a, int b) {std::cout << "a b " << a b << std::endl;return a b;} } 如果是编译C代码&#xff0c;需要写上 extern "c" 生成动态文件&#xff1a;g -shared -o tes…

Docker与虚拟机的比对

在Windows操作系统上的对比&#xff1a; 但是官方还是建议我们尽量不要将Docker直接安装到Windows操作系统上。

k8s---声明式资源管理(yml文件)

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都在y…

5大自动化测试的Python框架,看完就能涨薪5k 【实用干货】

目前&#xff0c;它在Tiobe指数中排名第三个&#xff0c;仅次于Java和C。随着该编程语言的广泛使用&#xff0c;基于Python的自动化测试框架也应运而生&#xff0c;且不断发展与丰富。 因此&#xff0c;开发与测试人员在为手头的项目选择测试框架时&#xff0c;需要考虑许多方…

微服务(12)

目录 56.k8s是怎么进行服务注册的&#xff1f; 57.k8s集群外流量怎么访问Pod&#xff1f; 58.k8s数据持久化的方式有哪些&#xff1f; 59.Relica Set和Replication Controller之间有什么区别&#xff1f; 60.什么是Service Mesh&#xff08;服务网格&#xff09;&#x…

《小学生》知网期刊投稿方式、投稿邮箱

《小学生》是国家新闻出版总署批准的正规期刊&#xff0c;杂志立足教育&#xff0c;服务全国&#xff0c;致力于为广大基础教育工作者搭建一个展示基础教育理论研究成果&#xff0c;交流经验、合作共进的学术平台。是广大专家、学者、教师、学子发表论文、交流信息的重要平台。…