Java-常见面试题收集(十六)

news2024/11/18 11:30:24

二十五 RocketMQ

1 消息队列介绍

  消息队列,简称 MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。(一个使用队列来通信的组件)它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下:
在这里插入图片描述

2 消息队列的使用场景

  消息队列(Message Queue)是一种在分布式系统中进行异步通信的方法,它允许应用程序之间发送和接收消息,而无需立即进行同步处理。消息队列的使用场景非常广泛,以下是一些常见的使用场景:

  ① 异步处理:
  当一个应用需要执行耗时操作时(如发送邮件、处理图片、进行数据分析等),可以将这些操作放入消息队列中,由后台任务异步处理,从而避免阻塞主线程,提高应用的响应速度。

  ② 解耦:
  在微服务架构中,不同的服务之间可能需要相互通信。通过消息队列,可以将这些服务解耦,使得它们可以独立地进行开发和部署。当一个服务需要调用另一个服务的功能时,只需将消息发送到队列中,然后由另一个服务从队列中取出消息并进行处理。

  ③ 流量削峰:
  在高并发场景下,应用可能会在短时间内接收到大量的请求。如果直接将这些请求交给后台处理,可能会导致系统崩溃。通过将请求放入消息队列中,可以平滑地处理这些请求,避免系统过载。同时,后台可以根据处理能力,从队列中逐步取出消息进行处理。

   ④ 日志处理:
  在分布式系统中,日志的收集和处理是一个重要的问题。通过将日志消息发送到消息队列中,可以集中地对这些日志进行存储、分析和处理。

   ⑤ 任务调度:
  消息队列可以用于实现任务调度系统。例如,可以使用消息队列来触发定时任务、延迟任务或周期性任务。

   ⑥ 数据同步:
   在分布式系统中,不同的服务或数据库之间可能需要保持数据的一致性。通过消息队列,可以实现数据的异步同步。当一个服务的数据发生变化时,可以将变化的信息发送到消息队列中,然后由其他服务从队列中取出信息并更新自己的数据。

   ⑦ 系统解耦和容错:
  消息队列可以作为一个中间件,将不同的系统或组件连接起来。当某个系统或组件出现故障时,其他系统或组件可以继续从消息队列中取出消息进行处理,从而实现系统的容错性。

   ⑧ 消息广播和订阅:
   消息队列支持发布/订阅模式,允许一个或多个消费者订阅某个主题(Topic),当有新消息发布到该主题时,所有订阅了该主题的消费者都会收到该消息。这种模式适用于需要广播消息的场景,如实时推送、新闻发布等。

   ⑨ 分布式事务:
   在分布式系统中实现事务性操作是一个挑战。通过使用消息队列和补偿事务等机制,可以实现分布式事务的可靠执行。当一个操作失败时,可以通过发送补偿消息来撤销之前的操作,确保数据的一致性。

   ⑩ 数据收集和分析:
   消息队列可以用于收集各种类型的数据(如用户行为数据、系统日志等),并将这些数据发送到大数据平台或数据仓库中进行进一步的分析和处理。

3 如何解决消息丢失问题

   一个消息从生产者产生,到被消费者消费,主要经过这 3 个过程:生产者(生产消息),队列(存储消息),消费者(消费消息),保证 MQ 不丢失消息,可以从这三个阶段阐述:

  ① 生产者保证不丢消息(确保生产的消息能到达存储端)
  如果是 RocketMQ 消息中间件,Producer 生产者提供了三种发送消息的方式,分别是:同步发送;异步发送;单向发送。生产者要想发消息时保证消息不丢失,可以:采用同步方式发送,send 消息方法返回成功状态,就表示消息正常到达了存储端 Broker。如果 send 消息异常或者返回非成功状态,可以重试。可以使用事务消息,RocketMQ 的事务消息机制就是为了保证零丢失来设计的

  ② 存储端不丢消息(确保消息持久化到磁盘 – 刷盘机制)
  刷盘机制分同步刷盘和异步刷盘:生产者消息发过来时,只有持久化到磁盘,RocketMQ 的存储端 Broker 才返回一个成功的 ACK 响应,这就是同步刷盘。它保证消息不丢失,但是影响了性能。异步刷盘的话,只要消息写入 PageCache 缓存,就返回一个成功的 ACK 响应。这样提高了 MQ 的性能,但是如果这时候机器断电了,就会丢失消息。
  Broker 一般是集群部署的,有 master 主节点和 slave 从节点。消息到 Broker存储端,只有主节点和从节点都写入成功,才反馈成功的 ack 给生产者。这就是同步复制,它保证了消息不丢失,但是降低了系统的吞吐量。与之对应的就是异步复制,只要消息写入主节点成功,就返回成功的 ack,它速度快,但是会有性能问题。

  ③ 消费阶段不丢消息
  消费者执行完业务逻辑,再反馈会 Broker 说消费成功,这样才可以保证消费阶段不丢消息。

