RocketMQ集群中的broker挂了会怎样?

集群中的一个broker挂了会怎样?

1. 对于普通消息的影响:

        Producer 同步发送的情况下会有重试机制,重试时把消息发送到其他 Broker。发送消息的逻辑其实是是一个循环,发送失败后会不断尝试重新发送,对于单边消息是不会重试的,因此对于单边消息,就只能发送失败了。

        而对于同步消息和异步消息,可以通过重试的方式发送到其他的 Broker 上。

在大并发的情况下这种重试会影响性能,怎么保证不把消息发送到挂掉的 Broker 上呢?

        RocketMQ 有延迟故障隔离策略,如果发送某一个 Broker 失败了,会将其隔离,优先选择正常的 Broker 发送消息。需要注意的是,这个策略默认是不开启的。

1.第一次发消息,通过轮询的方式选择Broker;
2.后续发消息会规避上次的Broker,同样采用轮询的方式选择Broker;
3.在消息发送过程中,存在一个Broker隔离列表,用户可以通过setSendLatencyFaultEnable(true)开启 延迟故障隔离策略,客户端会尽可能选择不在隔离列表中的Broker,如果所有的Broker都在隔离列表中,那么会选择一个相对比较好的Broker来用;

2. 对于顺序消息有什么影响:

        对于全局顺序消息,如果设置了所有消息要发送到同一个 Broker 的同一个 MessageQueue 中的情况,恰好是这个 Broker 挂了,那就只能等 Broker 重启后再发送了。

        对于局部顺序消息,比如同一个订单相关的消息要发送到同一个 Broker 的同一个 MessageQueue 中的情况,如果这个 Broker 挂了,那 MessageQueueSelector 会选择其他 Broker 上的 MessageQueue 进行发送,这会影响当前这笔订单消费的顺序性。而其他订单可以被 Producer 发送到其他的队列中,不受影响。(没有从节点的情况)

3. 对消费者有什么影响:

        3.1 没有设置主从集群的情况下:

        如果 Broker 没有设置主从集群,消费者会继续从挂掉的 Broker 上拉取,这会导致拉取失败,直到 NameServer 更新了 Broker 列表。

        NameServer 会有每 10s 一次的定时任务检查 Broker 是否下线了,如果 120s 内有没有收到 Broker 心跳,则关闭 channel,把 Broker 信息从本地缓存移除。消费者则默认每隔 30s 向 NameServer 拉取路由信息来刷新本地缓存的 Broker 列表。也就是说可能会有最多 150s 的时间消费者拉取消息失败。

        3.2 设置主从集群的情况下:

        如果有主从节点,只有主节点才能进行写入操作,从节点不允许写入,只能同步主节点,同步策略取决于主节点的配置,但是消费者可以去从节点消费消息。

        Broker 挂了以后,消费组会通过向 NameServer 拉取订阅关系来更新本地缓存的 Broker 列表,因为主节点已经不在列表中了,所以会从从节点列表中选择一个 Broker 进项消息拉取。

        主节点没有挂的情况,消费者也会去从节点拉取消息,但是需要设置 slaveReadEnable 参数为 true,并且当未处理的消息超出物理内存 40% 时就会去从节点拉取。

4. broker主节点挂了,从节点消费消息,可能会重复消费吗?

        对于广播模式,消息偏移量是保存在消费者本地的,只要消费者不挂,按照内存中的偏移量去从节点拉取就行了,不会有问题。

        对于集群模式,消息偏移量保存在 Broker,消费者消费完一批消息后,会向 Broker 发送请求更新 Broker 内存中保存的偏移量,内存中的偏移量会定时(每 5s 一次)更新一次。如果 Broker 主节点不挂,无论消费者从主节点还是从节点拉取消息,更新偏移量的请求都会发送到主节点,从节点会每隔 10s 从主节点同步偏移量。

        也就是说,如果主节点挂了,去从节点拉取消息,可能因为偏移量没有同步到主节点,从节点保存的偏移量不正确。不过只要消费者不宕机,就会根据消费者本地保存的偏移量去拉取,并不会拉取到重复消息。

如果 Broker 主节点重启了,主节点并不能同步从节点的最新偏移量,那消费者从主节点读取会读到重复消息吗?

        如果主节点重启了,如果消费者会用本地保存的偏移量去主节点拉取消息,主节点会更新本地的偏移量,同时从节点也会去主节点同步偏移量,所以并不会拉取到重复消息。如果消费者也挂了,消费者重启后 Broker 主节点的偏移量还没有被其他消费者更新过,那确实会拉取到重复消息。

偏移量:

        广播模式下,偏移量保存在消费者本地。这也是最合理的,因为每个消费者都要消费同一个 MessageQueue,自己维护自己的偏移量更简单。不过这可能也是广播模式下不支持消息重试的原因,因为如果一个消费者消费失败了,这批消息其他消费成功的消费者也需要重试,导致重复消费。

        集群模式下,偏移量保存在 Broker 服务器,主从定时同步。消费者也保存偏移量,定时同步到broker,所以broker重启,不会影响,消费者不会应为偏移量问题而重复消费。

相关推荐

  1. RocketMQbroker怎样

    2024-07-18 02:38:01       17 阅读
  2. RocketMQbroker配置说明

    2024-07-18 02:38:01       24 阅读
  3. oracle11g

    2024-07-18 02:38:01       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 02:38:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 02:38:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 02:38:01       57 阅读
  4. Python语言-面向对象

    2024-07-18 02:38:01       68 阅读

热门阅读

  1. Web前端三剑客入门学习网站推荐与编译软件

    2024-07-18 02:38:01       23 阅读
  2. Eureka介绍与使用

    2024-07-18 02:38:01       23 阅读
  3. 科研绘图系列:R语言雷达图(radar plot)

    2024-07-18 02:38:01       20 阅读
  4. 面试中如果被问到项目遇到的难题如何解决

    2024-07-18 02:38:01       20 阅读
  5. Jetpack Compose实现一个简单的微信UI

    2024-07-18 02:38:01       19 阅读
  6. 孟德尔随机化——混杂SNP剔除之LDlink(1)

    2024-07-18 02:38:01       24 阅读
  7. STM32-Cube开发资源

    2024-07-18 02:38:01       19 阅读
  8. 题解|2023暑期杭电多校03

    2024-07-18 02:38:01       22 阅读
  9. 【busybox记录】【shell指令】touch

    2024-07-18 02:38:01       23 阅读
  10. 数据库连接的艺术:在PyCharm中轻松配置

    2024-07-18 02:38:01       24 阅读
  11. Linux C++ 053-设计模式之模板方法模式

    2024-07-18 02:38:01       22 阅读
  12. OpenGL-0-简要说明

    2024-07-18 02:38:01       21 阅读