消息队列面试题——第二篇

news2024/11/24 16:58:07

1. rocketmq、rabbitmq、kafka的区别

  1. 架构设计和消息模型
特性rocketmqrabbitmqkafka
消息模型基于主题和消费组,支持发布/订阅和点对点两种模型基于队列模型,支持发布/订阅和点对点两种模型基于分区的主题模型,主要用于日志流式处理和高吞吐量的发布/订阅
持久化支持持久化,消息存储在磁盘上;有事务机制确保消息可靠性支持消息持久化,主要依靠内存,使用磁盘持久化提高可靠性默认持久化消息,依赖分区和日志的方式,保证高效持久化和高吞吐量
架构设计分布式架构,内置高可用和分布式存储,支持分布式事务集群模式可选,可以水平扩展但相对复杂,本质上是单节点的基础上扩展本质上是分布式日志系统,天然支持分布式架构和高可用
  1. 性能和吞吐量
特性rocketmqrabbitmqkafka
吞吐量吞吐量较高,但相比kafka略低,单机每秒处理十万级别消息中等,适合低延迟,快速响应的小规模系统。单机吞吐量数千到几万高吞吐量,适合大规模数据流处理,单机可以达到百万级别消息
延迟延迟较低,但是并非最优。适合对实时性有一定要求的场景延迟最低,适合实时性要求非常高的场景延迟较低,但是相比rabbitMq稍高
  1. 消息可靠性和一致性
特性rocketmqrabbitmqkafka
消息可靠性支持事务消息和严格的消息顺序,保证消息可靠送达通过确认机制(ACK)、持久化和镜像队列确保消息的可靠性通过分区副本机制和ACK机制保证消息的高可用和可靠性
一致性模型支持分布式事务和严格顺序消费,可以保证消息的严格一致性对于单个队列的顺序性支持较好,但不支持事务消息强大的一致性和顺序性控制,通过分区和偏移量确保数据顺序
  1. 应用场景
特性rocketmqrabbitmqkafka
应用场景金融支付、订单处理、分布式事务微服务间的轻量级解耦、短消息处理、事件驱动和实时性要求较高的应用大数据处理、日志聚合、流式处理、实时分析
  1. 扩展性和集群能力
特性rocketmqrabbitmqkafka
扩展性支持水平扩展、但配置相对复杂、需要手动调整通过集群模式实现扩展,单扩展复杂度高,高吞吐量时,可能需要更多节点非常容易扩展,设计上支持高水平扩展
高可用性通过主从架构和分布式机制保证数据安全支持镜像队列和高可用配置,但实现复杂通过分区副本机制实现高可用,能够自动进行分区重平衡和故障转移

总结

  • rocketMQ: 适合对 分布式事务、消息顺序性 有着严格要求的场景,如金融支付、订单系统。其分布式架构和高可用性设计使其适合构建大规模分布式系统
  • RabbitMQ:适合需要 低延迟快速响应 的场景,比如 事件驱动架构,微服务解耦。由于其支持AMQP协议,使用起来灵活,适合中小型系统。
  • Kafka: 适合 高吞吐量和大数据处理 场景,如 日志收集、实时流数据分析、数据管道等。

2. 消息队列的模型有哪些

消息队列主要有两种模型:队列模型和发布/订阅模型

1. 队列模型
生产者往某个队列里面发送消息,一个队列可以存储多个生产者的消息,一个队列也可以有多个消费者,但是 消费者之间是竞争关系,即每个消息只能被一个消费者消费。
在这里插入图片描述

2. 发布/订阅模型
为了解决一条消息能被多个消费者消费的问题,发布/订阅模型就来了。该模型将消息发往一个topic即主题中,所有订阅了这个topic的订阅者都能消费这条消息。
在这里插入图片描述
RabbitMQ采用队列模型,RocketMQ和Kafka采用发布/订阅模型。

3. 如何保证消息不丢失

生产消息
生产者发送消息至Broker,需要处理Broker的响应,不论是同步还是异步发送消息,同步和异步回调都需要做好try-catch,妥善的处理响应,如果broker返回写入失败等错误消息,需要重试发送,当多次发送失败需要做日志记录

存储消息
存储消息阶段需要在消息刷盘后再给生产者响应,假设消息写入缓存中就返回响应,那么机器突然断电,消息就没了,而生产者以为已经发送成功了。

如果broker是集群部署,有多副本机制,即消息不仅仅要写入当前broker,还需要写入副本机中,那配置成至少写两台机子再给生产者响应。这样基本就能保证存储的可靠了。

消费消息
消费者真正执行完成逻辑之后,在发送给broker消费成功。

4. Kafka中关于事务消息的实现

Kafka的事务消息用在一次事务中需要发送多个消息的情况,保证多个消息之间的事务约束,即多条消息要么都发送成功,要么都发送失败。
在这里插入图片描述

5. Kafka中Zookeeper的作用

Zookeeper是一个开源的分布式协调服务框架,特别适合存储一些公共的配置信息、集群的一些元数据等。

他有持久节点和临时节点,临时节点配合watcher机制就非常有用。

当创建临时节点的客户端和zookeeper断连之后,这个临时节点就会消失,并且订阅了节点状态变更的客户端会收到这个节点状态变更的通知。
在这里插入图片描述
所以集群中某一个服务上线或者下线,都可以被检测到。因此,可以用来实现服务发现,也可以实现故障转移的监听机制。

Zookeeper为Kafka提供了元数据的管理,例如一些broker的信息、主题数据、分区数据等。

在每个broker启动的时候,都会和zookeeper进行交互,这样zookeeper就存储了集群中所有的主题、配置、副本等信息。

还有一些选举、扩容等机制也都依赖zookeeper。

例如控制器的选举:每个broker启动都会尝试在zookeeper注册/controller临时节点来竞选控制器,第一个创建/controller节点的broker会被指定为控制器。

竞争失败的节点也依赖watcher机制,监听这个节点,如果控制器宕机了,那么其他broker会继续来争抢,实现控制器的failover。

6. Kafka为什么要抛弃zookeeper

  • Kafka身为中间件,依赖zookeeper中间件,这本身就很奇怪。
  • 如果写入数据量过大,zookeeper的性能和稳定性就会下降,所以Kafka集群比较大,分区数很多的时候,zookeeper存储的元数据就会很多,性能也会变差。
  • 另外,zookeeper也是分布式的,也需要选举,他的选举也不快,而在选举的时候是不提供服务的。

7. RabbitMQ中无法路由的消息会去哪里

在RabbitMQ中,如果消息无法路由到任何队列,其去向取决于交换机的配置和消息的属性设置。

RabbitMQ提供了两种处理无法路由消息的方法

  • 如果配置了备用交换机,那么无法路由的消息会被发送到备用交换机
  • 如果将消息的mandatory标志设为true,且消息无法路由到任何队列,RabbitMQ会将消息返回给发布者,发布者通过回调函数接受消息,反之,如果mandatory设为false则会直接将消息丢弃。
  • 如果配置了死信队列,则可以被投递到死信队列中。

8. RabbitMQ中消息什么时候会进入死信交换机

  • 消息被拒绝,且requeue参数为false
  • 消息在队列中过期,且超时未被消费
  • 队列达到最大长度

9. 如何保证消息的有序性

有序性分:全局有序和部分有序

全局有序

如果要保证消息的全局有序,首先只能由一个生产者往topic发送消息,并且一个topic内部只能有一个队列(分区)。消费者也必须是单线程消费这个队列,这样的消息就是全局有序的。

部分有序

绝大部份的有序需求都是部分有序,部分有序我们可以将topic内部划分为我们需要的队列数,把消息通过特定的策略发往固定的队列中,然后每个队列对应一个单线程处理的消费者。这样即完成了部分有序的需求,又可以通过队列数量的并发来提高消息处理效率。
在这里插入图片描述

10. 介绍AMQP协议

AMQP是一种开放标准的应用层协议,定义了消息的格式、消息队列的行为以及客户端和消息中间件之间的通信方式。

他的主要目标是为不同平台上的消息传递提供标准化的、高效和可靠的支持。

AMQP的基本组成部分

  • Message Broker:消息中间件、负责接收、存储和转发消息,在AMQP中,RabbitMQ是一个典型的消息代理实现。
  • Exchange:交换机、负责接收消息并根据绑定规则将消息路由到消息队列。AMQP定义了多种交换机类型,如direct、fanout、topic、header。
  • Queue:队列,用于存储消息,消费者可以从队列中接受消息。
  • Binding:绑定,定义交换机和队列之间的关系和消息路由规则
  • Message:消息,是在系统中传输的基本数据单元,包含消息头和消息体。

AMQP的主要特性

  • 消息路由:AMQP支持复杂的消息路由机制,通过交换机和绑定可以实现灵活的消息传递路径。
  • 消息可靠性:通过消息确认、持久化、死信队列等机制保证消息的可靠性和持久性。
  • 消息传递保证:提供至少一次、至多一次和正好一次三种传递保证。
  • 消息顺序:确保消息在队列中的顺序传递。

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

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

相关文章

基于SSM创城志愿者管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

RNN心脏病预测

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 前期准备 1.数据导入 import pandas as pd from keras.optimizers import Adam from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.p…

jenkins 插件Publish Over SSH

一、安装插件 二、配置sshserver http://192.168.31.156:8080/manage/configure 三、添加自由风格:PublishOverSSHDemo 我们将工作目录:/var/lib/jenkins/workspace/PublishOverSSHDemo下的图片m3.jpeg 同步到目标143服务器目录:/root/imag…

Mysql(七) --- 索引

文章目录 前言1.简介1.1.索引是什么?1.2.为什么使用索引? 2.索引应该使用什么数据结构?2.1.Hash2.2.二叉搜索树2.3.N叉树2.4.B树2.4.1. 简介2.4.2. B树的特点2.4.3. B树和B树的对比 3.Mysql中的页3.1.为什么要使用页3.2.页文件头和页文件尾3.3.页主体3.…

Python开源项目月排行 2024年9月

#2024年9月2024年9月29日1jax一个开源的高性能数值计算库,旨在为机器学习和科学计算提供灵活性和效率。该项目由 Google 研发,并在 GitHub 上进行维护。AX 主要用于以下几个方面: 自动微分:提供高效的自动微分功能,支持…

嵌入式面试——FreeRTOS篇(九) 内存管理

本篇为:FreeRTOS 内存管理篇 一、FreeRTOS内存管理简介 1、FreeRTOS内存管理介绍 答: 在使用 FreeRTOS 创建任务、队列、信号量等对象的时,一般都提供了两种方法: 动态方法创建:自动地从 FreeRTOS 管理的内存堆中申…

【AI绘画教程】StableDiffusion出图颜色偏白发灰?用好VAE立马解决!(附VAE模型下载)

大家好,我是画画的小强 之前已经给大家推荐过不少AI绘画中 Stable Diffusion WebUI 的大模型,今天为大家介绍一下 WebUI 中“外挂VAE”的相关内容,可以解决我们在用大模型出图过程中出现的图像颜色发灰、发白的问题,一起来看看吧…

话说你们维保到期通知都是谁通知的

离谱了,公司有个客户维保到期了 过了2个月才发现。 白干了两个月, 客户也不愿意给这两个月钱。 现在商务和运维在扯皮, 商务说运维部门应该到期给客户发通知, 运维说商务到期要续签, 就应该商务去通知。 然后老…

ppt怎么做出高级感?找对高级ppt模板,轻松一键替换

想问问大家国庆节后的工作忙吗?小编的大厂朋友们都忙疯了! 都在忙着做各种项目的执行总结PPT报告,和接下来的工作计划展望!做出来的PPT还会被领导嫌弃排版没创意、不高级...... 这不,还来找小编,问有没有什…

水库抽样算法(大数据算法作业)

时隔一个多月,终于想起来写大数据算法基础的实验报告,主要是快截止了,hh 这两天加急把这个报告写完了~ 接下来,写一写证明过程(参考书籍:高等教育出版社《数据科学与工程算法基础》)主要代码以…

MODBUS协议介绍,通过MODBUS协议控制伺服电机工作

1.前言 modbus协议本身的介绍,请大家自行查阅资料。本文简单介绍一下如何通过MODBUS协议组装控制指令。 最近搞了一个项目,要驱动伺服电机工作。通过下位机STM32 407 100封脚 给伺服电机发控制指令。电机和下位机之前的通信采用RS485串口通信&#xff…

seaCMS v12.9代码审计学习(下半)

文章目录 admin/admin_safe.php任意文件下载CSRF 添加管理员账户CSRF配合XSS弹cookie admin/admin_safe.php任意文件下载 在admin_safe.php文件下有着这么一段代码,他的作用时检查action的值是否为download,如果为download那么将你传入的文件直接打印给…

LeetCode题练习与总结:二叉树的序列化与反序列化--297

一、题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与…

校园网环境下基于OpenWRT的路由器选型与解决方案

校园网环境下基于OpenWRT的路由器选型与解决方案 网页认证(锐捷认证)解除校园网设备限制,路由器选型和解决方案 openwrt 我们学校校园网一个账号只能登录两台设备,多了直接就退出联网状态,然后校园网是基于锐捷认证进行认证的,然后通过ment…

基于逻辑回归实现乳腺癌预测

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

使用IDEA生成API文档

1. 在IDEA中,Tools->Generate JavaDoc Scope 2.Output Directory里面放,生成的目录。 Other command line arguments:-encoding utf-8 -charset utf-8(解决乱码) 3.点击ok,生成的效果图

构建数字文化产业链,拓展文化产业发展空间

在当今全球化和数字化的双重浪潮下,文化产业正以前所未有的速度进行变革和升级。作为文化与科技深度融合的产物,数字文化产业链正以其独特的魅力和无限的潜力,引领文化产业向更高层次、更广领域迈进。 数字文化产业链的构建,不仅…

特斯拉智驾路线影响国内OEM组织架构变革,Robotaxi重塑汽车定位搅动风云

智驾研发组织面向端到端进行调整,车企内部研发资源聚焦,智驾方案选择将快速收敛 特斯拉在智驾领域的技术方向被国内车企当作学习的范本,而技术路线的切换往往伴随组织架构的调整。特斯拉 FSD 团队人员规模在数百人,但数据积累和训练算力领先。智驾研发迈向端到端使得车企研…

QD1-P13 HTML 表单标签(form)

本节学习 HTML 表单标签:form ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p13 ‍ 知识点1:form标签的用途 ​form​ 标签在HTML中用于创建一个表单,它允许用户输入数据,然后可以将这些数据发送到服务器进行处理。以下…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…