Java后端开发面试题——消息中间篇

RabbitMQ-如何保证消息不丢失

交换机持久化:

@Bean
public DirectExchange simpleExchange(){// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除 return new DirectExchange("simple.direct", true, false);
}

队列持久化:

@Bean
public Queue simpleQueue(){// 使用QueueBuilder构建队列,durable就是持久化的return QueueBuilder.durable("simple.queue").build();
}

消息持久化,SpringAMQP中的的消息默认是持久的,可以通过MessageProperties中的DeliveryMode来指定的 

Message msg = MessageBuilder.withBody(message.getBytes(StandardCharsets.UTF_8)) // 消息体.setDeliveryMode(MessageDeliveryMode.PERSISTENT) // 持久化 .build();

消费者确认

manual:手动ack,需要在业务代码结束后,调用api发送ack。

auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除

在消费者出现异常时利用本地重试,设置重试次数,当次数达到了以后,如果消息依然失败,将消息投递到异常交换机,交由人工处理

RabbitMQ消息的重复消费问题如何解决的

场景:

网络抖动

消费者挂了

解决方案:

每条消息设置一个唯一的标识id

幂等方案:【 分布式锁、数据库锁(悲观锁、乐观锁) 】

RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛)

延迟队列:进入队列的消息会被延迟消费的队列

场景:超时订单、限时优惠、定时发布

延迟队列=死信交换机+TTL(生存时间)

死信消息:

        消费者使用basic.reject或 basic.nack声明消费失败,并且消息的requeue参数设置为false

        消息是一个过期消息,超时无人消费(

                消息所在的队列设置了存活时间

                消息本身设置了存活时间

        )

        要投递的队列消息堆积满了,最早的消息可能成为死信

队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机

 

 

 

 延迟队列插件(方案二)DelayExchange插件,需要安装在RabbitMQ中

DelayExchange的本质还是官方的三种交换机,只是添加了延迟功能。因此使用时只需要声明一个交换机,交换机的类型可以是任意类型,然后设定delayed属性为true即可。

 RabbitMQ如果有100万消息堆积在MQ , 如何解决(消息堆积怎么解决)

 1)增加更多消费者,提高消费速度

2)在消费者内开启线程池加快消息处理速度

3)扩大队列容积,提高堆积上限

3.x)惰性队列

接收到消息后直接存入磁盘而非内存

消费者要消费消息时才会从磁盘中读取并加载到内存

支持数百万条的消息存储

 

 RabbitMQ的高可用机制有了解过嘛

普通集群

会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息。

当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回

队列所在节点宕机,队列中的消息就会丢失

镜像集群

交换机、队列、队列中的消息会在各个mq的镜像节点之间同步备份。

创建队列的节点被称为该队列的主节点,备份到的其它节点叫做该队列的镜像节点。

一个队列的主节点可能是另一个队列的镜像节点

所有操作都是主节点完成,然后同步给镜像节点

主宕机后,镜像节点会替代成新的主

仲裁队列(集群下丢数据问题解决方案)

与镜像队列一样,都是主从模式,支持主从数据同步

@Bean
public Queue quorumQueue() {return QueueBuilder.durable("quorum.queue") // 持久化 .quorum() // 仲裁队列.build();
}

Kafka是如何保证消息不丢失

生产者发送消息到Brocker丢失

设置异步发送+消息重试

//同步发送
RecordMetadata recordMetadata = kafkaProducer.send(record).get();
//异步发送
kafkaProducer.send(record, new Callback() {@Overridepublic void onCompletion(RecordMetadata recordMetadata, Exception e) {if (e != null) {System.out.println("消息发送失败 | 记录日志");}long offset = recordMetadata.offset();int partition = recordMetadata.partition();String topic = recordMetadata.topic();}
});
//设置重试次数
prop.put(ProducerConfig.RETRIES_CONFIG,10);

消息在Brocker中存储丢失

 

消费者从Brocker接收消息丢失 

Kafka 中的分区机制指的是将每个主题划分成多个分区(Partition)

topic分区中消息只能由消费者组中的唯一一个消费者处理,不同的分区分配给不同的消费者(同一个消费者组)

禁用自动提交偏移量,改为手动

同步提交

异步提交

同步+异步组合提交

Kafka是如何保证消费的顺序性 

场景:

一个topic的数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储的偏移量,如果消费者关联了多个分区不能保证顺序性

解决:

发送消息时指定分区号

发送消息时按照相同的业务设置相同的key

Kafka的高可用机制有了解过嘛

集群模式

 

Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成

这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一

分区备份机制

一个topic有多个分区,每个分区有多个副本,其中有一个leader,其余的是follower

所有的分区副本的内容是都是相同的,如果leader发生故障时,会自动将其中一个follower提升为leader

具体机制

 

第一:选举时优先从ISR中选定,因为这个列表中follower的数据是与leader同步的

第二:如果ISR列表中的follower都不行了,就只能从其他follower中选取

Kafka数据清理机制了解过嘛

存储结构:.index  索引文件

                .log 数据文件

                 .timeindex 时间索引文件

为什么要分段?

删除无用文件方便,提高磁盘利用率

查找数据便捷

清理策略有两个

1、根据消息的保留时间,当消息在kafka中保存的时间超过了指定的时间,就会触发清理过程

 2、根据topic存储的数据大小,当topic所占的日志文件大小大于一定的阈值,则开始删除最久的消息。需手动开启

Kafka中实现高性能的设计有了解过嘛 

消息分区:不受单台服务器的限制,可以不受限的处理更多的数据

顺序读写:磁盘顺序读写,提升读写效率

页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问

零拷贝:减少上下文切换及数据拷贝

消息压缩:减少磁盘IO和网络IO

分批发送:将消息打包批量发送,减少网络开销

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

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

相关文章

[Linux]环境变量

[Linux]环境变量 文章目录 [Linux]环境变量环境变量的概念查看环境变量环境变量的加载原理环境变量的添加刷新环境变量配置文件的路径 环境变量的概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 环境变量的本质:…

css层叠关系

文章目录 cascading声明冲突应用重置样式表a元素的类选择器顺序问题 cascading cascading – 层叠 解决声明冲突的过程,浏览器会自动处理;就是计算样式的权重,权重大的就被选择; 声明冲突 是指多个选择器选中同一个标签&#x…

AMEYA360代理品牌:纳芯微芯片解决方案为光伏市场赋能

近年来,光伏市场进入了一个新的增长维度。SolarPower Europe数据显示,2022年全球光伏新增装机量达239GW,占所有可再生能源新增容量的三分之二。国家能源局也宣称,2022年我国工商业光伏新增装机达25.87GW,同比增长236.7…

C#面向对象程序设计之变量的作用域,深入浅出 入门和进阶教程3

1、效果镇楼: 最近忒忙了!真的忙到不可开交的呢,繁杂业务的处理真的不是您,我个人想象的样子,完全比您个人想象的要复杂至少三倍以上的难度!也是客观事实。 菜鸟程序员面临的客观残酷现实!尤其您这个年龄阶段,实在是堪忧,尴尬的很啊,非常严峻的形势,也可以说特别严峻…

Element table根据字段合并表格(可多字段合并),附带拖拽列动态合并

效果如图,姓名 数值1 字段进行自动合并 封装合并列js - tableMerge.js // 获取列合并的行数 // params // tableData: 表格数据 // mergeId: 合并的列的字段名 export const tagRowSpan (tableData, mergeId) >{const tagArr [];let pos 0;tableData.map((i…

vue组件的scope 以及 如何样式穿透

个人复习!!! 有什么用 让当前组件的样式不会修改到其它地方的样式,使用了data-v-hash的方式来使css有了它对应模块的标识 实现原理 1、给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素…

