Apache Storm:当没有可用的螺栓来使用元组时,元组会发生什么?

Apache Storm: what happens to a tuple when no bolts are available to consume it?

如果它链接到另一个螺栓,但下一个螺栓的实例暂时不可用。它会徘徊多久?无限期?足够长了?

如果有很多元组在等待,那会怎么样呢,因为下一个可用螺栓有一条线或队列。他们会合并吗?如果备份太多会发生坏事吗?

有一个反序列化队列用于缓冲即将到来的元组,如果它挂起的时间足够长,队列将满,如果不使用ack函数确保它会被重新发送,元组将丢失.

  1. 默认情况下,元组将在发出后 30 秒后超时;您可以更改此值,但除非您知道自己在做什么,否则不要这样做 (topology.message.timeout.secs)
  2. 如果 spout 正在从可靠的数据源(例如 kafka)读取,失败和超时的元组将由 spout 重放;这是,风暴有guaranteed message processing。如果你正在编写自己的 spout,你可能想深入研究这个。
  3. 当元组在 spout 上失败但在 bolts 上失败时,您可以查看在风暴 UI 上是否有超时元组。
  4. 您不希望元组在您的拓扑结构中超时(例如,kafka 因不按顺序读取而导致性能下降)。您应该调整拓扑过程元组的容量(即,通过更改执行程序的数量来调整 bolt 并行度)并将参数 topology.max.spout.pending 设置为合理的保守值。
  5. 增加 topology.message.timeout.secs 参数不是真正的解决方案,因为如果拓扑容量不够,元组迟早会开始失败。
  6. topology.max.spout.pending 是可以等待的最大元组数。只要未完全处理的元组数量小于给定值,spout 就会发出更多元组。请注意,参数 topology.max.spout.pending 是每个喷口(每个喷口都有其内部计数器并跟踪未完全处理的元组)。

如果元组在超时之前没有被消耗,Storm 只会丢弃它们。 (默认为 30 秒)

之后,Storm 调用 Spout 的 fail(Object msgId) 方法。如果你想重播失败的元组,你应该实现这个功能。您需要将元组保存在内存或其他可靠的存储系统(例如 Kafka)中以重放它们。

如果您不实现 fail(Object msgId) 方法,Storm 只会丢弃它们。

参考:https://storm.apache.org/documentation/Guaranteeing-message-processing.html