配置使用者时,您可以指定:
group.instance.id
-“由最终用户提供的使用者示例的唯一标识符。只允许使用非空字符串。如果设置,使用者将被视为静态成员,这意味着使用者组中任何时候都只允许一个具有此ID的示例。这可以与较大的会话超时结合使用,以避免因暂时不可用(例如,进程重新启动)而导致组重新平衡。如果未设置,使用者将作为动态成员加入组,这是传统行为。”
或client.id
-“发出请求时传递给服务器的ID字符串。这样做的目的是允许在服务器端请求记录中包括逻辑应用程序名称,从而能够跟踪请求的来源,而不仅仅是IP/端口。”
对于我的用例,我需要group.instance.id
描述中的确切行为,但我想知道为什么有两个不同的配置属性,并且花了一些时间才弄清楚client.id
是不够的。
为什么会有两个?
1条答案
按热度按时间r3i60tvu1#
它们是完全不同的参数,为了弄清楚这一点,我也不得不重新阅读文档。
client.id
是消费者的唯一标识,主要用于跟踪和记录请求的来源。group.instance.id
是消费者的唯一标识,用于使消费者成为静态消费者,与client.id无关。这意味着您可以在
consumer A
的配置中使用这两个值,例如:这里的关键在于KIP-345中引入的静态成员资格范例。
这样做是为了避免重新平衡后使用者线程之间的分区更改。例如,如果您有来自同一group.id的三个不同的使用者,并将它们设置为唯一的group.instance.id,则将始终为每个使用者分配相同的分区。
例如,假设同一组中有三个消费者:
当阅读带有9个分区的Kafka主题时,它们将始终持有分配的相同分区,例如:
静态成员资格避免的是由默认范围分配器引起的分区更改,它的工作方式是对组中的成员进行排序,然后分配分区范围以实现平衡。
这在本文档中有很好的解释(不要将ember.id与client.id混淆)
1.在红色中,没有
group.instance.id
的消费者由于分配者的原因,每次重新平衡都需要更换分区。1.在绿色中,设置了instanceId(
group.instance.id
)的消费者成为静态消费者。静态成员身份使每个消费者成为其初始分区集的主控。即使发生重新平衡,每个使用者始终持有相同的分区,从而避免使用者线程之间的分区更改。总之,这些参数并不相关,设置
group.instance.id
的想法是将make the consumerstatic
:这个想法被概括为静态成员资格,与动态成员资格(我们的系统当前使用的成员资格)相反,它优先考虑“状态持久性”而不是“活跃性”。这个KIP的想法是**通过引入一个称为静态成员资格的新概念来减少重新平衡的数量*