4 消息队列如何保证消息的顺序性

  ① 单一生产者-单一消费者模式:
  在这种模式下,只有一个生产者将消息发送到队列,而只有一个消费者从队列中获取消息。这样可以自然保证消息按照发送的顺序被消费。

  ② 分区顺序消息:
  一些消息队列系统(如Kafka)支持分区的概念。虽然不同分区之间的消息是并行处理的,但在同一个分区内的消息是有序的。如果业务允许,可以将需要保持顺序的消息发送到同一个分区中。

  ③ 消息序列号:
  生产者在发送消息时给每条消息加上序列号,消费者在接收消息后根据序列号进行排序处理。这种方法在消息被打乱的情况下仍然可以恢复消息的顺序。

  ④消息分组:
  一些消息队列支持消息分组的概念,同一分组中的消息会按照发送的顺序被消费。通过将需要保持顺序的消息放入同一个分组,可以确保它们被按顺序处理。

  ⑤ 延迟处理:
  即使消息乱序到达,消费者在处理消息时也可以根据消息中的时间戳或其他信息来重新排序。但这需要消费者具有额外的处理能力,并且可能会增加处理的复杂性。

  ⑥ 队列设计:
  在消息队列中创建多个队列,将同一规则的数据(例如基于唯一标识的哈希)放入同一个队列中。然后确保消费者只从一个队列中取出并消费数据,从而保持顺序性。

  ⑦ 分布式系统中的分区和路由:
  对于像Kafka这样的系统,可以通过精心设计的分区键(Partition Key)来确保相关消息被路由到同一个分区,从而保持顺序。

  ⑧ 使用特定的消息队列系统:
  一些消息队列系统(如RabbitMQ)提供了更高级的特性来支持消息的顺序性。例如,RabbitMQ中的消息可以具有优先级,或者通过特定的队列和交换机配置来确保顺序。

  ⑨ 在消费者端保证顺序:
  如果消息队列系统本身不支持严格的顺序保证,消费者可以在接收到消息后根据业务逻辑在本地进行排序。但这种方法可能会增加消费者的复杂性和性能开销。

5 消息队列如何避免重复消费(幂等)

  ① 避免消息重复消费的策略:
  消息去重标识:在消息中添加唯一标识(如UUID、时间戳和序列号等)。消费者在处理消息时,会记录已处理的消息ID。当再次收到相同的消息ID时,消费者会忽略它,从而避免重复处理。
  消息消费确认机制:消费者成功处理消息后,应及时向消息队列发送确认消息(如RabbitMQ中的ack)。这样,消息队列可以删除或标记已消费的消息,避免再次推送。
  消息过期设置:为消息设置TTL(Time To Live,生存时间),确保消息在一定时间内被消费。过期的消息将被消息队列自动删除,从而避免过期消息的重复消费。
  分布式锁:在多个消费者共享同一个队列的情况下,可以使用分布式锁来确保同一时间只有一个消费者能够处理某条消息。

  ②实现幂等性的策略:
  唯一标识符:在消息中添加唯一标识符,并在处理消息时使用该标识符来检查操作是否已经执行过。如果已经执行过,则忽略该消息;否则,执行相应的操作。
  数据库唯一键约束:在数据库中为需要保证幂等性的数据设置唯一键约束。当尝试插入重复数据时,数据库将拒绝该操作,从而确保操作的幂等性。
  状态机:使用状态机来管理消息的处理流程。在消息处理过程中,根据当前状态和目标状态来判断是否需要执行相应的操作。如果操作已经执行过,则状态机将跳过该操作,确保幂等性。
  去重表:在数据库中创建一个去重表,用于记录已经处理过的消息ID。在处理消息时,首先检查去重表中是否存在该消息的ID。如果存在,则忽略该消息;否则,执行相应的操作并将消息ID添加到去重表中。

6 如何处理消息队列的消息积压问题

  ① 增加消费者数量:
  增加消费者数量可以提高消息的消费速度,从而减少积压现象。但是,增加消费者数量也会增加系统的负载,因此需要权衡性能和资源消耗之间的关系。

  ② 调整消息队列参数:
  根据实际情况调整消息队列的参数,如增加队列容量、调整消息过期时间等,以减少积压现象。但是,过度调整参数可能会导致系统的不稳定性,因此需要谨慎操作。

  ③ 优化消费者处理逻辑:
  优化消费者端的代码逻辑和处理过程,提高消费端的处理能力。这包括使用多线程或多进程来并发处理消息,或者采用分布式处理方式,将消息分配给多个消费者进行处理。

  ④ 调整消息处理的优先级:
  根据消息的重要性和紧急程度,调整消息处理的优先级。优先处理重要的消息,确保关键业务的及时性,而对于非关键的消息可以进行降级处理或延后处理。

  ⑤ 增加队列分区:
  如果消息队列支持分区,可以将消息分散到多个队列中,避免单个队列出现积压。这样可以通过增加队列数量来提高消息的并发处理能力。

  ⑥ 设置合理的超时机制:
  在消费者端设置合理的超时机制,避免因为处理时间过长而导致消息积压。可以设置超时时间,并在超时后对消息进行重新处理或者进行补偿操作。

  ⑦ 消息队列组件重选型:
  如果当前使用的消息队列组件在性能上无法满足需求,可以考虑更换为更成熟、高性能、高吞吐量的消息队列组件,如RabbitMQ、RocketMQ、Kafka等。

  ⑧ 异步处理:
  在消息队列积压的情况下,可以采用异步处理的方式,将消息存储到数据库中,然后通过异步任务来处理。这样可以减少对消息队列的压力,从而降低积压的风险。

  ⑨ 监控和告警:
  实时监控消息队列的状态和性能指标,如队列长度、消费速度、处理时间等。当发现消息积压问题时,及时触发告警并采取相应的处理措施。

  ⑩ 资源扩容:
  如果消息积压问题是由于系统资源不足导致的,可以考虑增加硬件资源或进行扩容操作,以提高系统的处理能力。

  处理消息队列的消息积压问题需要综合考虑多个方面,包括调整消费者数量、优化消费者处理逻辑、调整消息处理优先级、增加队列分区、设置合理的超时机制、更换消息队列组件、异步处理、监控和告警以及资源扩容等。通过综合使用这些方法,可以有效解决消息队列的消息积压问题。