linux启动jar 缺失lib

linux启动jar包时,找不到报错 [rootebs-141185 xl-admin]# java -Djava.library.path/home/kabangke/xl-admin/lib -jar /home/kabangke/xl-admin/xl-admin.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/web/se…

诺依框架ruoyi.js添加默认当年日期范围

ruoyi.js添加方法 // 默认当年日期范围如:2023-01-01到2023-08-22(至今) export function defaultYearDate(data) {// this.dateDefaultShow new Date();// this.dateDefaultShow.setMonth(new Date().getMonth() - 1);const end new Date…

ubuntu 对多CPU统一设置高性能模式

文章目录 一、问题描述二、软件安装与设置三、查看各CPU状态四、开机默认高性能4.1 安装cpufrequtils4.2 编写脚本4.3 设为默认开机脚本 参考链接 一、问题描述 之前在网上找到的CPU设置高性能模式,只能设置CPU0单个CPU,下述是对多核CPU统一设置工作模式…

Linux 设置mysql开机自启动和安装JDK

0目录 1.mysql设置开机自启动 2.linux安装jdk 1.mysql设置开机自启动 去到cd /etc/rc.d/init.d目录 创建一个sh脚本 编辑脚本 设置开机自启动 重启 检查是否自启动 2.linux安装jdk 下载安装包 放在opt目录下 新建soft文件夹(opt目录下)…

【VS_C++基础知识】

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VS_C的基础知识,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步! 你的点赞就…

leetcode做题笔记94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 思路一:模拟题意 void inorder(struct TreeNode*root,int* ans,int *resSize) {if(!root){return ;}inorder(root->left,ans,resSize);ans[(*resSize)] root->val;inorder(root->right…

“深入解析JVM内部原理:探索Java虚拟机的工作机制“

标题:深入解析JVM内部原理:探索Java虚拟机的工作机制 摘要: Java虚拟机(JVM)是Java语言的核心组成部分,它负责将Java源代码编译为可执行的字节码,并提供运行时环境。本文将深入探索JVM的工作机…

一套基于C#语言开发的LIMS实验室信息管理系统源码

实验室信息管理系统(LIMS)是指帮助实验室组织和管理实验数据的计算机软件系统,它将实验室操作有机地组织在一起,以满足实验室工作流程的所有要求。它能以不同的方式支持实验室的工作,从简单的过程(如样品采集和入库)到复杂的流程(…

stm32的位带操作

在51单片机中,我们可以使用P2^1来对单片机的某一位进行操作,到了stm32,我们通过位带操作,将寄存器的每一位映射到一个32位的地址。如下是我查资料摘录的一些图片。 映射方式 SRAM: AliasAddr 0x22000000 (A-0X20000000)*8*4n*4…

vue 简单实验 v-if 条件判定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"conditional-rendering"><span v-if"seen">现在你看到我了</span> </div> <script> const C…

rust库学习-env_logger(actix-web添加彩色日志、rust添加彩色日志 )

文章目录 介绍actix-web启用彩色日志crate地址&json格式日志 我们在进行rust的web开发时&#xff0c;如果不指定日志&#xff0c;就不会有输出&#xff0c;非常不友好 这里我们使用env_logger进行日志打印 介绍 env_logger 需要配合 log 库使用, env_logger 是 Rust 社区…

LeetCode面试经典150题(day 2)

26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

matlab 点云精配准(2)——point to plane ICP(点到面的ICP)

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果四、参考链接五、测试数据本文由CSDN点云侠原创,matlab 点云精配准(2)——point to plane ICP(点到面的ICP)。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一…

Linux:shell脚本:基础使用(5)《正则表达式-sed工具》

sed是一种流编辑器&#xff0c;它是文本处理中非常中的工具&#xff0c;能够完美的配合正则表达式使用&#xff0c;功能不同凡响。 处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用s…