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

devtools/2024/10/19 2:21:49/

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.ppmy.cn/devtools/125336.html

相关文章

awk脚本通过将多行拼接成一行并在 SQL 语句的末尾遇到分号(;)时打印出来

concact_sql.awk 脚本如下 {if ($0 ~ /^SELECT|UPDATE|DELETE|INSERT/) {flag 1buffer ""gsub(/\n/, "", $0)cli $0} else if (flag) {if ($0 ~ /;/) {flag 0print cli buffer $0} else {buffer buffer $0}} else if (flag 0) {print $0} } 这个 aw…

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

LP笔试record

1. 这四个选项中&#xff0c;不正确的描述是&#xff1a; “当进程中的一个用户线程被阻塞时&#xff0c;整个进程并不用等待。” 理由&#xff1a; 采用轮转调度算法&#xff0c;进程中设置内核线程和用户线程的效果完全不同 这个描述是正确的。用户线程和内核线程在操作系…

【C++打怪之路Lv8】-- string类

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截&#xff0c;但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢&#xff1f; 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

基于java的企业车辆管理系统设计与实现(论文+源码)-kaic

摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理分配使用问题。现有的车辆管理系统存在着不足之处&#xff0c;例如系统不够稳定&#xff0c;功能不够全面。因此&#xff0c…

facebook受众选择设置策略的最佳方式

在进行Facebookguanggao投放时&#xff0c;受众的选择是一个至关重要的步骤。正确的受众选择不仅能够帮助我们更好地定位目标用户&#xff0c;还能显著提高guanggao的转化率和投资回报率&#xff08;ROI&#xff09;。然而&#xff0c;受众选择的数量和范围同样是需要认真考虑的…

IP地址如何支持远程办公?

由于当今社会经济的飞速发展&#xff0c;各个方向的业务都不免接触到跨省、跨市以及跨国办公的需要&#xff0c;随之而来的远程操作的不方便&#xff0c;加载缓慢&#xff0c;传输文件时间过长等困难&#xff0c;如何在万里之外实现远程办公呢&#xff1f;我们以以下几点进行阐…