在配置使用者时,可以指定:
group.instance.id --“最终用户提供的使用者实例的唯一标识符。只允许非空字符串。如果设置,使用者将被视为静态成员,这意味着在任何时候使用者组中只允许一个具有此ID的实例。这可以与更大的会话超时结合使用,以避免由于暂时不可用(例如进程重新启动)而引起的组再平衡。如果不设置,使用者将作为动态成员加入组,这是传统行为。”
或者client.id --“在发出请求时传递给服务器的id字符串,目的是通过允许在服务器端请求日志中包含一个逻辑应用程序名来跟踪请求的来源,而不仅仅是ip/端口。”
对于我的用例,我需要group.instance.id描述中的确切行为,但是我想知道为什么有两个不同的配置属性,并且花了一些时间才发现client.id是不够的。
为什么有两个?
发布于 2022-07-31 02:17:40
它们是完全不同的参数,为了弄清楚这一点,我还必须重新读取文档。
client.id是使用者的唯一标识符,主要用于跟踪请求的来源并记录它们。group.instance.id是用于使使用者保持静态的使用者的唯一标识符,与client.id无关。这意味着您可以在consumer A的配置中使用这两个值,例如:
//Consumer A
client.id = 123
group.instance.id = 1这里的关键是在基普-345中引入的静态成员模式中。
这样做的目的是避免在重新平衡之后消费者线程之间的分区更改。例如,如果您有来自同一个group.id的三个不同的消费者,并将他们设置为唯一的group.instance.ids,那么这些使用者中的每一个都将被分配相同的分区,总是这样。
例如,考虑同一组中的三个消费者:
Consumer A
- group.instance.id = A
Consumer B
- group.instance.ud = B
Consumer C
- group.instance.ud = C当阅读带有9个分区的Kafka主题时,它们总是持有相同的分配分区,例如:
A (0,1,2) - B (3,4,5) - C (6,7,8)

WHat静态成员资格避免了由默认范围分配器引起的分区更改,这种更改的工作方式是对组中的成员进行排序,然后分配分区范围以实现平衡。
这是很好的解释在这个医生里 (不要混淆member.id和client.id)

group.instance.id的消费者必须更改分区,因为每个重新平衡都是由转让人造成的。group.instance.id)的消费者变成了静态消费者。静态成员资格使每个使用者“掌握”它的初始分区集。即使发生了再平衡,每个使用者总是持有相同的分区,从而避免了使用者线程之间的分区更改。TLDR;
总之,这些参数是不相关的,设置group.instance.id的思想是与static相关的。
这种思想被概括为静态成员关系,它与动态成员关系(我们的系统目前使用的成员资格)相反,是将“状态持久性”优先于“活性”。这个KIP的思想是,通过引入一个叫做静态成员资格的新概念来减少的再平衡数量。
https://stackoverflow.com/questions/73180086
复制相似问题