繁体   English   中英

按键加入多个Kafka主题

[英]Join multiple Kafka topics by key

如何编写一个可扩展地加入多个Kafka主题的使用者?

我有一个主题,该主题发布了带有键的事件,第二个主题发布了与第一个具有相同键的子集相关的其他事件。 我想写一个订阅者,订阅者同时订阅两个主题,并对出现在两个主题中的子集执行一些其他操作。

我可以使用一个使用者轻松地做到这一点:从两个主题中读取所有内容,在本地维护状态,并在为给定键读取了两个事件时执行操作。 但我需要扩展解决方案。

理想情况下,我需要将主题捆绑在一起,以便以相同的方式对主题进行分区,并将分区同步分配给使用者。 我怎样才能做到这一点?

我知道Kafka Streams将主题结合在一起,以便将密钥分配给相同的节点。 他们是如何做到的呢? PS:我使用的是Python,因此无法使用Kafka Streams。

太糟糕了,您使用的是Python-Kafka Streams非常适合:)

如果您想手动执行此操作,则需要实现自己的PartitionAssignor实现必须确保分区在分配中共处一处:假设每个主题有4个分区(我们称它们为A和B),则必须将分区A_0和B_0分配给同一使用者(以及A_1和B_1,...)。

我希望Python使用者可以让您通过config参数partition.assignment.strategy指定自定义分区分配器。

这是Kafka Streams使用的PartitionAssignorhttps : //github.com/apache/kafka/blob/trunk/streams/src/main/java/org/apache/kafka/streams/processor/internals/StreamPartitionAssignor.java

Streams使用任务的概念-任务获取分配了相同分区号的不同主题的分区。 Streams还尝试执行“粘性分配”-即,如果可能的话,在重新平衡的情况下不要移动任务(因此不要移动分区)。 因此,每个消费者在重新平衡元数据中编码其“旧分配”。

基本上,方法#subscription()在每个活动的使用者上调用。 它将发送消费者的订阅信息(即,消费者想要订阅的主题)以及可选的元数据给代理。

第二步,消费者组的负责人将在#assign()计算实际分配。 负责的经纪人在重新平衡的第一阶段收集#subscription()提供的所有信息,并将其交给#assign() 因此,领导者可以获得整个组的全局概览,从而可以确保以同位方式分配分区。

在最后一步中,经纪人从领导者那里收到计算的分配,并将其广播给该组的所有消费者。 这将导致在每个使用者上调用#onAssignment()

这也可能会有所帮助:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM