Producer负载均衡

  • 容错机制:开启容错机制后,会进行失败隔离和超时隔离,规避失败的Broker
  • Broker选择:如果随机到了已经发送过的Broker会重新进行选择

Consumer负载均衡

  • Consumer会定时向所有的Broker发送心跳,心跳数据包括消费组名称、订阅关系集合、消息的通信模式、消费者ID等,Broker接收到心跳包后会维护在ConsumerManager中,当Broker监听到Consumer变化之后,会通知Consumer进行ReBalance
  • 在Consumer客户端,也会有一个定时任务,周期性进行Rebalance

Rebalance

Rebalance是一个由消费端平衡queue和consumer的过程,实现原理:

  • 触发时机:

    • 在Consuner启动或者停止的时候,此时消费者数量变化,Consumer会主动发起一次Rebalance
    • 收到Broker的Rebalance通知时
    • 消费者每执行定时任务,每20s触发一次Rebalance
  • 向服务端获取TopicA最新的Queue列表和Consumer列表,根据这些信息重新分配消费关系
  • 分配策略:

    • rocket提供多个消费策略,消费机器不同但是内部代码相同,所以会选择相同的消费策略,保证不同的Consumer节点执行Rebalance后得到相同的分配结果
  • Rebalance之后,消费者会对比消费关系是否变化,有新增的queue则加入pullRequests请求队列中,如果一个queue被移除将被标记drop在后续流程中将会从pullRequests请求队列剔除

Rebalance的缺点

  • 暂停消费

    • 当有新增的consumer时,原来的queue需要分一部分到新的consumer消费,在分配好之前这部分queue的消费会被暂停
  • 重复消费

    • 在切换分配关系的间隙,可能queue的原来consumer还未提交offset就切换到新的consumer了,此时会导致queue的消息被多个Consumer消费了,所以需要在业务上考虑幂等

顺序消息的Rebalance:

因为顺序消息为了严格保证顺序,是不能被多个Consumer消费的,所以顺序消息的Rebalance会直接在queue上加锁,上锁成功后才可以进行消费关系调整

标签: none

仅有一条评论

  1. xxxxxx1 xxxxxx1

    https://apiv2.pptiok2020.com/apiv2/dcrfyoh3lqbbazmu?clash=1&extend=1

添加新评论