1.RocketMQ Broker中的消息被消费后会立即删除吗?
不会,broker中的消息存储在commitlog文件中,consumer消费消息后只会更新消息的offset,不会删除消息。
问题:消息不删除,会不会发生消息堆积?
不会,commitlog有过期时间,过期时间为72小时,即3天。默认每日凌晨4点清楚过期文件。
但是,有以下几种特殊情况:
1.磁盘文件达到75%时,不管有没有到凌晨4点都会清楚过期文件;
2.磁盘文件达到85%时,会按照既定规则(默认从最老的文件开始)清楚文件,不管文件有没有过期
3.磁盘文件达到90%时,会停止接受消息
2.RocketMQ消费模式有几种?
集群模式和广播模式。
集群模式:一条消息只会被一个group中的一个consumer消费。
广播模式:一条消息会被每一个consumer消费
3.RocketMQ如何做负载均衡?
消息分配机制:
- 轮循算法:消息平均分配
- 最小投递延迟算法:统计消息每次投递的延迟时间,将消息投递给延迟最小的队列
队列分配机制:
- 平均分配策略:queue数量/consume数量,先计算出每个consumer分配多少个queue
- 环形平均策略: 将消费者组成环形,按照环形位置逐个分配,不用优先计算每个consumer分配多少个queue
- 一致性hash算法:计算queue和consumer的hash值并落到环上,按照顺时针方向,将queue分配给最近的一个consumer
一致性hash算法效率最低,但是能有效减少reblance,适用于频繁扩容缩容的场景。
4.消息重复消费
可能出现消息重复的场景:
- 生产者端
生产者端向broker发送消息,由于网络波动,没有收到broker返回的ACK消息,此时会重写向broker发送该消息,造成消息重复
- 消费者端
消费者消费broker中的消息,由于网络波动,broker没有收到ACK消息,会重新将该消息发送给消费者消费,造成消息重复
- reblance
发生reblance时,会产生消息重复
什么情况下会发生reblance?
当队列数量或者消费者数量发生变化时,会发生reblance,重新分配队列。
如何解决?
通过幂等令牌做唯一性处理。幂等令牌是一个全局唯一性标识,具体步骤如下:
- 消费消息时,先通过缓存去重,如果缓存中有了该幂等令牌,说明该消息已被消费;如果没有,执行第二步
- 在去数据库中查询该幂等令牌是否存在,存在说明该消息已被消费,否则执行该消息。
5.如何让RocketMQ保证消息的顺序消费
首先明确一点:多个queue只能保证单个queue里的顺序是有序的,多个queue同时消费无法保证顺序是有序的。
如何保证同一类型的消息分到同一个queue中?
Rocket MQ中提供了队列选择接口MessageQueueSelector,在其中实现队列选择算法。
通过选择key,对队列取模,取模结果即为queueID
6.RocketMQ如何保证消息不丢失
生产者端:使用confirm模式,生产者发送消息给broker后,broker需要返回一个ACK消息,如果producer没有收到该ACK消息,则认为消息发送失败,重新发送。
消费者端:手动返回ACK消息。
broker端:开启同步刷盘策略(默认是异步刷盘策略);集群部署,主从模式 ,高可用。
7.rocketMQ的消息堆积如何处理
什么场景出现消息堆积?
- 消费者功能有bug;
- 生产者突然向broker发送大量消息,消费者消费能力不足
- 网络波动或宕机,消费者与broker未连接
解决办法:
场景一:灰度发布。每次新功能上线前,选取一定比例的消费实例做灰度,若出现问题,及时回滚;若消费者消费正常,平稳运行一段时间后,再升级其它实例。
场景二:增加消费者示例
场景三:熔断与隔离,当一个Broker的队列出现消息积压时,要对其熔断,将其隔离将消息发送到其他实例中消费
8.rocketMQ事务消息的原理
两阶段提交+事务状态回查
半事务消息会存储到RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中,而不是真正的topic下的queue中
回查:broker会启动一个定时任务,定时(默认一分钟)消费RMQ_SYS_TRANS_HALF_TOPIC中的消息,确认是提交、回滚还是回查。
9.rocketMq由哪些部分组成,各自的作用是什么
pruducer:生产者,负责生产消息
nameserver:注册中心,负责broker管理和路由信息管理
broker:mq本身,负责收发消息和持久化
consumer:消费者,负责消费消息
nameserver与zookeeper注册中心的区别是什么?
nameserver是无状态的,节点间是无差异的,相互间不进行通信
nameserver相互间不进行通信,那broker是如何进行注册的?
当broker启动时,会轮循所有的nameserver,并建立一个长连接,向nameserver注册自身的信息,nameserver会维护一个broker列表,存放broker的信息。
nameserver的优缺点
优点:集群搭建简单
缺点:因为是无状态的,因此新启一个nameserver的时候,对于broker来说是不可见的,broker并不会向该nameserver注册自身信息。
nameserver中存储的是什么信息?
存储的是Topic消息的Queue与Broker的地址(IP+Port)的映射关系