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

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.rhkb.cn/news/446245.html

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

相关文章

完成Sentinel-Dashboard控制台数据的持久化-同步到Nacos

本次案例采用的是Sentinel1.8.8版本 一、Sentinel源码环境搭建 1、下载Sentinel源码工程 git clone https://github.com/alibaba/Sentinel.git 2、导入到idea 这里可以先运行DashboardApplication.java试一下是否运行成功,若成功,源码环境搭建完毕&a…

IDEA Sping Boot 多配置文件application Maven动态切换

新建application-dev.yml与application-prod.yml pom.xml文件下添加profiles等 让idea识别出配置文件 <profiles><profile><id>dev</id><properties><!-- 环境标识&#xff0c;需要与配置文件的名称相对应 --><profiles.active>dev&…

基于京东:HotKey实现自动缓存热点Key!!!

一.引言 某些热点数据&#xff0c;我们提前如果能够预判到的话&#xff0c;可以提前人工给数据加缓存&#xff0c;也就是缓存预热&#xff0c;将其缓存在本地或者Redis中&#xff0c;提高访问性能同时&#xff0c;减低数据库压力&#xff0c;也减轻后端服务的压力。但是&#…

大顶堆优化dp,带限制的子序列

前言&#xff1a;看到这个题目的时候我们可以用大顶堆记录前面的最大值&#xff0c;这样我们转移的时候就少了很多繁琐的查询 题目地址 class Solution { public:int constrainedSubsetSum(vector<int>& nums, int k) {int n nums.size();vector<int> ans nu…

【计算机网络 - 基础问题】每日 3 题(三十八)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

小米路由器刷机istoreOS,愉快上网

istoreOS与openwrt openwrt是一个开源的路由器系统&#xff0c;市场上所有小米路由器的内部系统都是基于openwrt进行二次开发形成的&#xff0c;做了硬件适配和功能上的阉割&#xff0c;不太好用。 istoreos是小宝团队基于openwrt制作的一个发行版&#xff0c;更适合中国宝宝体…

计算机网络:数据链路层 —— 网络适配器与 MAC 地址

文章目录 网络适配器使用网络适配器网络适配器类型 MAC 地址MAC 地址格式MAC 地址类型MAC 地址发送顺序数据接收MAC 地址泄露问题 网络适配器 要将计算机连接到以太网&#xff0c;需要使用相应的网络适配器&#xff08;Adapter)&#xff0c;网络适配器一般简称为“网卡”。在计…

AirServer v7.2.7 破解版 – iPhone屏幕镜像工具

AirServer v7.2.7 破解版 – iPhone屏幕镜像工具可以将你的Mac转变为一个通用的镜像接收器&#xff0c;除了无法接收Miracast外&#xff0c;你可以使用内置的AirPlay或Google Cast基于屏幕投影功能来镜像你的设备屏幕&#xff1b;一次一个或同时投影到AirServer。用户可以从任何…

TGRS 2024 面向雾天遥感图像的定向目标检测算法

TGRS 2024 | 面向雾天遥感图像的定向目标检测算法 论文信息 摘要 目前&#xff0c;大量工作集中在航空目标检测上&#xff0c;并取得了良好的结果。尽管这些方法在传统数据集上取得了有希望的结果&#xff0c;但在恶劣天气条件下捕获的低质量图像中定位对象仍然具有挑战性。目…

数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果 tips:完成项目的前提不需要一定看视频 1 数据结构&#xff1a;扩展哈希 解释下这张图&#xff1a; 图中header的最大深度2&#xff0c;directory最大深度2&#xff0c;桶的容量2。 最开始的时候只有一个header。 插入第一个数据&#xff0c;假设这个数据对应的哈希…

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1&#xff1a;input_size 每个词的词向量维度&#xff08;输入层神经元的个数&#xff09;参数2&#xff1a;hidden_size 隐藏层神经元的个数参数3&#xff1a…

【puppeteer】wvp-puppeteer制作 过程

目录 最后的结论 制作windows&ubuntu的docker 重启桌面上的docker 命令重启 通过 Docker Desktop 图形界面重启 制作centos docker 测试 参考文档 最后的结论 ubuntu && windows 使用 dualvenregistry:5000/wvp-puppeteer:1.0 centos7 使用&#xff1a;…

RabbitMQ事务模块

目录 消息分发​​​​​​​ 负载均衡 幂等性保障 顺序性保障 顺序性保障方案 二号策略:分区消费 三号策略:消息确认机制 四号策略: 消息积压 RabbitMQ集群 选举过程 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制&#xff0c;要么全部成功&#xff0c;要么全…

Java——数组的定义与使用

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;数组的概念以及定义,初始化 1.1&#xff1a;数组概念以及定义 数组概念&#xff1a;可以看成…

四边形网格生成算法:Q-Morph(三)底边生成四边形

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 参考论文&#xff1a;Q-Morph an indirect approach to advancing front quad meshing ε − π − θ ∈ ⋅ \varepsilon - \pi - \theta \in \cdot ε−π−θ∈⋅ …

通过redis实现高性能计费处理逻辑

计费服务一般都是跟资金相关&#xff0c;所以它在系统中是非常核心的模块&#xff0c;要保证服务的高可用、事务一致性、高性能。服务高可用需要集群部署&#xff0c;要保证事务一致性可以通过数据库来实现&#xff0c;但是只通过数据库却很难实现高性能的系统。 这篇文章通过使…

解锁5 大无水印热门短视频素材库

想让你的抖音视频更出彩吗&#xff1f;想知道那些爆款视频的素材源头吗&#xff1f;快来了解以下 5 个超棒的视频素材下载平台。 蛙学网 国内的视频素材佼佼者&#xff0c;有大量 4K 高清且无水印的素材&#xff0c;自然风光、情感生活等类别任你选&#xff0c;不少还免费&…

关于wordpress建站遇到的问题

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

Spring WebFlux 核心原理(2-1)

1、Spring 响应式编程 1.1、早期响应式解决方案 响应式编程是构建响应式系统的主要候选方案。Spring 4.x 引入了 ListenableFuture 类&#xff0c;它扩展了 Java Future&#xff0c;并且可以基于 HTTP 请求实现异步执行操作。但是只有少数 Spring 4.x 组件支持新的 Java 8 Com…

瑞芯微RK3566/RK3568 Android11使用OTA升级固件方法,深圳触觉智能鸿蒙开发板演示,备战第九届华为ICT大赛

本文介绍瑞芯微RK3566/RK3568在Android11系统OTA升级固件方法&#xff0c;使用触觉智能的Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566&#xff0c;Laval官方社区主荐&#xff01; 1、OTA包生成 在源码根目录上执行以下命令编译OTA包 # make installclean # …