面试题一 消息中间件及缓存

Redis面试题(2022版) 序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124043363 3 Java异常面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124.... 阅读详情

一、系统里为什么要用消息队列

答题思路:

1、你们公司项目里有个什么场景?

2、这个场景有什么技术挑战,如果不用MQ会很麻烦,用了MQ会带来很多好处

参考:

1、比较核心的使用场景有3个

1)解耦:A要发送数据给B,过几天又要发送数据给C,过几天又要发送数据给D,这会导致A频繁改动代码。并且现在往B、C、D发送,如果B挂了,其他没挂,那我发的数据需要缓存重试吗?

2)异步:A调用B、B调用C、C调用D,如果全用接口,只有有一个地方调用慢,整个请求都会变慢,客户使用就会觉的很卡

3)削峰:0到12点每秒并发只有100个,12点后每秒并发达到10000个,并发暴增导致接口调用延迟,客户使用就会觉的很卡

当然还有一些其他场景,比如实现分布式事务最终一致性,但主要是上面3个场景

二、消息队列有什么缺点

1、缺点

1)系统变复杂,可用性降低。比如MQ挂了导致系统崩溃

2)系统要考虑的东西变多,进而导致系统复杂性变高。比如怎么防止消息丢失?怎么防止消息重复消费?怎么防止消息被顺序消费? 

3)会有一致性问题。比如A给B、C、D都发消息,B和C成功了,D失败了,此时该怎么办?

三、四种MQ的区别,各自适应什么场景

四、如何保证消息中间件的高可用

1、RabbitMQ的高可用(RabbitMQ不是分布式的)

1)单机模式

2)普通集群模式

由于RabbitMQ不是分布式的,只能集群部署,所以实际上数据只能存在一台机器上。比如有3个RabbitMQ节点,数据存在节点A上,当消费者连接节点B、C消费时,这2个节点会从A拉取消息给消费者。

缺点:

  • 会在RabbitMQ集群内部产生大量的数据传输
  • 几乎没有可用性保证,如果节点A宕机,那么整个集群就挂了

3)镜像集群模式

与普通集群模式不同,镜像集群模式会把数据同步到每一个节点。可以在RabbitMQ的管理控制台中设置策略是镜像集群模式

缺点:

  • 没有扩展性,当数据量很大时,加机器也没用,因为它会同步所有数据,占据了很大的硬盘空间

2、Kafka的高可用(Kafka是分布式的)

一个Topic分为多个partition,每个partiion存在不同的broker上,每个partition就放一部分数据。主从备份、leader选举,防止节点宕机导致数据缺失

3、RocketMQ的高可用

一个Topic分为多个MessageQueue,这些MessageQueue分布在不同的Broker上,每个MessageQueue对应一份ConsumeQueue文件(路径名:store/consumequeue/{TopicName}/{QueueId})。一个Broker上可以有多个Topic,但数据都存储在同一个CommitLog文件中。ConsumeQueue文件不存储具体的数据,只存储数据的tag和在CommitLog文件中的offset

五、如何保证不重复消费数据

消费者端通过业务来保证不重复消费数据。比如每次消费时,先查数据库看有没有这条记录了,没有再insert,有的话就不消费

六、如何保证消息不丢失

数据丢失可能的原因:

  • 生产者发送数据时,数据丢失
  • 生产者发送消息到了中间件,中间件暂存在内存中,但此时却宕机了,导致内存中的消息没了
  • 消费者消费了消息,但还没处理就挂掉了,中间件以为消费者消费完了

解决方案:

  • 使用消息中间件提供的事务消息功能,保证生产者发送消息不丢失
  • 让中间件收到消息后回调生产者,告诉生产者接收成功还是失败,保证生产者发送消息不丢失
  • RabbitMQ开启持久化,保证写入到中间件的数据不会丢失
  • RocketMQ开启同步刷盘,保证写入到中间件的数据不会丢失
  • Kafka设置4个参数:在topic设置replication.factor > 1,保证至少2个副本;在kafka服务端设置min.insync.replicas > 1,要求一个leader至少有一个follower还存活;在生产者端设置acks = all,要求每条数据必须写入所有副本才算成功;在生产者端设置retries = MAX,如果写入失败,就不断重试,卡在这里了
  • 消费者端消费成功后,才返回ack给中间件,保证消费者不会丢失数据

七、如何保证消息是顺序的

生产者只写入一个Queue/Partition,消费端只让一台机器来消费,消费时使用单线程或内存队列来消费

八、发生生产事故,导致挤压了几百万的消息未消费该怎么办

  • 如果消息不重要,可以丢失,那么修改消费者代码,将积压的消息都不做任何处理直接消费掉。然后再改回来,正常处理实时消息
  • 如果MessageQueue数量明显大于消费者机器数,那么就临时增加机器给消费者,提高消费速度,尽快将积压的消息处理完,但要注意数据库等能否抗住
  • 如果MessageQueue数量跟消费者机器数差不多,那么增加机器给消费者也没有用。可以修改消费者代码,将积压的消息写入新的Topic,Topic的MessageQueue多弄些,再增加机器给消费者消费这个新的Topic。最后再改回来

九、如果让你自己设计一个消息中间件,你会怎么做

支持扩容,数据要落入磁盘,落入磁盘要顺序写(效率高),Raft协议实现高可用,数据零丢失

十、缓存+数据库不一致解决方案

初步方案:先删除缓存,再更新数据库。但这样在高并发下会有问题,比如线程A删除了缓存,正准备更新数据库,此时线程B需要查询数据,发现缓存里没有,就去数据库里查询并放入缓存。这样依旧会导致缓存与数据库不一致。 

进阶方案:将请求放入队列中,串行执行。比如一个更新请求,一个查询请求,都进入了队列中。更新请求先删缓存,再更新数据库,查询请求查数据库,再更新缓存。这样就能做到缓存与数据库一致。但效率不高,所以为了提高效率,不能所有的查询请求都入队列。最好是如果有更新请求进来了,就入队列,然后只放一个查询请求进队列,其他的查询请求等待,等到队列中的更新和查询请求执行完了,再把其他的查询请求放行。如果更新的并发操作比较多,都放在一个串行队列中,那么最后一个更新操作就会花费较多的时间等待前面的完成,所以可以串行队列也弄几个,更新同一个表的进同一个队列,提高一下效率。

UE5热更新(通过Pak包加载关卡资源,并添加到流关卡) 请先阅读我上一篇文章)** 阅读详情

相关推荐

[STM32]HAL STM32F103 软件I2C读写MPU6050(附DMP库移植)

本文介绍了如何在STM32F103C8T6上通过I2C协议与MPU6050传感器通信并实现DMP功能。首先,使用STM32CubeMX配置项目,设置时钟和I2C接口。然后,编写软件I2C协议的读写函数与MPU6050交互。接着,移植DMP库并进行必要修改,获取加速度计和陀螺仪数据,并将其转换为欧拉角显示在OLED上。最后,利用Keil的逻辑分析仪监测I2C时序。

m0_56841583的博客 2324

项目中常用中间件有哪些?分别起什么作用?

在项目开发中,常用的中间件包括消息中间件、缓存中间件、数据库中间件等,以下是一些常见的中间件及其作用:

weixin_43178040的博客 1576

若依(RuoYi)项目里,Quartz定时任务踩坑实录:并发控制、事务回滚与异常处理

本文深入解析若依(RuoYi)项目中Quartz定时任务的并发控制、事务回滚与异常处理三大核心问题。通过实战案例揭示@DisallowConcurrentExecution注解的局限性和Redis分布式锁的应用,详细讲解Spring事务集成方案及多数据源事务管理,并提供生产级监控体系搭建指南,帮助开发者规避Quartz在生产环境中的常见陷阱。

weixin_28731223的博客 412

上云04 | 消息、缓存中间件

Kafka是作为新一代的消息系统,redis也可以发布订阅了,那么有何异同?kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可以做运营数据的分析统计,而redis的主要场景是内存数据库,作为消息队列来说可靠性太差,而且速度太依赖网络IO,在服务器本机上的速度较快,且容易出现数据堆积的问题,在比较轻量的场合下能够适用。

“逛丢一只鞋”的博客 1125

VS Code + Codex 在 WSL 中使用的正确姿势

Codex 登录只能在本地完成。文件仍可通过 UNC 路径访问 WSL → 本地 Codex 就能照常工作。避免在 WSL 内重复安装/登录 Codex 扩展。

yangguangwuyue的博客 9840

保姆级教程:用Ansys Workbench找出BGA焊点最容易坏的位置(附热循环+振动分析)

本文提供了一份详细的Ansys Workbench教程,指导如何通过热循环和振动分析找出BGA焊点最容易失效的位置。从模型搭建、材料定义到网格划分和载荷设置,全面解析了BGA焊点可靠性分析的全流程,帮助工程师提前预防焊点开裂问题,提升电子封装设计的可靠性。

weixin_30983965的博客 420

中间件的4种分类(整理)

中间件的4种分类(整理)

大连赵哥的博客 2万+

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

消息中间件(RocketMQ、RabbitMQ、ActiveMQ、Redis、kafka、ZeroMQ)以及之间的区别

面向消息的系统(消息中间件)是在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能;成为异步RPC的主要手段之一。......

m0_52165864的博客 1万+

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1934

【ArcGIS Pro微课1000例】0065:制作千层饼多图层叠加效果

右键dem图层,点击符号系统,在右侧的符号系统窗口中,选择拉伸,勾选【显示名称】和【显示全部】,选择高程色带7。由于数据具有高程源,因此可以将数据进行三维显示。右键地面→添加高程源图层。打开ArcGIS PRo,新建一个局部场景,命名为千层饼。设置了高程源数据之后,千层饼一下子就变成了三维形状。数据默认都是在一个平面上,以默认的符号系统显示。到此为止,每个图层均为平面的千层饼已经做好了。将TIN图层的高程偏移设置为-1000。最后将等高线的高程设为2000.移除工程默认加载的图层。默认即可,不需要做修改。

智慧空间实验室 1156

【常用的中间件】

中间件在现代软件架构中扮演着重要的角色,它们提供了多种功能,如消息队列、负载均衡、缓存、身份验证、分布式协调和服务发现等。根据具体需求选择合适的中间件,可以显著提高系统的性能、可扩展性和可靠性。

weixin_42333261的博客 1848

详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2)

DaVinci Configurator导入ARXML配置。

不脱发的程序猿 3331

RabbitMQ——消息中间件

一、什么是中间件? 中间件(Middleware)是处于操作系统和应用程序之间的软件。中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。 中间件有很多产品,比如之前学习过的缓存中间件redis,全文搜索引擎中间件ElasticSearch,消息中间件RabbitMQ、ActiveMQ、Kafka,还有数据库中间件MyCat、Sharding-JDBC等。这些统称为中间件。 二、为什么需要(消息)中间件呢? 像redis、es这些就不说了,都是为了提高搜索速度等,这里重

hl404的博客 1841

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java面试题消息中间件_【面试题】-java分布式及微服务面试题汇总

目录1.CAP理论2.BASE理论3.接口的幂等性问题4.消息中间件如何解决消息丢失问题5.什么是分布式事务?分布式事务的类型有哪些?6.分布式事务的解决方案有哪些?7.Dubbo的服务请求失败怎么处理10.Soa和微服务架构有哪些区别?11.dubbo服务提供者,服务消费者需要配置哪些信息?12.Dubbo有哪些负载均衡策略13.Redis的持久化方式有哪些?各有何利弊?14.aof文件过大怎么...

weixin_42446705的博客 544

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

