【面试题】Rocketmq面试题总结

为什么使用消息队列(如RocketMQ)?

  • 异步处理:解耦系统间调用,提高响应速度。
  • 解耦:降低模块间的直接依赖,使系统更易于扩展和维护。
  • 流量削峰:在高峰期将请求暂时存储起来,避免对后端服务造成压力。
  • 广播与分布式事务:支持广播消费模式以及分布式事务消息实现最终一致性。

介绍一下RocketMQ的架构组成?

  • NameServer:轻量级注册中心,负责Broker节点管理与Topic路由信息的提供。
  • Broker:消息中间件的核心服务,包括MasterBroker和SlaveBroker,用于接收、存储和转发消息。
  • Producer:生产者客户端,负责向Broker发送消息。
  • Consumer:消费者客户端,负责从Broker拉取消息并消费。
  • Topic:逻辑上的消息队列,生产者发布消息至特定Topic,消费者订阅相应Topic获取消息。

RocketMQ中如何保证消息不丢失?

  • 顺序写磁盘,确保刷盘成功后再返回确认结果给Producer。
  • 提供同步/异步发送方式,并且有事务消息来保证跨系统的分布式事务一致。
  • 配置合理的重试策略,在网络不稳定或Broker宕机时进行消息重投。

解释一下RocketMQ的消息顺序性是如何保证的?

在单个Message Queue内部,RocketMQ可以保证消息的顺序性。通过指定同一个Producer实例,按照发送顺序写入同一个Message Queue,相应的Consumer实例按顺序拉取该Queue中的消息即可保证顺序。

谈谈RocketMQ的高可用性和负载均衡机制?

高可用性体现在:

  • Broker采用主备部署,当主节点发生故障时,可自动切换到备用节点继续服务。
  • NameServer集群化部署,多个NameServer之间无状态,提高了整个系统的可用性。

负载均衡机制:

  • 生产者可以在发送消息时实现负载均衡,通过轮询或其他策略选择不同的Message Queue。
  • 消费者组内的消费者可以根据消费情况动态调整消费队列的分配,达到负载均衡的效果。

在RocketMQ中,如果Consumer数量小于Queue的数量会怎么样?大于Queue的数量又会怎样?

如果Consumer数量小于Queue的数量,部分Consumer将会消费多个Queue,确保所有Queue都有对应的Consumer进行消费。
如果Consumer数量大于Queue的数量,则多出来的Consumer将无法分配到Queue,因此处于空闲状态,直到有新的Queue加入或者已有Queue的消费权转移。

列举几个RocketMQ在实际业务场景的应用案例?

  • 订单系统中订单创建后的库存扣减操作。
  • 日志收集系统,将分散的日志数据统一汇集处理。
  • 实时交易流水处理、大数据实时计算前的数据缓存等。

简述一下RocketMQ的Push和Pull两种消费模式的区别?

Push模式下,Broker主动推送消息给Consumer,适用于实时性要求较高的场景,但需要处理好反压问题以防止消息堆积。
Pull模式下,Consumer主动拉取消息,它能更好地控制消费速率和处理能力,适合消息处理时间较长或者消息积压较大的场景。

在RocketMQ中,如何实现分布式事务?请简述其原理和步骤。

RocketMQ通过半消息(Half Message)机制来支持分布式事务。

具体步骤如下:
a. 发送阶段
生产者发送预提交消息(half message),此时消息暂不能被消费,但会持久化到Broker。
根据预提交消息执行本地事务逻辑。
本地事务执行成功后,向Broker发送二次确认请求,将预提交消息变为可消费的已提交状态。
若本地事务执行失败,则发送回滚请求,Broker将会删除该预提交消息。
b. 消费阶段
只有接收到生产者确认的消息才会投递给消费者进行消费。
c. 回查机制
如果在一定时间内未收到生产者的二次确认或回滚请求,Broker会发起消息回查,询问生产者当前事务的状态,并根据响应决定是提交还是回滚消息。

如何在RocketMQ中实现延时消息功能?

RocketMQ通过定时队列(ScheduleMessageService)实现延时消息功能。当生产者发送一条带有延时属性的消息时,RocketMQ不会立刻投递,而是将其存储在一个特定的延时队列中,同时设置一个过期时间戳。ScheduleMessageService服务会定期扫描这些延时队列,当发现消息过期时,会将其移动到对应的正常Topic并按照普通消息流程进行消费。

RocketMQ如何支持消息过滤功能?

RocketMQ提供标签(Tag)作为消息筛选的基础。生产者在发送消息时可以为每条消息指定一个或多个Tag,而消费者在订阅Topic时不仅可以指定具体的Topic,还可以指定需要消费的Tag集合。这样,Broker在转发消息给消费者时,会根据消费者的订阅关系和消息携带的Tag信息,仅将符合Tag要求的消息推送给消费者。

RocketMQ提供了哪些监控指标和告警机制?

RocketMQ内置了丰富的监控指标,例如Broker节点状态、消息堆积量、消息发送/接收成功率、系统资源使用情况(CPU、内存、磁盘空间等)、网络流量等。通过OpenMessaging Metrics API暴露这些指标数据,可以对接Prometheus、Grafana等监控系统进行实时监控与展示。
同时,可以通过配置邮件告警、短信告警或者集成企业内部的告警系统,针对关键指标设置阈值,一旦超过阈值即触发告警通知,如消息堆积数量达到一定程度时,及时提醒运维人员排查问题。此外,RocketMQ还支持通过JMX接口进行更深入的管理与监控操作。

mq中的消息重复消费问题

在消息队列(MQ)中,消息重复消费问题是一个常见的挑战,主要发生在以下几个场景:

  • 消费者故障:当消费者处理完一条消息后,在提交确认之前突然崩溃或重启,导致已经处理的消息的确认状态未被更新到消息队列系统中。当消费者重新上线时,可能会从上次中断的地方开始重新消费,从而导致消息被重复消费。
  • 网络延迟或异常:在网络不稳定的情况下,消费者成功处理了消息但确认回执未能及时到达消息队列服务器,也会造成消息可能被再次投递给消费者。
  • 消息重试机制:如果消息队列服务提供了消息重试功能,在消息消费失败达到一定次数后,会自动将消息重新放回队列等待下一次消费,这也可能导致消息被多次消费。

解决消息重复消费的方法主要有以下几种:

  • 幂等性设计:确保消息处理逻辑具有幂等性,即同一个消息无论被消费多少次,其结果都是相同的,并且不会对业务状态产生负面影响。例如,在数据库操作中,通过主键或者事务保证同一事务只执行一次。
  • 消息唯一标识与去重:
    在消费端记录已处理消息的唯一标识,如订单号、消息ID等,将其存储在数据库中并设置唯一约束,这样即使消息被重复消费,由于唯一约束的存在,后续重复的消息也不会对业务数据造成影响。
  • 使用Redis或其他缓存系统作为中间件进行去重,比如使用Redis的setNX命令来判断是否已处理过该消息。
  • 消息状态跟踪:消费者在处理消息前先检查消息的状态,如果发现消息已经被处理过了,则直接忽略这条消息。
  • 补偿机制:对于一些无法简单实现幂等性的操作,可以引入补偿机制,即针对错误的业务操作进行逆向操作以恢复正确的业务状态。
  • 消息确认机制:确保消费者正确地调用消息队列提供的确认API(如ACK),并在处理消息后立即提交确认,防止因客户端崩溃等原因造成的消息重复投递。

总之,解决消息重复消费问题需要结合具体的业务场景和技术手段,其中最重要的是设计幂等性处理逻辑和合理利用消息队列系统的确认机制。

mq的对比和选择

消息队列(Message Queue,MQ)是分布式系统中常见的组件,用于解耦、异步处理和流量削峰等场景。

以下是一些常见MQ的对比和选择建议:

  • RabbitMQ:开源且广泛使用的消息中间件,遵循AMQP协议。
    特点:支持多种协议,跨语言客户端库丰富,可靠性和稳定性强,易于管理和监控,提供灵活的路由、交换机和绑定机制,支持事务和消息确认机制。
    适用场景:需要高度定制化消息路由策略,对可靠性要求较高的业务场景。
  • Apache Kafka:高吞吐量、低延迟的发布订阅消息系统,主要用于大数据实时处理场景。
    特点:基于磁盘持久化的分布式流平台,具备高并发和海量数据处理能力,适用于大规模实时数据处理与日志收集。
    适用场景:大数据处理、实时流计算、日志聚合分析、监控报警等。
  • Apache RocketMQ:阿里巴巴开源的分布式消息中间件,设计之初主要面向金融级互联网交易场景。
    特点:高性能、高可用、高可靠,支持顺序消息、事务消息、定时/延时消息等功能,适合于大规模分布式系统的构建。
    适用场景:电商、金融等行业的大规模消息传递,对消息顺序性、事务性有较高需求的业务场景。
  • AWS SQS (Simple Queue Service):AWS提供的云服务型消息队列,易于部署和管理。
    特点:可扩展性强,提供了标准队列和FIFO队列两种模式,分别对应常规消息传递和先进先出的消息传递需求。
    适用场景:在AWS云环境中构建应用,尤其是微服务架构中的解耦和服务间通信。
  • Google Cloud Pub/Sub:Google Cloud Platform 提供的完全托管式消息队列服务。
    特点:提供同步和异步消息传递,具有高可用性和可扩展性,支持百万级别的主题和订阅。
    适用场景:GCP环境下的云原生应用开发,以及需要处理大量实时事件的场景。

选择合适的MQ产品,应考虑以下几个关键因素:

  • 系统需求:消息吞吐量、延迟要求、是否需要顺序消费、事务支持等。
  • 技术栈兼容性:与现有技术栈的集成难度,是否有对应的客户端库支持。
  • 可靠性和容错性:系统能否保证消息不丢失,是否支持主备切换、故障恢复等高可用特性。
  • 成本和运维:如果是云服务型MQ,要考虑成本投入;如果是自建MQ,需评估运维复杂度和资源开销。
  • 社区活跃度和文档完善度:对于开源项目,社区的支持程度和技术文档的质量直接影响到后续的技术支持和问题解决速度。

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

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

相关文章

flink重温笔记(十):Flink 高级 API 开发——flink 四大基石之 State(涉及Checkpoint)

Flink学习笔记 前言:今天是学习 flink 的第 10 天啦!学习了 flink 四大基石之 State (状态),主要是解决大数据领域增量计算的效果,能够保存已经计算过的结果数据状态!重点学习了 state 的类型划…

相对于 Linux,Windows Server 存在的意义是什么?

相对于 Linux,Windows Server 存在的意义是什么? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给…

【LeetCode】389_找不同_C

题目描述 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 https://leetcode.cn/problems/find-the-difference/description/ 示例 示例 1: 输…

新版AndroidStudio的Gradle窗口显示task list not built 问题解决

在使用新版AndroidStudio时,会出现,Task List not built 的问题。如果你记得task的名字,当然可以 直接通过命令 gradle taskname 或者 ./gradlew taskName直接执行即可,但是若是记不住,还是把这个任务构建处理比较好用…

借助工具优化开发流程,提升开发体验

背景 最近在做一个demo,只有一个html页面,需要开启一个https web server,以此来实现在浏览器中访问。 改造前 改造前,每次修改文件保存后都要刷新一下浏览器。 如果只是短时间,每次修改后手动刷新浏览器也还行。主要…

C++:Stack和Queue的模拟实现

创作不易,感谢三连! 一、容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 就如同是电源适配器将不适用的交流电…

