持续输出面试题之RocketMQ篇

美髯公
• 阅读 10403

开篇介绍

大家好,我是Java最全面试题库的提裤姐,今天这篇是中间件面试题系列的第二篇,主要总结了RocketMQ相关的面试题;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。

多个MQ如何选型?

RabbitMQ
erlang开发,对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。

RocketMQ
java开发,面向互联网集群化,功能丰富,对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,每秒钟大概能处理几十万条消息。

Kafka
Scala开发,面向日志,功能丰富,性能最高。当你的业务场景中,每秒钟消息数量没有那么多的时候,Kafka 的时延反而会比较高。所以,Kafka 不太适合在线业务场景。

ActiveMQ
java开发,简单,稳定,性能不如前面三个。不推荐。

RocketMQ组成部分有哪些?

Nameserver
无状态,动态列表;这也是和zookeeper的重要区别之一。zookeeper是有状态的。

Producer
消息生产者,负责发消息到Broker。

Broker
就是MQ本身,负责收发消息、持久化消息等。

Consumer
消息消费者,负责从Broker上拉取消息进行消费,消费完进行ack。

RocketMQ消费模式有几种?

集群消费

  • 一条消息只会被同Group中的一个Consumer消费
  • 多个Group同时消费一个Topic时,每个Group都会有一个Consumer消费到数据

广播消费

  • 消息将对一个Consumer Group 下的各个 Consumer 实例都消费一遍。即即使这些 Consumer 属于同一个Consumer Group ,消息也会被 Consumer Group 中的每个 Consumer 都消费一次。

消息重复消费如何解决?

出现原因
正常情况下在consumer真正消费完消息后应该发送ack,通知broker该消息已正常消费,从queue中剔除
当ack因为网络原因无法发送到broker,broker会认为词条消息没有被消费,此后会开启消息重投机制把消息再次投递到consumer。

消费模式:在CLUSTERING模式下,消息在broker中会保证相同group的consumer消费一次,但是针对不同group的consumer会推送多次

解决方案

  • 数据库表:处理消息前,使用消息主键在表中带有约束的字段中insert
  • Map:单机时可以使用map做限制,消费时查询当前消息id是不是已经存在
  • Redis:使用分布式锁。

RocketMQ如何保证消息的顺序消费?

首先多个queue只能保证单个queue里的顺序,queue是典型的FIFO,天然顺序。多个queue同时消费是无法绝对保证消息的有序性的。
可以使用同一topic,同一个QUEUE,发消息的时候一个线程去发送消息,消费的时候 一个线程去消费一个queue里的消息。

RocketMQ如何保证消息不丢失?

Producer端
采取send()同步发消息,发送结果是同步感知的。
发送失败后可以重试,设置重试次数。默认3次。

Broker端
修改刷盘策略为同步刷盘。默认情况下是异步刷盘的。
集群部署

Consumer端
完全消费正常后在进行手动ack确认

RocketMQ如何实现分布式事务?

1、生产者向MQ服务器发送half消息。
2、half消息发送成功后,MQ服务器返回确认消息给生产者。
3、生产者开始执行本地事务。
4、根据本地事务执行的结果(UNKNOWcommitrollback)向MQ Server发送提交或回滚消息。
5、如果错过了(可能因为网络异常、生产者突然宕机等导致的异常情况)提交/回滚消息,则MQ服务器将向同一组中的每个生产者发送回查消息以获取事务状态。
6、回查生产者本地事物状态。
7、生产者根据本地事务状态发送提交/回滚消息。
8、MQ服务器将丢弃回滚的消息,但已提交(进行过二次确认的half消息)的消息将投递给消费者进行消费。

Half Message:预处理消息,当broker收到此类消息后,会存储到RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中

检查事务状态:Broker会开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC队列中的消息,每次执行任务会向消息发送者确认事务执行状态(提交、回滚、未知),如果是未知,Broker会定时去回调在重新检查。

超时:如果超过回查次数,默认回滚消息。
也就是他并未真正进入Topic的queue,而是用了临时queue来放所谓的half message,等提交事务后才会真正的将half message转移到topic下的queue。

RocketMQ的消息堆积如何处理?

1、如果可以添加消费者解决,就添加消费者的数据量
2、如果出现了queue,但是消费者多的情况。可以使用准备一个临时的topic,同时创建一些queue,在临时创建一个消费者来把这些消息转移到topic中,让消费者消费。

