java面试(消息队列MQ)

MQ有什么用?有哪些场景?

MQ(MessageQueue)消息队列。队列(FIFO)先进先出的数据结构,消息由生产者发送到MQ,后由消费者对消息进行处理。QQ,微信就是MQ场景。
MQ作用:

  1. 异步。快递员 -> 菜鸟驿站 <-客户。作用:提高响应速度和吞吐量。
  2. 解耦。java -> MQ ->Python。作用:服务间解耦,减少服务间影响,提高系统的稳定性和可扩展性。可一对多处理消息
  3. 削峰填谷。瞬间流量 -> MQ -> 闲时处理。作用:以稳定系统对突发的流量冲击。
    MQ缺点:
  • 系统可用性降低,MQ宕机整个业务产生影响。
  • .系统的复杂度提高,引入MQ后,数据链路变得复杂。要保证消息不丢失,不重复调用,消息顺序性。
  • 数据一致性,A系统发消息,需要B,C统一处理,B成功,C失败会造成数据一致性问题。

如何进行产品选型?

Kafka:吞吐量非常大,性能好,集群高可用。缺点:会丢失据,功能单一。场景:数据量大,丢失不影响。如日记,大数据采集
RabbitMQ:可靠性高,功能全面。缺点:吞吐量较低,消息积累影响性能。erlang语言不好优化。场景:小规模
RocketMQ:高吞吐,高性能,高可用,功能全面。缺点:开源版不如商业版。生态不成熟,只支持java。场景:几乎全场景。

如何保证消息不丢失?

  1. 那个环节会造成消息丢失
    跨网络时会造成消息丢失
    消息丢失
    1.1 生产者发消息
    1.2 主从同步
    1.3 硬盘同步消息
    1.4 消费者接收消息
  2. 怎么防止消息丢失
    2.1 生产者消息不丢失
    kafka中消息发送+回调。
    RocketMQ:消息发送+回调+事务。
    生产者事务消息机制
    RabbitMQ:消息发送+回调+手动事务(channel.txSelect()开启事务,channel.txCommit()提交事务,channel.txRollback()回滚事务)channel会阻塞,造成吞吐量下降。3.0升级为Publisher Confirm,整个处理流程通RocketMQ的事务消息。
    2.2 MQ主从同步不丢失
    RocketMQ:
    普通集群:同步同步(MQ主表同步分表后分表返回确认消息,会丢消息),异步同步(主表获取到数据直接发返回确认消息,不会丢消息)。
    Dledger集群-两阶段提交:先在候选节点中选出master,设置为uncommited,等多数slave节点同步到消息设置master状态为commited状态
    RabbitMQ:
    普通集群:消息分散存储,节点不会主动进行消息同步,会丢失消息。
    镜像集群:镜像集群会在节点之间主动同步数据。
    Kafka:
    允许消息少量丢失,acks:0,1,all 同上面的同步同步,同步异步。
    2.3 MQ消息存盘不丢失
    RocketMQ:同步刷盘和异步刷盘(会丢失)。
    RabbitMQ:将队列配置成持久化队列。3.x版本新增Quorum队列会采用raft协议进行消息同步。
    2.4 MQ消费者消费消息不丢失
    RocketMQ:使用默认的同步方式消费,不采用异步先返回offset方式消费。
    RabbitMQ:autoCommit - 手动提交offset
    Kafka:手动提交offset

如何保证消息消费的幂等性

就是防止消费者重复消费。所有MQ并没有提供主动解决幂等性的机制,需要由消费者自行控制。
RocketMQ:给每个消息分配了MessageId,作为消费者判断幂等性的依据。最好使用带有业务标识的id替换。

如何保证消息的顺序

