kafka静态消费组成员

背景:

目前kafka消费者在加入消费组过程中,只需要指定消费组名称即可,这种消费模式存在一个问题,任何一个消费者离开或者加入消费组都会带来coordinator端对消费组的再平衡操作。但是当集群消费组成员数量与所订阅的topic数量过大时,这种再平衡操作会带来大量的数据传输,造成消费数据的延时会很高。如果接连触发几次再平衡过程,可能业务端的消费就会受到很大的影响,鉴于此,kafka社区在发布2.3.0版本的时候提出了静态消费组的概念。主要解决了以下场景遇到的问题:

1.提升了高负载集群的处理性能。正如我们所看到的,由于消费组的消费状态转移会耗费大量的时间,再平衡过程成了影响大规模消费组消费性能的主要因素。

2.提升了滚动重启的性能。举个例子来说,当多个消费者客户端需要更新代码逻辑进行滚动重启时,这个滚动重启过程将会触发很少次数的再平衡的过程(例如消费者端leader节点的重启时)。这样只要消费者客户端在特定时间内完成重启操作时,滚动重启的性能将会大大提升。

概念:

在当前架构中,每次的再平衡操作,broker端都会对组内消费者重新分配一个‘memer.id’,这个id是随机生成的。这样做是为了对消费组内的每个组成员分配一个唯一的标识符。在消费客户端重启期间,消费者会发送一个JoinGroupRequest,其中包含了UNKNOWN_MEMBER_ID (即空字符串),broker端会将其看作一个新成员。为了达到本章提出的静态消费组的效果,需要修改客户端和消费者客户端的逻辑,通过持有一个新的参数group.instance.id,在broker端来保持原有消费组的状态。这样,我们就可以减少再平衡的过程,因为我们可以对重新启动的消费组成员分配原来的消费方案。这个方案就可以被看作是静态消费组,相比于之前的动态消费组,这个方案认为,“成员持久化”特性比“成员活性”的特性更加重要。

应用了静态消费组特性后,消费组成员只会在以下几种情况下进行再平衡操作:

  • 新成员加入时
  • 消费组端leader重新加入
  • 当前静态成员离开时间超过了会话时间(客户端会话超时参数:session.timeout.ms,服务端会话超时参数group.max.session.timeout.ms)
  • broker收到了静态消费成员离开组的请求(查看社区JIRA,此种情况将通过命令行实现,正在开发中)

实验

触发rebalance的第一种情况:新成员加入

  根据测试结果来看,当前版本消费者在加入消费组的过程中新增了消费偏移量所在的分区,即图中__consumer_offset-45,比之前版本方便了很多。

同时在静态消费组成员在会话超时时间内重新加入消费组是不会触发rebalance过程的。

触发rebalance的第二种情况:消费组leader加入

经测试,消费组中leader重新加入时,会报如上错误,这个应该是未完善的功能。

触发rebalance的第三种情况:静态成员离开时间超过了会话时间

待完善点:

目前来看,在社区2.3.1版本上,刚修复了[KAFKA-8715] - Static consumer cannot join group due to ERROR in broker。

下一步还在开发的功能点包括:

  • 消费组成员在加入组过程中添加加入原因,以便更好的处理rebalance过程。
  • 在rebalance分配消费任务的过程中,在不同分配器的消息传递过程中添加静态消费成员信息。
  • 开发类似

 

猜你喜欢

转载自www.cnblogs.com/gongzixiaobaibcy/p/11815865.html