7 消息中间件如何做到高可用

  ① 集群部署:
  在多台服务器上部署消息中间件实例,构成一个集群。当一台机器出现故障时,其他机器可以继续提供服务,从而提高整体系统的可用性。

  ② 主从复制(Master-Slave Replication):
  设置主从节点,消息中间件会将主节点上的数据同步到从节点上。当主节点出现故障时,可以快速切换到从节点提供服务,保证系统的连续性。

  ③ 负载均衡:
  在消息中间件前面使用负载均衡设备或软件,将请求分发到多个消息中间件实例上,避免单点故障,并充分利用集群中的资源。

  ④ 容错机制:
  设计容错机制来处理节点故障、网络中断等异常情况。例如,通过消息确认机制确保消息被正确处理,利用消息持久化确保在节点故障时不会丢失消息。

  ⑤ 分布式消息队列:
  使用分布式消息队列来实现消息的存储和发送。分布式消息队列可以将消息存储在网络中,并通过网络进行发送,从而提高了系统的可扩展性和容错性。

  ⑥ RabbitMQ的高可用机制:
  对于RabbitMQ这样的消息中间件,可以采用普通集群、镜像集群或仲裁队列等机制来实现高可用。普通集群(或标准集群)会在集群各个节点间共享部分数据(如交换机、队列元信息),但不包含队列中的消息。当队列所在节点宕机时,队列中的消息会丢失。镜像集群是主从模式,交换机、队列和队列中的消息会在各个RabbitMQ的镜像节点之间同步备份。这提高了消息的可用性,但也可能存在数据丢失的风险。仲裁队列是RabbitMQ 3.8版本以后的新功能,用来替代镜像队列,同样支持主从数据同步。

  ⑦ 消息持久化:
  将消息持久化到磁盘或其他存储介质中,以确保在节点故障或系统重启时不会丢失消息。

  ⑧监控和告警:
  实时监控消息中间件的状态和性能指标,如队列长度、消息延迟、处理速度等。当检测到异常或潜在问题时,及时触发告警并采取相应的处理措施。

  ⑨ 容灾恢复:
  制定容灾恢复计划,定期备份数据和配置信息。在发生严重故障时,能够快速地恢复系统和数据。
  实现消息中间件的高可用性需要综合考虑多个方面的因素,包括集群部署、主从复制、负载均衡、容错机制、分布式消息队列、消息持久化、监控和告警以及容灾恢复等。通过合理的设计和配置,可以确保消息中间件在出现故障时仍能提供可靠的服务。

8 如何保证数据一致性(事务消息)

  数据一致性是分布式系统中一个非常重要的概念,它指的是在多个节点或组件上存储的数据副本应该保持一致。以下是一些保证数据一致性的常见方法,以及事务消息的实现方式:

一、保证数据一致性的方法:
  ①分布式事务:
  分布式事务是在多个节点上的数据操作中,提供事务的ACID特性(原子性、一致性、隔离性和持久性)的方法。它可以确保所有节点上的操作要么全部成功,要么全部失败。常见的分布式事务实现方式包括使用基于日志的方法和使用两阶段提交协议。
  ② 副本同步:
  副本同步可以通过多种方式实现,如同步复制、异步复制和半同步复制等。在这些复制过程中,保证副本的同步性即为保证数据一致性的一项重要措施。
  ③ 基于版本的控制:
  通过为每个数据操作分配唯一的时间戳或版本号,可以准确地追踪和管理数据的变化。当数据发生冲突时,基于版本的控制可以自动解决冲突,保证数据的一致性。
  ④ 负载均衡:
  在分布式系统中,负载均衡是提高系统性能和可伸缩性的重要手段。然而,负载均衡的实现需要注意数据一致性的问题,例如通过一致性哈希算法等机制来确保数据访问的正确性。

二、事务消息的实现:
  事务消息是确保在分布式系统中数据一致性的重要手段之一。以下是事务消息的一般实现步骤:
  ①发送半事务消息:
  发送方将半事务消息发送至消息中间件(如RocketMQ、RabbitMQ等)。消息中间件在接收到消息后,会将其持久化存储,并向发送方返回确认消息已经发送成功。
  ② 执行本地事务:
  发送方在发送半事务消息后,开始执行本地事务逻辑。这个事务逻辑可能涉及数据库操作或其他业务逻辑。
  ③ 提交或回滚事务:
  根据本地事务的执行结果,发送方向消息中间件提交二次确认(Commit或Rollback)。如果事务执行成功,则提交Commit;如果事务执行失败或需要回滚,则提交Rollback。
  ④ 消息中间件处理二次确认:
  消息中间件在接收到二次确认后,根据确认的类型(Commit或Rollback)对半事务消息进行相应的处理。如果收到Commit确认,则将半事务消息标记为可投递状态,并将其发送给订阅方;如果收到Rollback确认,则删除半事务消息,订阅方将不会收到该消息。
  ⑤ 消息回查:
  在特殊情况下(如网络故障、应用重启等),发送方可能无法及时提交二次确认。此时,消息中间件会定期发起消息回查,要求发送方再次确认本地事务的最终状态。发送方根据检查得到的本地事务的最终状态再次提交二次确认,消息中间件仍按照上述步骤对半事务消息进行操作。
