消息队列笔试试题与详细答案_第1页
消息队列笔试试题与详细答案_第2页
消息队列笔试试题与详细答案_第3页
消息队列笔试试题与详细答案_第4页
消息队列笔试试题与详细答案_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

消息队列笔试试题与详细答案考试时间:______分钟总分:______分姓名:______一、单项选择题1.在分布式系统中引入消息队列的主要目的是为了解决系统间的()问题。A.同步调用导致的高耦合B.数据库读写分离C.前端页面静态化D.服务器硬件扩容2.关于RabbitMQ和Kafka的特点对比,以下描述正确的是()。A.Kafka基于TCP协议,吞吐量远高于RabbitMQB.RabbitMQ基于内存存储,性能远高于KafkaC.RabbitMQ支持消息的顺序消费,Kafka不支持D.Kafka主要用于业务解耦和异步处理,RabbitMQ主要用于大数据日志收集3.在RocketMQ中,消费者拉取消息的方式是()。A.推模式B.拉模式C.推拉结合模式D.轮询模式4.以下哪个场景最适合使用消息队列进行削峰填谷?()A.用户登录认证流程B.订单超时自动取消C.秒杀活动的高并发流量控制D.系统内部模块间的参数传递5.消息队列中,为了保证消息的可靠性传输,生产者需要做以下哪项配置?()A.开启消息持久化B.开启事务机制或Confirm模式C.设置消息过期时间D.开启死信队列6.在RabbitMQ中,能够实现一对多广播消息的交换机类型是()。A.DirectExchangeB.TopicExchangeC.FanoutExchangeD.HeadersExchange7.Kafka中,为了提高读取效率,采用了()机制。A.顺序写入磁盘B.随机写入内存C.只读缓存D.压缩存储8.如果消费者在处理消息时发生异常导致消息丢失,通常可以通过以下哪种机制进行恢复?()A.消息回执B.消息确认C.消息重试D.消息过滤9.RocketMQ的事务消息解决的核心问题是()。A.消息丢失B.消息重复C.本地事务与消息发送的一致性D.消息顺序性10.在使用消息队列时,如果消费者消费速度远慢于生产者发送速度,会导致()。A.消息积压B.消息丢失C.消息重复D.消息乱序二、多项选择题1.消息队列的主要优势包括()。A.解耦B.异步C.削峰填谷D.数据同步2.使用消息队列可能带来的负面影响包括()。A.系统可用性降低B.系统复杂度增加C.一致性降低D.系统性能降低3.关于Kafka的分区,以下说法正确的有()。A.分区是Kafka并行处理消息的基础B.同一个分区内消息有序C.一个Topic可以有多个分区D.分区数量一旦创建就不能修改4.以下哪些措施可以保证消息不被重复消费?()A.数据库唯一索引B.Redis去重表C.设置消息幂等性D.关闭自动确认机制5.RabbitMQ中,消息的确认机制包括()。A.消息确认B.消息拒绝C.消息退回D.消息过滤6.在RocketMQ中,以下哪些参数可以用于控制消费者的消费速度?()A.consumeThreadMinB.consumeThreadMaxC.pullBatchSizeD.pullInterval7.死信队列(DLX)的主要作用是()。A.存放无法被正常消费的消息B.提高系统的吞吐量C.隔离异常消息,便于后续处理D.消费者的替代品8.关于消息的持久化,以下说法正确的有()。A.RabbitMQ开启持久化可以防止服务重启后消息丢失B.Kafka开启持久化可以将消息写入磁盘C.持久化会显著降低消息队列的吞吐量D.持久化可以保证消息的绝对不丢失9.消息队列中,保证消息顺序性的方案通常有()。A.单个消费者单线程消费B.将同一业务的数据发送到同一个PartitionC.使用Redis进行排序D.使用Redis进行分区10.在高并发场景下,如果消息队列发生宕机,可以通过以下哪些方式保证可用性?()A.集群部署B.主从切换C.消息备份D.停止服务进行维护三、简答题1.请简述消息队列在分布式系统中的三大核心作用,并分别给出一个具体的应用场景。2.在RabbitMQ中,如何保证消息从生产者到消费者的可靠性传输?请分生产者、Broker、消费者三个环节进行说明。3.什么是消息积压?当消息队列发生积压时,如何快速处理?4.简述RocketMQ事务消息的大致执行流程。5.如何设计一个幂等性的消费接口,以防止网络波动导致的消息重复消费?四、综合应用题1.某电商系统在“双11”大促期间,订单服务每秒处理订单的请求量达到10万,而数据库写入能力仅能支撑1万。请设计一个基于消息队列的解决方案,解决数据库瓶颈问题,并说明如何保证订单状态与库存服务的最终一致性。2.某公司使用RabbitMQ进行服务解耦,但在实际运行中发现,偶尔会出现消息丢失的情况。请分析可能丢失消息的三个环节,并针对每个环节提出具体的排查和解决策略。3.现有一个基于Kafka的日志收集系统,数据量巨大。为了提高查询效率,需要在消费端对数据进行实时计算。请设计一个架构方案,要求既能保证数据的高吞吐量摄入,又能保证实时计算的准确性。试卷答案一、单项选择题1.答案:A解析思路:消息队列的核心作用是解耦、异步和削峰填谷。同步调用是直接调用,存在高耦合和阻塞问题。引入MQ可以将同步调用改为异步调用,从而实现解耦和异步处理。选项A符合题意。2.答案:D解析思路:Kafka的主要优势在于极高的吞吐量和低延迟,非常适合大数据日志收集和流处理,不适合对可靠性要求极高的业务解耦。RabbitMQ基于AMQP协议,更注重消息的可靠性、路由机制和消息确认,适合业务场景。因此选项D描述正确。3.答案:B解析思路:RocketMQ采用拉模式。消费者主动发起请求从Broker拉取消息。相比之下,RabbitMQ通常采用推模式(由Broker主动推送给Consumer)或结合拉模式的混合模式,但RocketMQ的标准拉取机制是其核心特点。4.答案:C解析思路:削峰填谷是消息队列最典型的应用场景,用于应对突发流量。秒杀活动流量巨大且持续时间短,直接请求数据库会导致系统崩溃,使用MQ可以缓冲流量,将请求异步处理。5.答案:B解析思路:保证生产者可靠性通常不使用事务(性能太差),而是使用Confirm模式(发送确认)或Return模式。通过回调机制确认消息是否发送成功,确保消息已到达Broker。6.答案:C解析思路:RabbitMQ中,FanoutExchange(扇出交换机)会将消息广播到所有绑定的队列,不进行路由匹配,这是实现一对多广播最直接的方式。7.答案:A解析思路:Kafka利用磁盘的顺序读写特性来提高性能。相比随机读写内存,顺序IO虽然慢一点点,但Kafka将磁盘IO转化为顺序IO,吞吐量反而高于随机IO。8.答案:C解析思路:消息丢失后,消费者无法恢复丢失的消息本身。但是,可以通过“消息重试”机制,将未成功消费的消息重新放回队列,让消费者重新尝试处理,从而实现恢复。9.答案:C解析思路:RocketMQ事务消息是为了解决分布式事务问题,特别是本地事务与消息发送的一致性。即:先发消息,再执行本地事务,最后根据本地事务结果决定提交或回滚消息。10.答案:A解析思路:生产者发送速度远大于消费者处理速度,会导致消息在队列中堆积。如果堆积过多,会占用大量内存,甚至撑爆Broker。二、多项选择题1.答案:A,B,C解析思路:消息队列的三大核心作用是解耦、异步、削峰填谷。选项D(数据同步)通常通过数据库复制或CDC(变更数据捕获)实现,不是MQ的主要作用。2.答案:A,B,C解析思路:引入MQ会增加系统的复杂性(需要处理ACK、重试、死信等),可能导致一致性问题(CAP理论中的P/C权衡),且如果处理不当,可能导致Broker宕机从而降低整体可用性。3.答案:A,B,C解析思路:分区是Kafka并行处理的基础,同一分区有序,一个Topic可以有多个分区以增加吞吐量。分区数量在创建后是可以修改的。4.答案:A,B,C解析思路:防止重复消费的核心是“幂等性”。数据库唯一索引、Redis去重表、业务状态检查都是实现幂等性的常用手段。关闭自动确认机制并不能防止重复消费,只是改变了消费时机。5.答案:A,B,C解析思路:RabbitMQ的消息确认机制包括:Ack(确认)、Nack(拒绝)、Reject(拒绝)。这三种机制用于告诉Broker消息是否处理成功或失败。6.答案:A,B,C,D解析思路:consumeThreadMin/Max控制并发消费线程数,pullBatchSize控制一次拉取的消息数量,pullInterval控制拉取消息的间隔。这些参数都会直接影响消费者的消费速度。7.答案:A,C解析思路:死信队列(DLX)用于存储无法被正常消费的消息(如被拒绝且不重新入队、TTL过期等),起到隔离和后续人工处理的作用。它不能替代消费者,也不能提高吞吐量。8.答案:A,B,C解析思路:持久化可以防止服务重启丢数据,但持久化写入磁盘是同步操作,会显著降低吞吐量。虽然持久化能极大提高可靠性,但严格来说不能保证“绝对”不丢失(如断电瞬间等极端情况)。9.答案:A,B解析思路:保证顺序性的方法:1.单个队列单消费者(性能差);2.将相同ID的数据发到同一个分区(Kafka)或同一个队列(RabbitMQ)。Redis排序属于临时方案,不是MQ本身的机制。10.答案:A,B,C解析思路:高可用性通过集群部署、主从切换、多副本备份来实现。停止服务维护属于宕机,不属于高可用方案。三、简答题1.答案:1.解耦:不同模块之间不直接调用,通过MQ通信。场景:用户下单后,订单服务发送消息到MQ,物流服务和积分服务监听消息进行处理,无需等待对方响应。2.异步:耗时操作异步执行,主流程快速返回。场景:注册完成后,发送邮件、短信、积分增加等操作通过MQ异步处理,提升用户体验。3.削峰填谷:应对突发流量,保护后端系统。场景:秒杀活动,流量先经过MQ缓冲,后端系统按能力慢慢处理。2.答案:1.生产者:开启Confirm/Return机制。消息发送后,Broker会回调,确认消息是否到达Exchange或Queue,若未到达则重发。2.Broker:开启消息持久化(Durable)和镜像集群模式,确保消息不丢失。3.消费者:关闭自动ACK,改为手动ACK。消费成功才手动ACK,失败则拒绝并重新入队(利用重试)。3.答案:定义:消息队列中堆积了大量未被消费的消息。处理方案:1.排查:检查消费者代码死循环、消费时间过长或消息体过大。2.临时扩容:临时写一个脚本,直接从MQ拉取消息写入一个临时队列,启动多个临时消费者并行消费。3.恢复:临时消费者处理完后,再切回正常消费者。4.答案:1.发送半消息给MQ。2.执行本地事务(如扣减库存)。3.根据本地事务执行结果,向MQ提交或回滚消息。4.MQ回调查询接口,查询本地事务执行结果。5.如果成功,提交消息;如果失败,回滚消息。5.答案:1.数据库层面:利用数据库的唯一索引(如订单ID),插入时若重复则报错忽略。2.Redis层面:使用Redis去重表,记录已处理的消息ID,消费前先判断是否存在。3.业务逻辑层面:在消费逻辑中检查业务状态(如订单是否已支付),如果状态已变,则视为重复,直接返回成功。四、综合应用题1.答案:方案:1.秒杀请求直接发送到MQ,订单服务只负责将请求入队,不直接操作DB。2.启动多个订单消费线程,异步从MQ拉取消息。3.消费者先扣减库存,库存扣减成功后,再发送消息到MQ通知数据库创建订单。4.数据库创建订单服务监听MQ,接收消息后落库。一致性保证:1.本地消息表:在订单服务本地数据库存一张消息表,记录库存扣减状态。2.定时任务:定时扫描消息表,如果库存扣减成功且订单未创建,则发送MQ通知。3.RocketMQ事务消息:使用RocketMQ的事务消息特性,确保库存扣减和订单落库的原子性。2.答案:可能丢失环节:1.生产者:消息发出后,网络断开,MQ未收到,生产者以为发送成功。2.Broker:消息到达Exchange,但未写入磁盘,Broker宕机,数据丢失。3.消费者:消息已写入磁盘,消费者接收成功但未处理完宕机,且未发送ACK。解决策略:1.生产者:配置mandatory参数和ConfirmCallback,监听消息是否到达队列,未到达则重发。2.Broker:开启消息持久化和镜像队列,确保消息落盘。3.消费者:配置手动ACK,捕获异常,未处理完不确认,Broker会重发消息。3.答案:架构设计:1.数据摄入:使用Kafka

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论