消息中间件RabbitMQ——学习笔记

MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议 的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中 间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。类比HTTP。

Java技术一点通 439

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

黑马面试消息中间件MQ篇笔记整理, 结尾附上RabbitMQ和Kafka高频面试题

消息中间件高频面试题

m0_68998179的博客 2030

Java面试之消息中间件常见面试题

消息中间件(Message-Oriented Middleware,简称MOM)是一种异步通信机制,用于解决分布式系统中应用程序之间通信的问题。它基于消息的发布/订阅机制或点对点机制,实现了高效、可靠、可伸缩的消息传递。消息队列是一种用于在发送方和接收方之间传递消息的机制。消息被发送到队列中,并按照先进先出(FIFO)的顺序进行处理。常见的消息队列产品包括RabbitMQ、ActiveMQ、Kafka等。

DKPT的博客 1029

Java消息中间件相关面试题

1、topic和queue的区别 2、如何保证消息的可达性和唯一消费 3、为什么要使用消息中间件? 一般说法: 解耦与复用 异步 削峰 参考

weixin_36142042的博客 698

【面试题】-java分布式及微服务面试题汇总

目录 1.CAP理论 2.BASE理论 3.接口的幂等性问题 4.消息中间件如何解决消息丢失问题 5.什么是分布式事务?分布式事务的类型有哪些? 6.分布式事务的解决方案有哪些? 7.Dubbo的服务请求失败怎么处理 10.Soa和微服务架构有哪些区别? 11.dubbo服务提供者,服务消费者需要配置哪些信息? 12.Dubbo有哪些负载均衡策略 13.Redis的持久化方式...

老汉健身的博客 3万+

消息中间件执行原理

消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。消息中间件也可以称消息队列(Message Queue / MQ),用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。简而言之,互联网场景中经常使用消息中间件进行消息路由、订阅发布、异步处理等操作,来缓解系统的压力。

a410974689的博客 594

redis面试题

Redis 是什么 面试官:你先来说下 Redis 是什么吧! 我:(这不就是总结下 Redis 的定义和特点嘛)Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。 它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。 我顿了一下,接着说,Red...

gongpulin的博客 6337

高性能架构面试题总结

分布式架构(一) 大型互联网架构演进过程,架构师应具备的分布式知识,主流分布式架构设计详解 分布式系统 分布式系统是一个由硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。其拥有如下特点 (1)分布性 (2)对等性 (3)并发性 (4) 缺乏全局时钟 (5)故障总是会发生 分布式协调和分流(二) Zookeeper分布式环境指挥官,Nginx高并发分流进阶实战 应用场景 Zookeeper的功能很强大,应用场景很多,结合我实际工作中使用Dubbo框

java3456的博客 354

【成神之路】MQ消息中间件相关面试题

为什么是消息队列?消息队列使用的场景介绍和作用; 解耦,异步操作业务-提高性能吞吐量,削峰限流 面临的问题: 系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了咋整?MQ挂了,整套系统崩溃了,你不就完了么。 系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎...

Franco的博客 4231

高级java每日一道面试题-2024年10月14日-消息中间件篇-如何确保消息中间件的消息不丢失?

* 在消费者处理消息时,如果发生异常或失败,可以配置重试机制来重新发送消息给消费者进行处理。 * 重试机制可以设置重试次数和重试间隔等参数,以确保在多次尝试后仍然无法处理消息时,能够采取相应的措施(如将消息投递到异常交换机、记录日志等)。 * **自动重试**:配置消费者端的自动重试机制,当消息处理失败时,可以自动重试一定次数。 * **自定义重试逻辑**:根据业务需求实现自定义的重试逻辑。

qq_43071699的博客 1070

Java面试-消息中间件

weixin_63950083的博客 1241
上一篇: 《从零开始带你成为消息中间件实战高手》 笔记六
下一篇: 《从零开始带你成为消息中间件实战高手》 笔记一
colspanprince
博客等级 码龄12年 13粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值