风暴(具有多个工作节点)如何在从卡夫卡主题读取时保证消息处理

How does storm (with multiple worker nodes) guarantee message processing while reading from a kafka topic

我有一个风暴设置,它从 kafka 主题中获取消息并处理并保存它们。 我想了解storm在这种情况下如何保证消息处理

考虑以下场景: 我为一个风暴集群配置了多个主管+工人。 KafkaSpout 正在从主题中读取消息,然后传递一个螺栓。 Bolt 在完成时确认,Spout 向前移动到下一条消息。

我有 2 位主管 运行 - 每一位都是 运行 3 名工人。 据我了解-每个主管的每个工作人员都能够处理一条消息。

因此,在任何给定时间,Storm 集群中都会并行处理 6 条消息。 如果第二条消息由于工作人员关闭或主管关闭而失败怎么办。 动物园管理员已经指向消费者组的 7 消息。 在这种情况下,第二条消息将如何处理?

估计是理解有误。以下声明似乎是错误的:

  • 螺栓在完成时确认,喷口向前移动到下一条消息。
  • 在任何给定时间,6 条消息正在风暴集群中并行处理

=> 一个 spout 不是在等待 acks;无论螺栓的处理速度如何,它都会以最大速度再次获取元组 over-and-over——只要 Kafka 中有新消息可用。 (或者您是否通过 max.spout.pending 限制了飞行中的元组数量?)。因此,许多消息是并行处理的(即使只有 #executors 被赋予 UDF——许多其他消息被缓冲在内部 Storm 队列中)。

据我所知(但我不是 100% 确定),KafkaSpout "orders" 传入的 ack 并且只有在所有连续的 ack 都可用时才移动偏移量——即消息 7如果消息 6 的 Storm ack 还不存在,则不会向 Kafka 确认。因此,如果失败,KafkaSpout 可以 re-emit 消息 6。 Re-call Storm 不提供任何顺序保证。