用不了google翻译怎么办?

如果无法使用谷歌翻译,你可以尝试以下方法: 寻找替代服务:可以搜索并了解其他翻译服务,如百度翻译、有道翻译等。这些服务通常提供免费或低价的翻译服务,以满足日常需求。使用本地翻译工具:在某些国家和地…

2k_Day1:今天是设计模式的大白话1

大白话: 原则有一点很难做到,就是定义好的类,只能加不能改(开放-关闭原则) 1.工厂模式就是,比如你定了一个汽车接口,然后小车、中车、大车都继承这个接口,这时,定一个汽…

在明确自己已经下载好了依赖库,但Vue3引用第三方模块报错Could not find a declaration file for module ***

在 Vue 3 TypeScript 项目中,引入第三方库时,有时会遇到该模块无定义文件的问题。通常,我们可以尝试以下两种方式解决: 方法 1: 使用 require 语句 在 TypeScript 文件中,使用 require 语句来代替 import 语句,例如…

day04-Maven

一、初识 Maven Maven 是 Apache 旗下的一个开源项目,是一款用于管理和构建 java 项目的工具。 官网:https://maven.apache.org/ Maven的作用 依赖管理(方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题)统一项目…

想开发苹果群控软件?先了解这些代码!

随着智能设备的普及,群控软件的需求日益增加,特别是针对苹果设备的群控软件,因其出色的性能和广泛的用户基础,受到了开发者们的青睐。 然而,开发一款功能强大的苹果群控软件并非易事,需要深入了解苹果的开…

获取C语言语句对应的汇编码和机器指令

借助IDE的调试功能 以CodeBlocks为例,先设置断点,然后点击红色三角形调试。 然后选择Debug➡ Debugging Windows➡Disassembly 就可以看到了 使用命令行 在工程文件中,一般可以找到一个.o文件。如果没有,可以先在program.c的目录下…

掌握java中继承

目录 1.概念: 2.使用: 3.super关键字 4.子类构造方法 5.super和this关键字 6.初始化时代码块的执行顺序 7.继承的方式 8.final关键字 1.概念: 是面向对象程序设计代码可以重复使用的重要手段,允许程序员在保持原有类特性的…

git入门到精通

第3章 Git常用命令 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地 状态 3.3.1 首次查看(工作区没有任何文件) 3.3.2 新增文件(hello.txt) 3.3.3 再次查者(检測到末追踪的文件) 3.4添加暫存区 3…

新手如何练习SQL?|掌握

对于新手想要练习SQL语句,可以从以下几个方面入手: 1. 建立理论基础 首先深入理解数据库的核心组件,包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型(如字符串、整型、日期等),以及数据库…

java常用排序算法——冒泡排序,选择排序概述

前言: 开始接触算法了,记录下心得。打好基础,daydayup! 算法 算法是指解决某个实际问题的过程和方法 排序算法 排序算法指给混乱数组排序的算法。常见的有:冒泡排序,选择排序 冒泡排序: 冒泡排序指在数组…

python基础7_数据类型

在生活中举例 人是不是分为黑人,白人,黄种人(人的类型) 穿的衣服,休闲服装,修身的服装,运动服, 工装服,(衣服的类型) 同理,变量也有数据类型 那么怎么查看变量的数据类型呢? name "莫扎特" print(type(name)) 看看变量的几个常用的数据类型 int , float, boo…

python界面开发 - Label 提示框

文章目录 1. Label 提示框1.1. 显示文本1.2. 修改Label的文本1.2.1. 方式1:通过label.config()1.2.2. 方式2:通过 label["text"] 属性进行修改 1.3. 设置背景图片 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2…

C++从零开始的打怪升级之路(day45)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉树的题目 1.根据二叉树创建字符串 606. 根…

简单认识Linux

今天带大家简单认识一下Linux,它和我们日常用的Windows有什么不同呢? Linux介绍 Linux内核&发行版 Linux内核版本 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与…