Client.id和group.instance.id有什么不同

mwg9r5ms  于 2022-10-07  发布在  Apache
关注(0)|答案(1)|浏览(250)

配置使用者时,您可以指定:

group.instance.id-“由最终用户提供的使用者示例的唯一标识符。只允许使用非空字符串。如果设置,使用者将被视为静态成员,这意味着使用者组中任何时候都只允许一个具有此ID的示例。这可以与较大的会话超时结合使用,以避免因暂时不可用(例如,进程重新启动)而导致组重新平衡。如果未设置,使用者将作为动态成员加入组,这是传统行为。”

client.id-“发出请求时传递给服务器的ID字符串。这样做的目的是允许在服务器端请求记录中包括逻辑应用程序名称,从而能够跟踪请求的来源,而不仅仅是IP/端口。”

对于我的用例,我需要group.instance.id描述中的确切行为,但我想知道为什么有两个不同的配置属性,并且花了一些时间才弄清楚client.id是不够的。

为什么会有两个?

r3i60tvu

r3i60tvu1#

它们是完全不同的参数,为了弄清楚这一点,我也不得不重新阅读文档。

  • client.id是消费者的唯一标识,主要用于跟踪和记录请求的来源。
  • group.instance.id是消费者的唯一标识,用于使消费者成为静态消费者,与client.id无关。

这意味着您可以在consumer A的配置中使用这两个值,例如:

//Consumer A
client.id = 123
group.instance.id = 1

这里的关键在于KIP-345中引入的静态成员资格范例。

这样做是为了避免重新平衡后使用者线程之间的分区更改。例如,如果您有来自同一group.id的三个不同的使用者,并将它们设置为唯一的group.instance.id,则将始终为每个使用者分配相同的分区。

例如,假设同一组中有三个消费者:

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)

静态成员资格避免的是由默认范围分配器引起的分区更改,它的工作方式是对组中的成员进行排序,然后分配分区范围以实现平衡

这在本文档中有很好的解释(不要将ember.id与client.id混淆)

1.在红色中,没有group.instance.id的消费者由于分配者的原因,每次重新平衡都需要更换分区。
1.在绿色中,设置了instanceId(group.instance.id)的消费者成为静态消费者静态成员身份使每个消费者成为其初始分区集的主控。即使发生重新平衡,每个使用者始终持有相同的分区,从而避免使用者线程之间的分区更改。

  • TLDR;*

总之,这些参数并不相关,设置group.instance.id的想法是将make the consumer static
这个想法被概括为静态成员资格,与动态成员资格(我们的系统当前使用的成员资格)相反,它优先考虑“状态持久性”而不是“活跃性”。这个KIP的想法是**通过引入一个称为静态成员资格的新概念来减少重新平衡的数量*

相关问题