apache-kafka - 按键加入多个Kafka主题

标签 apache-kafka kafka-consumer-api

如何编写一个以可扩展方式加入多个 Kafka 主题的消费者?

我有一个主题用一个键发布事件,第二个主题用相同的键发布与第一个主题的子集相关的其他事件。我想编写一个订阅两个主题的消费者,并为出现在两个主题中的子集执行一些额外的操作。

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

理想情况下,我需要将主题联系在一起,以便它们以相同的方式进行分区,并且分区会同步分配给消费者。我怎样才能做到这一点?

我知道 Kafka Streams 将主题连接在一起,以便将 key 分配给相同的节点。他们是怎么做到的呢?附言我无法使用 Kafka Streams,因为我使用的是 Python。

最佳答案

太糟糕了,您使用的是 Python——Kafka Streams 将是一个完美的选择 :)

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

我希望 Python 消费者允许您通过配置参数 partition.assignment.strategy 指定自定义分区分配器.

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

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

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

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

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

这也可能有帮助:

  • https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Architecture
  • http://docs.confluent.io/current/streams/architecture.html
  • 关于apache-kafka - 按键加入多个Kafka主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43027286/

    相关文章:

    java - Spring-kafka-test 使用自定义反序列化测试 JSON 消息

    apache-kafka - 如何修复与组协调器相关的 kafka 流问题不可用或无效,将尝试重新发现

    apache-kafka - pulsar和kafka在消费方面有什么区别?

    apache-kafka - 如何强制消费者读取kafka中的特定分区

    hadoop - 来自Flume的Kafka的EOFException

    java - 获取队列中的所有kafka消息并停止在java中流式传输

    java - 如何在支持的QPS的基础上对Kafka Consumer进行节流?

    amazon-ec2 - 卡夫卡 : How to connect kafka-console-consumer to fetch remote broker topic content?

    java - Spring 卡夫卡 : Subscribe to a new Topic Pattern during Runtime

    apache-kafka - 使用 Kafka Streams 测试窗口聚合