从单个Kafka主题消耗多个风暴拓扑

时间:2019-12-12 10:12:49

标签: apache-kafka apache-storm

Storm状态提供的性能调整文档提供了绝对最佳的性能扩展多个并行拓扑,可以产生比简单扩展工作人员更好的性能。

我正在尝试将这一理论与规模化工人进行比较。

但是,使用版本1.2.1时,卡夫卡风暴喷口的运行方式却不像我在多个不同拓扑结构中所期望的那样。

在所有拓扑中为单个主题设置kafka spout使用者的公共client.id和group.id,每个拓扑仍订阅所有可用分区和重复的元组,并在重新提交已提交的元组时引发错误。

我对这种行为感到惊讶,因为我认为消费者API将支持这种相当简单的用例。

如果有人能解释我会很感激

  1. 使用kafka喷口的这种行为的实现逻辑是什么?
  2. 解决这个问题有什么办法吗?

1 个答案:

答案 0 :(得分:0)

喷口的默认行为是使用KafkaConsumer.assign API将主题的所有分区分配给拓扑中的工作程序。这是您看到的行为。由于这种行为,您不应该在拓扑之间共享组ID。

如果您想更好地控制将哪些分区分配给哪些工作器或拓扑,可以实现TopicFilter接口,并将其传递给KafkaSpoutConfig。这应该可以让您做所需的事情。

关于更快地运行多个拓扑,我假设您从文档In multiworker mode, messages often cross worker process boundaries. For performance sensitive cases, if it is possible to configure a topology to run as many single-worker instances [...] it may yield significantly better throughput and latency中引用本节。此处的目的是避免在工作进程之间发送消息,而是将每个分区的内部处理保持在一个工作进程内部。如果您想避免运行许多拓扑,可以考虑自定义Storm调度程序以使其分配例如每个工人中管道的完整副本。这样,如果您使用localOrShuffleGrouping,将始终有本地螺栓发送给您,因此您不必通过网络传递给其他工作人员。