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

时间:2015-09-01 02:36:31

标签: apache-storm

如果它与另一个螺栓相连,但下一个螺栓的实例暂时不可用。它会持续多久?无限期?够长了?

如果有多个元组在等待,那么下一个可用的螺栓有一条线或队列。他们会合并吗?如果太多人得到备份会有不好的事情发生吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

如果您没有实施fail(Object msgId)方法,Storm就会删除它们。

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