通过以上步骤,事务消息可以确保在分布式系统中数据的一致性。当发送方执行本地事务时,它可以确保数据的正确性;当消息中间件处理二次确认时,它可以确保所有相关的操作都按照预期的顺序和结果执行。这样,即使在复杂的分布式系统中,也可以保证数据的一致性和正确性。

9 RocketMQ 的角色组成

角色作用
Nameserver无状态,动态列表;这也是和 zookeeper 的重要区别之一。zookeeper 是有状态的。
Producer消息生产者,负责发消息到 Broker。
Broker就是 MQ 本身,负责收发消息、持久化消息等。
Consumer消息消费者,负责从 Broker 上拉取消息进行消费,消费完进行 ack。

10 RocketMQ Broker 中的消息被消费后会立即删除吗

  不会,每条消息都会持久化到 CommitLog 中,每个 Consumer 连接到 Broker后会维持消费进度信息,当有消息消费后只是当前 Consumer 的消费进度(CommitLog 的 offset)更新了。
  默认 48 小时后会删除不再使用的 CommitLog 文件

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

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

相关文章

【论文笔记】| 蛋白质大模型ProLLaMA

【论文笔记】| 蛋白质大模型ProLLaMA ProLLaMA: A Protein Large Language Model for Multi-Task Protein Language Processing Peking University Theme: Domain Specific LLM Main work: 当前 ProLLM 的固有局限性:(i)缺乏自然…

【竞技宝】欧洲杯:吉鲁退出法国队,欧洲杯后主动让贤

吉鲁是法国队功勋中锋,为球队立下过赫赫战功。法国队能在2018年拿到久违的世界杯冠军,吉鲁身为主力锋霸功不可没。每当,法国队在比赛中遇到僵局,吉鲁总会站出来,为球队做出应有的贡献。吉鲁在法国队的作用不仅仅体现在…

CPU进入内核,是什么意思?

知乎上有一个问题: 进入内核态究竟是什么意思? 暂且忘记这个问题,让我们从另一个问题出发,一步步引出这个问题的答案。 特权指令问题 现代计算机里面,同时运行了很多程序,比如Office软件、浏览器、QQ、还…

好书推荐|MATLAB科技绘图与数据分析

提升你的数据洞察力,用于精确绘图和分析的高级MATLAB技术 MATLAB科技绘图与数据分析——jd 本书内容 《MATLAB科技绘图与数据分析》结合作者多年的数据分析与科研绘图经验,详细讲解MATLAB在科技图表制作与数据分析中的使用方法与技巧。全书分为3部分&a…

Jetbrains插件AI Assistant,终于用上了

ai assistant激活成功后,如图 ai assistant获取:https://web.52shizhan.cn/activity/ai-assistant 主要功能如下

springboot集成达梦数据库8

springboot集成达梦数据库8 官方文档&#xff1a;[https://eco.dameng.com/document/dm/zh-cn/start/java-development.html](https://eco.dameng.com/document/dm/zh-cn/start/java-development.html) 引入maven依赖 <!--添加数据库驱动安装包--> <dependency> …

基于Matlab卷积神经网络(CNN)人脸识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 人脸识别技术作为计算机视觉领域的一个重要分支&#xff0c;已经广泛应用于安全监控、身份验证…

提供一个c# winform的多语言框架源码,采用json格式作为语言包,使用简单易于管理加载且不卡UI,支持“语言分级”管理

提供一个c# winform的多语言框架源码&#xff0c;采用json格式作为语言包&#xff0c;不使用resx资源&#xff0c;当然本质一样的&#xff0c;你也可以改为resx 一、先看下测试界面 演示了基本的功能&#xff1a;切换语言&#xff0c;如何加载语言&#xff0c;如何分级加载语…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案