全局有序和局部有序:MQ只需要保证局部有序(微信聊天),不需要保证全局有序(整个微信)。
消息有序
生产者把一组有序的消息放在同一个队列中,而消费者一次消费整个队列中的消息。
RocketMQ中有完整设计,RabbitMQ和Kafka没有,需自己实现。
RabbitMQ:要保证目标exchange只对应一个队列,并且一个队列只对应一个消费者。
Kafka:生产者通过定制partition分配规则,将消息分配到同一个partition。Topic下只对应一个消费者。

如何保证消息的高效读写

Kafka和RocketMQ都是通过零拷贝实现。传统文件复制从(硬件-内核空间-用户空间-内核空间-硬件)需要四次拷贝。
零拷贝
mmap和transfer
Java对零拷贝进行了封装,mmap方式通过MappedByteBuffer对象进行操作,而transfer通过FileChannel进行操作。
mmap适合较小的文件,通常文件不超过1.5G~2G之间。Transfer没有文件大小限制。
RocketMQ:使用mmap方式对他的文件进行读写。commotLog,1G。
Kafka:他的index日志文件通过mmap方式读写,其他日志文件中,并没有使用零拷贝方式。使用transfile方式将硬盘数据加载到网卡。

如何使用MQ保证分布式事务的最终一致性。

分布式事务:业务相关的多个操作,保证他们同时成功或失败。
强一致性:任何时候多个操作都是对齐的。
最终一致性:多个操作最终结果时对齐的。
MQ中要保护事务的最终一致性,需要:

  1. 生产者要保证100%消息投递。 - 事务消息机制
  2. 消费者要保证幂等消费。 - 唯一id+业务自己实现
    分布式MQ的三种语义:
    at least once:消费者至少消费一次
    at most once:生产者最多发送一次
    exactly once:正确处理一次。Rocket并不能保证exactly once,商业版支持。kafka最新版提供了demo。RabbitMQ不支持。

如何设计一个MQ

  1. 实现单机的blockQueue队列数据结构。队列可伸缩扩展。
  2. 将单机队列扩展为分布式队列,将队列分布在不同的节点。就涉及到集群管理,kafka用zookeeper。
  3. 基于Topic定制消息路由选择策略。默认轮询发送到不同队列中,RocketMQ使用MessageSelector顺序发送至同一个队列。为保证消息消费偏移量(消费进度)则需要和消费者之间形成多对一的关系。一个队列由一个消费者消费可保证消息先进先出是有保障的(同机房同网络优先)。
  4. 消费消息时如果一个消费者对应多个队列,则并发多线程的获取消息,如果为保证顺序,则先把队列锁住依次消费。
  5. 消费者路由策略
  6. 实现高效的网络通信。 -Netty Http
  7. 规划日志文件,实现文件高效读写。 -零拷贝,顺序写。服务重启后快速还原现场。
  8. 定制高级功能。 死信队列,延迟队列,事务消息。

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

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

相关文章

搜索准确性提升 20%,Jina Reranker 成为 RAG 优化的新标杆!

在整合大型语言模型&#xff08;LLM&#xff09;到业务流程时&#xff0c;企业经常会遇到一些头疼的问题&#xff0c;比如怎样保持数据时效性、避免幻觉现象&#xff0c;以及如何保护数据安全等等。为了解决这些问题&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术应…

盘点国内大厂的10个AI创作工具,看看你都用过哪些?

国内大厂的 AI 创作工具&#xff0c;目前已经非常多了&#xff0c;而且有很多都是大家耳熟能详的。 下面整理了一些&#xff0c;包含 AI 绘画、AI 视频、AI 智能体、AI 大模型等多个方向的国内大厂 AI 创作工具。 发现有几款 AI 工具&#xff0c;还真的非常好用。看看这些 AI…

深入浅出Redis(三):Redis数据的存储、删除以及淘汰

引言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 本篇文章不像以往文章围绕Redis某个特点来讲解&#xff0c;而是作为过渡介绍&#xff0c;来说一说Redi…

基于springboot的大型商场应急预案管理系统论文

大型商场应急预案管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个计算机管理大型商场应急…

软件测试开发环境、测试环境、准生产环境、生成环境

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0…

