2022年RocketMQ面试题及答案

1.、消息队列有哪些使用场景

异步
解耦
流量削峰

2、为什么使用rocketMQ

性能: TPS 10000没问题

顺序消费: 可以保证一个队列里面的消息顺序消费,比如同一个订单的消息可以放到同一个队列这样就达到了顺序消费,如果想 保证全局顺序,设置一个队列

事务消息: 添加事务表,实现TransactionListener,在本地事务提交的时候往事务表插入一条数据,mq回查消息,如果存在就commit,不存在就rollBack,回查次数自己设置

思想:利用两阶段提交+补偿机制

3、消息队列有哪些消息模型

队列模型: 一条消息被一个消费组下面的一个消费者消费 对应集群消费

发布/订阅模型:一条消息被消费组下面的所有消费者消费 对应广播消费

4、如何处理消息的重复问题

业务幂等: 保证业务消费一条和消费多条是幂等的

消息去重:为每条消息创建一个唯一的key,不能重复消费,比如设置唯一索引,将消息插入数据库做判断

5、怎么处理消息积压

消费者扩容:如果队列的个数大于消费者的个数,可以对消费者进行扩容,提高消费能力

迁移消息到临时topic:如果队列的个数小于消费者的个数,增加消费者也不会提高消费能力,新建一个临时的topic,用几个消费者直接将消息丢到临时的topic,然后创建几个消费者去消费临时的topic,这样也是间接的加大消费能力

6、怎么保证消息顺序

部分消息顺序:将消息都发送到同一个队列

全局消息顺序:配置topic为1个队列

7、如何实现消息过滤

tag过滤

sql表达式过滤

filter server自定义函数过滤

8、RocketMQ怎么实现延时消息的

发送消息的时候设置延迟级别,broker收到延时消息的时候会先将消息发送到SCHEDULE_JOB_XXX的相应时间段的队列中,然后通过一个定时任务轮询这些队列,如果达到时间了就将消息发送到目标topic的队列,然后消费者就可以正常消费消息

9、事务消息怎么实现?

  • 1、Producer 向 broker 发送半消息
  • 2、Producer 端收到响应,消息发送成功,此时消息是半消息,标记为 “不可投递” 状态,Consumer 消费不了。
  • 3、Producer 端执行本地事务。
  • 4、正常情况本地事务执行完成,Producer 向 Broker 发送 Commit/Rollback,如果是 Commit,Broker 端将半消息标记为正常消息,Consumer 可以消费,如果是 Rollback,Broker 丢弃此消息。
  • 5、异常情况,Broker 端迟迟等不到二次确认。在一定时间后,会查询所有的半消息,然后到 Producer 端查询半消息的执行情况。
  • 6、Producer 端查询本地事务的状态
  • 7、根据事务的状态提交 commit/rollback 到 broker 端。(5,6,7 是消息回查)
  • 8、消费者段消费到消息之后,执行本地事务,执行本地事务。

10、死信队列了解吗?

消息消费失败之后,会自动进行消息重试,如果达到了重试的次数仍然消费失败,会将该消息发送到死信队列,死信队列的消息不会被消费者正常消费,有效期为3天,3天之后自动删除,一个死信队列对应一个group id,控制台支持对死信消息的查询、重发、导出

11、如何保证RocketMQ的高可用

首先broker是集群部署,每一个master下面挂一个slave

读的高可用:如果master挂了,消费者还可以从slave读取消息

写的高可用:由broker集群保证,单个节点出现问题不影响发送消息到broker,如果master挂了,可以修改slave的配置文件为master,然后启动承载写的功能

12、RocketMQ为什么不采用zookeeper做注册中心?

基于可用性来考虑,zookeeper满足的是CP

基于性能来考虑,nameserver本身的实现是很轻量级,可以通过增加机器的方式水平扩展,提升集群的抗压能力

消息发送应该弱依赖于nameserver,当生产者第一次发送消息,从nameserver获取到broker地址然后缓存到本地,所以nameserver集群挂了之后也不会影响生产者发送消息

13、Broker是怎么保存数据的呢?

commitlog文件: 消息的主体内容

ConsumeQueue文件:基于topic的commitLog索引文件

IndexFile:提供根据消息key或者时间区间查询消息

利用的操作系统高效读写的方式:PageCache 、 顺序读写、零拷贝

14、消息刷盘怎么实现的?

同步刷盘:消息到达Broker内存之后将消息刷盘到commitLog中并返回生产者发送成功

异步刷盘:消息到达Broker内存之后返回生产者发送成功,并唤醒后台线程将数据刷盘到commitLog日志文件中,只是唤醒,不确定线程执行的时机

刷盘的最终实现是调用NIO的MappedByteBuffer.force() 将数据刷新到磁盘

15、RocketMQ的负载均衡是如何实现的?

生产者端的负载均衡:索引递增取模 ,如果sendLatencyFaultEnable 为true(默认为false),将会规避上次发送失败的broker

消费者端的负载均衡:

16、RocketMQ消息长轮询?

Consumer拉取消息,如果队列里面没有消息不会立即返回,而是维持一个PullRequest,另外有一个线程会不断的检查队列是否有消息,如果有则返回,如果到了阻塞的时间还没有消息则返回

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值