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



Storm 提供的性能调优文档指出,与简单地扩展工作线程相比,扩展多个并行拓扑可以产生更好的性能。

我试图将这一理论与缩放工人进行基准测试。

但是,使用 1.2.1 版时,风暴 Kafka 喷口的行为不像我在多个不同拓扑中预期的那样。

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

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

如果有人能解释一下,我将不胜感激

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

喷口的默认行为是使用KafkaConsumer.assignAPI 将主题的所有分区分配给拓扑中的工作线程。这就是您所看到的行为。使用此行为,不应在拓扑之间共享组 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,将始终有一个本地螺栓要发送到,因此您不必通过网络发送给另一个工作人员。

最新更新