如何器测试IP池的质量?代理IP是怎么在问卷调查中应用的呢?

在数字时代&#xff0c;数据收集和分析变得日益重要&#xff0c;而问卷调查作为一种常见的数据收集工具&#xff0c;其效率和准确性直接影响着研究的可信度和有效性。为了实现这一目标&#xff0c;代理IP在问卷调查中的应用变得愈发关键。本文旨在探讨如何测试IP池的质量&#…

真机测试——关于荣耀Magic UI系列HBuilder真机调试检测不到解决办法

​​​​​出现这种状况怎么办 1、开启USB调试 2、重点来了——我们要选择USB配置&#xff0c;选择音频来源 3、连接OK

vue3基础教程(2)——创建vue3+vite项目

博主个人微信小程序已经上线&#xff1a;【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 前言2.node版本检测3.创建vue项目 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。 零基础读者也能成功由本系列文章入门&#x…

javascript数组排序的方法

目录 基本用法 按照数字大小排序 按照降序排序 按照字符串长度排序 按照对象属性排序 在JavaScript中&#xff0c;数组排序通常使用Array.prototype.sort()方法。这个方法会按照指定的顺序对数组的元素进行排序&#xff0c;并返回排序后的数组。如果未指定比较函数&#x…

Springboot配置MySQL数据库

Springboot配置MySQL数据库 一、创建springboot项目&#xff0c;并添加如下依赖 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency>二、在applica…

基于springboot+vue的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

实现session共享的方法总结完整版

文章目录 实现session共享的方法总结完整版1、使用共享数据库&#xff1a;2、使用粘性会话&#xff08;Sticky Session&#xff09;&#xff1a;3、使用缓存系统&#xff1a;4、使用分布式文件系统&#xff1a;5、使用中央认证服务&#xff1a;6、使用会话复制&#xff1a;7、使…

100%开源大模型OLMo:代码/权重/数据集/训练全过程公开,重定义AI共享

前言 近日&#xff0c;艾伦人工智能研究所联合多个顶尖学术机构发布了史上首个100%开源的大模型“OLMo”&#xff0c;这一举措被认为是AI开源社区的一大里程碑。OLMo不仅公开了模型权重&#xff0c;还包括了完整的训练代码、数据集和训练过程&#xff0c;为后续的开源工作设立…

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H&#xff0c;这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽&#xff0c;并拥有36GB的存储容量&#xff0c;相较于之前的8层堆叠HBM3 8H&#xff0c;在带宽和…

ECMAScript6

课程链接 目录 相关介绍什么是ECMA什么是ECMAScript为什么学习ES6 letconst变量解构赋值模板字符串对象简化写法箭头函数函数参数的默认值rest参数扩展运算符Symbol迭代器生成器函数与调用Promise介绍与基本用法Promise封装读取文件Promise.prototype...then方法Promise.catch…

CCDP.01.寄主机SSH连接虚拟机的QA

V0.0 初始版本-2024.2.29 检查VM的网卡配置 如上图&#xff0c;如果enp0s3网卡没有出现形如10.0.0.??/24的ip配置&#xff0c;说明该网卡配置存在错误&#xff0c;或者没有“使能”该网卡。在RockyLinux8.X中可检查“ifcfg-enp0s&#xff1f;” vi /etc/sysconfig/network-…

【JS】WebSocket实现简易聊天室

【JS】WebSocket实现简易聊天室 聊天室思路示例 聊天室思路 聊天室思路 1、连接服务器先建立连接&#xff0c;默认生成匿名用户(admin01) 2、客户端发送消息&#xff0c;其它客户端用户都会同步接收消息(服务端接受消息广播所有连接用户) 3、客户端修改昵称&#xff0c;其它客…

数据结构之七大排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…

java014 - Java继承

1、继承 1.1 继承概述 继承是面向对象的三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法。 1.2 继承格式 public class 子类类名 extends 父类类名 {} 范例&#xff1a;public class son extends …