RocketMQ-总结

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如何做负载均衡?

消息分配机制:

  1. 轮循算法:消息平均分配
  2. 最小投递延迟算法:统计消息每次投递的延迟时间,将消息投递给延迟最小的队列

队列分配机制:

  1. 平均分配策略:queue数量/consume数量,先计算出每个consumer分配多少个queue
  2. 环形平均策略: 将消费者组成环形,按照环形位置逐个分配,不用优先计算每个consumer分配多少个queue
  3. 一致性hash算法:计算queue和consumer的hash值并落到环上,按照顺时针方向,将queue分配给最近的一个consumer

一致性hash算法效率最低,但是能有效减少reblance,适用于频繁扩容缩容的场景。

4.消息重复消费

可能出现消息重复的场景:

  • 生产者端

生产者端向broker发送消息,由于网络波动,没有收到broker返回的ACK消息,此时会重写向broker发送该消息,造成消息重复

  • 消费者端

消费者消费broker中的消息,由于网络波动,broker没有收到ACK消息,会重新将该消息发送给消费者消费,造成消息重复

  • reblance

发生reblance时,会产生消息重复

什么情况下会发生reblance?

当队列数量或者消费者数量发生变化时,会发生reblance,重新分配队列。

如何解决?

通过幂等令牌做唯一性处理。幂等令牌是一个全局唯一性标识,具体步骤如下:

  1. 消费消息时,先通过缓存去重,如果缓存中有了该幂等令牌,说明该消息已被消费;如果没有,执行第二步
  2. 在去数据库中查询该幂等令牌是否存在,存在说明该消息已被消费,否则执行该消息。

5.如何让RocketMQ保证消息的顺序消费

首先明确一点:多个queue只能保证单个queue里的顺序是有序的,多个queue同时消费无法保证顺序是有序的。

如何保证同一类型的消息分到同一个queue中?

Rocket MQ中提供了队列选择接口MessageQueueSelector,在其中实现队列选择算法。

通过选择key,对队列取模,取模结果即为queueID

6.RocketMQ如何保证消息不丢失

生产者端:使用confirm模式,生产者发送消息给broker后,broker需要返回一个ACK消息,如果producer没有收到该ACK消息,则认为消息发送失败,重新发送。

消费者端:手动返回ACK消息。

broker端:开启同步刷盘策略(默认是异步刷盘策略);集群部署,主从模式 ,高可用。

7.rocketMQ的消息堆积如何处理

什么场景出现消息堆积?

  1. 消费者功能有bug;
  2. 生产者突然向broker发送大量消息,消费者消费能力不足
  3. 网络波动或宕机,消费者与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)的映射关系

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值