随着越来越多用户使用 DolphinDB&#xff0c;各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来&#xff0c;以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …

网络层协议——IP协议

1. 网络层 在学习TCP时&#xff0c;我们学习了TCP保证的是能将一个数据可靠的传输到另一个主机上。主要是数据的可靠传输。而网络层和数据链路层则是帮助我们如何将数据传输到另一台主机上。 我们在应用层给对方发数据时&#xff0c;数据并不是直接传输给对方的&#xff0c;而…

如何应对EI会议中的突发情况?

在参加EI会议时&#xff0c;难免会遇到一些突发情况&#xff0c;以下是几种常见的突发情况及应对策略&#xff1a; 突发情况及应对策略 1. 技术故障 投影设备故障&#xff1a;提前将演示文稿上传到会议主办方指定的平台&#xff0c;或带上多个版本&#xff08;如USB驱动器和云…

网络采集受限?如何解决指纹识别、IP封禁、验证码、账号多登等问题

网页采集是什么 网页采集&#xff0c;也常被称作网络采集、网络数据抓取&#xff0c;是一种通过自动化工具从网站上获取信息的技术。这些技术通过访问网页&#xff0c;解析页面上的内容&#xff0c;并提取出有价值的数据&#xff0c;如文本、图片、链接等。 网页采集通常用于…

大学计算机专业必看:大学编程相关的比赛或者证书,真正有用的是哪些?

前言 大学期间&#xff0c;会有各种各样的编程赛事&#xff0c;但是你知道真正对自己未来就业有帮助的比赛证书有帮助的是哪些吗&#xff1f; 有些小伙伴来面试时&#xff0c;会咔咔亮出一大堆的证&#xff0c;看起来挺唬人。 但真的有含金量吗&#xff1f;真的能为你的简历增…

A2B V2.0协议学习笔记(非正式版本)

一、说明 A2B全称是 Automotive Audio Bus 汽车音频总线,主要是解决传统音频总线线多、线重、成本贵等问题。 A2B V2.0总线相对V1.0主要变化点: 速率提升,高达98.304Mbps,全双工模式 编码方式,由之前的曼彻斯特编码变为QPSK(正交相移键控)编码,每个符合2bit数据,因此…

计算机网络之应用层知识点总结

6.1 网络应用模型 &#xff08;1&#xff09;应用层概述 &#xff08;2&#xff09;网络应用模型的介绍 客户/服务器&#xff08;C/S&#xff09;模型 P2P模型 6.2 域名解析系统DNS &#xff08;1&#xff09;DNS系统介绍 &#xff08;2&#xff09;域名 &#xff08;3&#…

Java时间工具类(Date和LocalDateTime)

Date package com.qiangesoft.utils.date;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] C…

同一个类中方法调用,导致@Transactional失效

1.背景 查了一下Spring文档&#xff0c;就是上面这段话所说的情况。 2.Spring官方文档有这么一段话 https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#transaction-declarative In proxy mode (which is the default), only external …

Docker save load 镜像 docker手动上传导入镜像

docker手动上传导入镜像 因为一些服务器网络限制&#xff0c;导致拉取某些镜像的时候非常慢&#xff0c;可以使用手动的方式导入镜像 1、将镜像归档为tar文件 如果一台服务器里已经存在某个镜像&#xff0c;可以通过docker save 命令 把镜像打成tar包 docker save 命令用于将…

【Vue】Vue2使用ElementUI

目录 Element UI介绍特点Vue2使用Element安装引入ElementUI组件库 使用ElementUI用户注册列表展示其他 mint-ui介绍特点安装组件引入组件Mint-ui相关组件 Element UI 介绍 官网(基于 Vue 2.x ):https://element.eleme.cn/#/zh-CN ElementUI 是一个基于 Vue.js 的桌面端组件库…

K8S认证|CKA题库+答案| 11. 创建PVC

11、创建PVC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node ok8s master …