点赞
收藏
评论区
推荐文章
Nick16 Nick16
4年前
前端面试题全覆盖整理
本篇文章整理总结了一些前端面试题,涵盖面很广,并且面的都是知名大厂,所以这些题还是很有代表性的,都掌握以后一面基础面应该没什么问题,二面也能应付大半,奉上:css相关1.万能居中1.margin:0auto;水平2.textalign:center;水平3.行高,垂直4.表格
Android程序员面试必备的知识点,深入分析
由于涉及到的面试题较多导致篇幅较长,我根据这些面试题所涉及到的常问范围总结了并做出了一份学习进阶路线图​​​​​​​及面试题答案免费分享给大家,文末有免费领取方式!View面试专题1.View的滑动方式2.View的事件分发机制3.View的加载流程4.View的measurelayout和draw流程5.自定义view需要注意的
徐小夕 徐小夕
4年前
2019年,盘点一些我出过的前端面试题以及对求职者的建议
笔者虽然曾经也面试过很多求职者,但是对于前端的笔试和面试,我觉得并不能体现一个人的真实能力,所以建议大家多修炼前端真正的技术.对于前端面试题,之前也承诺过读者要出一篇,笔者大致总结一下曾今面试的题目.后续不会再出面试题,而是聚焦于一些真正的,有利于成长性的技术文章和思维方式,来帮助大家提高解决问题的能力.(https://usergoldcdn.
Wesley13 Wesley13
3年前
Java面试集锦
各位学习Java的同学看过来了,以下是CSDN作者「ThinkWon」总结的面试题。希望对在准备跳槽或者找工作的同学有点帮助。这一波面试题总体来说基本上能够回答面试官的70%问题。虽然有些小节不够完善的,只能靠你自己多面试多总结了。序号内容链接地址1Java基础知识面试题(2020最新版)https://thinkwon.bl
Stella981 Stella981
3年前
2020面试整理【java】
前言:java框架面试题总结2020年4月1日spring面试题1.你对spring的理解?与springmvc和springboot的区别?(经常被问到)Spring是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。
Wesley13 Wesley13
3年前
2020年1
前言2020年一半儿快要过去了,总结了上半年各类Java面试题,初中级和中高级都有,包括JavaOOP面试题、Java集合/泛型面试题、Java异常面试题、Java种的IO与NIO面试题、Java反射面试题、Java序列化面试题、Java注解面试题、多线程与并发面试题、JVM面试题、MySQL面试题、Redis面试题、Memcached面试题、Mo
Wesley13 Wesley13
3年前
Java 200+ 面试题补充 ThreadLocal 模块
!(http://icdn.apigo.cn/blog/threadlocal02.png)让我们每天都有进步,老王带你打造最全的Java面试清单,认真把一件事做到极致。本文是前文《Java最常见的200面试题》(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%
可莉 可莉
3年前
2020面试整理【java】
前言:java框架面试题总结2020年4月1日spring面试题1.你对spring的理解?与springmvc和springboot的区别?(经常被问到)Spring是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。
Stella981 Stella981
3年前
Git神作!2021年Java春招高级面试指南,吃透至少P7
马上到今年的金三银四了,又是跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的1到5年Java面试者都需要掌握的面试题,分别JVM,并发编程,MySQL,Tomcat,网络与IO及Spring系列等等,可以说掌握这些薪资涨10K还是可以的!今天分享给大家的都是目前主流企业使用最高频的面试题库,也都是Java
Stella981 Stella981
3年前
509道Java面试题解析:2020年最新Java面试题
《Java面试全解析》是我在GitChat发布的一门电子书,全书总共有15万字和505道Java面试题解析,目前来说应该是最实用和最全的Java面试题解析了。我本人是2009年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有360和游久游戏,因为自己家庭的原因,放弃了阿里钉钉团队的offer回到了西
Wesley13 Wesley13
3年前
Java 200+ 面试题补充② Netty 模块
让我们每天都能看到自己的进步。老王带你打造最全的Java面试清单,认真把一件事做到最好。本文是前文《Java最常见的200面试题》(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.csdn.net%2Fsufu1065%2Farticle%2Fdetails
美髯公
美髯公
Lv1
十步杀一人,千里不留行。——李白
文章
4
粉丝
0
获赞
0