●push : Broker主动推送消息到消费端,但是由于各个消费端吞吐量能力不同,可能推送相同的消息,不同的consumer处理能力不能,造成消息堆积。并且也需要下游系统的服务情况,以及当下游系统进行扩容或者宕机的时候都需要及时获取,这在设计难度上比较高。
●Group Id 标识一个消费者组 是唯一值,不同的Group 消费互相不影响
●Consumer Group 下所有实例订阅的主题的单个分区,只能分配给组内的某个 Consumer 实例消费。这个分区当然也可以被其他的 Group 消费
2.选择出一个consumer作为一个Leader。
3.coordinator 把要消费的topic情况发送给Leader消费者
4.Consumer Leader会负责指定消费方案
5.把消费方案发给coordinator
6.coordinator把消费方案发给各个consumer
7.每个消费者和coordinator保持心跳,超时或者处理时间过长会触发在平衡。
1而在分区分配的时候有对应的分区策略具体就是如下三种方式
●找出该分区的Leader副本所在的Broker,该Broker就是对应的Coordinator。
我们举一个案例来描述一下,假设我们的GroupId 是test,hash值是15,对应的分区是12个,15 = 3,那么分区3就是存储Group信息的分区,而通过这个分区3在找到对应的Leader副本,就可以确定在哪个Broker了。进一步找到对应的Coordinator。
●Rebalance过程是比较慢的,会影响实时在线业务
●订阅主题数量发送变化
●订阅主题的分区数发生变化
后两个其实是主动操作,是不可避免的。而大多数的Rebalance都是由于consumer成员发生变动导致的,一个是增加,增加消费者本身是为了提升系统消费者的吞吐量,这个不在控制范围,而减少就是重中之重的避免rebalance。
从上图我们直到,consumer会定期的向协调者Coordinator发送心跳检测,如果不能在固定时间内
session.timeout.ms 默认10S 发送心跳,Coordinator会认为consumer死亡,从而发生rebalance。
heartbeat.interval.ms 是发送心跳的频率,一般来说越高频发送心跳检测,那么消耗的带宽资源就越多。
max.poll.interval.ms consumer端两次调用poll的最大时间间隔,默认是5分钟,如果5分钟没有消费poll方法返回的消息,那么会主动发起离开组的请求,开启新的一轮rebalance。
♢设置 session.timeout.ms = 6s。
♢设置 heartbeat.interval.ms = 2s。
♢要保证 Consumer 实例在被判定为“dead”之前,能够发送至少 3 轮的心跳请求,即 session.timeout.ms >= 3 * heartbeat.interval.ms。
●Rebalance 是 Consumer 消费时间过长导致的,根据业务处理时间设置 max.poll.interval.ms的值。如果业务处理50S,那么就设置55S
免责申明:
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu
《数栈V6.0产品白皮书》下载地址:https://fs80.cn/cw0iw1
想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs
同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack