Apache storm ApacheStorm:当没有螺栓可以使用元组时,元组会发生什么?

Apache storm ApacheStorm:当没有螺栓可以使用元组时,元组会发生什么?,apache-storm,Apache Storm,如果它链接到另一个螺栓,但下一个螺栓的实例暂时不可用。它能挂多久?无限期地够长了吗 如果有许多元组正在等待,因为有一条线或队列等待下一个可用的螺栓,那又如何呢。他们会合并吗?如果备份的数据太多,会发生不好的事情吗?有一个反序列化队列用于缓冲即将到来的元组,如果它挂起的时间足够长,队列将满,如果您不使用ack函数确保它将被重新发送,元组将丢失。有一个反序列化队列用于缓冲即将到来的元组,如果它挂起的时间足够长,如果不使用ack函数确保重新发送,队列将满,元组将丢失 默认情况下,元组将在发出后30秒超

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


如果有许多元组正在等待,因为有一条线或队列等待下一个可用的螺栓,那又如何呢。他们会合并吗?如果备份的数据太多,会发生不好的事情吗?

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

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

  • 默认情况下,元组将在发出后30秒超时;您可以更改此值,但除非您知道自己在做什么,否则不要这样做(topology.message.timeout.secs)
  • 如果喷口从可靠的数据源(如kafka)读取数据,则喷口将重放失败和超时输出元组;这是暴风雨带来的。如果你是在自作主张,你可能想深入研究一下
  • 您可以查看storm UI上是否有超时元组,此时元组在喷口上失败,但在螺栓上没有失败
  • 您不希望元组在拓扑中超时(例如,kafka会因不读取顺序而受到性能惩罚)。您应该调整拓扑过程元组的容量(即,通过更改执行器的数量来调整螺栓平行度),并将参数topology.max.spout.pending设置为合理的保守值
  • 增加topology.message.timeout.secs参数并不是真正的解决方案,因为很快或很晚,如果拓扑的容量不足,元组将开始失败
  • topology.max.spout.pending是可以等待的最大元组数。只要未完全处理的元组数小于给定值,喷口将发出更多元组。请注意,参数topology.max.spout.pending是per-spout(每个spout都有其内部计数器,并跟踪未完全处理的元组)
  • 默认情况下,元组将在发出后30秒超时;您可以更改此值,但除非您知道自己在做什么,否则不要这样做(topology.message.timeout.secs)
  • 如果喷口从可靠的数据源(如kafka)读取数据,则喷口将重放失败和超时输出元组;这是暴风雨带来的。如果你是在自作主张,你可能想深入研究一下
  • 您可以查看storm UI上是否有超时元组,此时元组在喷口上失败,但在螺栓上没有失败
  • 您不希望元组在拓扑中超时(例如,kafka会因不读取顺序而受到性能惩罚)。您应该调整拓扑过程元组的容量(即,通过更改执行器的数量来调整螺栓平行度),并将参数topology.max.spout.pending设置为合理的保守值
  • 增加topology.message.timeout.secs参数并不是真正的解决方案,因为很快或很晚,如果拓扑的容量不足,元组将开始失败
  • topology.max.spout.pending是可以等待的最大元组数。只要未完全处理的元组数小于给定值,喷口将发出更多元组。请注意,参数topology.max.spout.pending是per-spout(每个spout都有其内部计数器,并跟踪未完全处理的元组)

  • 如果元组直到超时才被使用,Storm就会删除它们。(默认值为30秒)

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

    如果不实现
    fail(Object msgId)
    方法,Storm只会删除它们


    参考:

    如果元组直到超时才被使用,Storm只会删除它们。(默认值为30秒)

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

    如果不实现
    fail(Object msgId)
    方法,Storm只会删除它们


    参考资料:

    有关Storm的内部缓冲机制以及使用的队列和线程的更多详细信息,请参见此处:有关Storm的内部缓冲机制以及使用的队列和线程的更多详细信息,请参见此处:这些都是很好的答案,我应该更具体一些。我关心的是拓扑中的元组。我在拓扑的末尾有一个缓慢的插销,它敲打了我的DB。我不想增加它的count/parellism,因为这会使DB变得更加困难,但我绝对不希望元组超时。不确定解决方案是什么。我通过批处理消息来批处理DB调用,但当我将系统置于严重负载下时,元组可能会开始超时。我想我肯定需要在storm ui上注意这一点,并根据需要调整和重新设计。@ab11好的,解决方案是使用topology.max.spout.pending设置。一旦你的最后一个螺栓完全处理一些元组,更多的元组将被释放。谢谢,我一定会调查这一点。顺便问一下,您是否知道Storm UI是否提供了有关非锚定元组超时的信息?我什么也没看到。@ab11你会看到元组在喷口上失败,但在螺栓上没有失败。这些是超时的元组。即使它们未锚定,它们是否会在喷口上失败?我想如果超时