Apache storm Storm如何知道消息是“什么时候”;“完全处理”吗;?

Apache storm Storm如何知道消息是“什么时候”;“完全处理”吗;?,apache-storm,Apache Storm,(还有几个关于超时和maxSpoutPending的问题) 我在Storm文档中看到很多关于消息被完全处理的参考资料。但是,我的卡夫卡普特如何知道消息何时被完全处理 希望它知道我的螺栓连接的方式,所以当我的流中的最后一个螺栓确认一个元组时,喷口知道我的消息何时被处理 否则,我会设想,在超时期限到期后,检查消息的ack ed状态,如果ack/ARCHING XOR指示,则认为消息已被处理。但我希望不是这样 我还有关于maxTuplesPending和超时配置的相关问题 如果我将maxTuplePe

(还有几个关于超时和maxSpoutPending的问题)

我在Storm文档中看到很多关于消息被完全处理的参考资料。但是,我的卡夫卡普特如何知道消息何时被完全处理

希望它知道我的螺栓连接的方式,所以当我的流中的最后一个螺栓确认一个元组时,喷口知道我的消息何时被处理

否则,我会设想,在超时期限到期后,检查消息的ack ed状态,如果ack/ARCHING XOR指示,则认为消息已被处理。但我希望不是这样

我还有关于maxTuplesPending和超时配置的相关问题

如果我将maxTuplePending设置为10k,那么我认为每个喷口实例将继续发出元组,直到该喷口实例跟踪飞行中的10k元组,以及尚未完全处理的10k元组,这是否正确?然后,当当前正在传输的消息被完全处理时,会发出一个新的元组

最后,这是否与超时配置有关?喷口是否以任何方式等待配置的超时发生,然后再发出新消息?或者,只有当消息在处理过程中暂停/缓慢,导致消息因超时而失败时,超时配置才会起作用

更简洁地说(或者希望更清楚地说),将我的超时设置为30分钟是否有影响,除了消息不会失败,除非它们在30分钟内被最后一个螺栓确认?或者是否存在其他影响,例如影响喷口排放率的超时配置

很抱歉提出了这么长的、漫无边际的问题。提前感谢您的回复

*编辑以进一步澄清

我之所以担心这一点,是因为我的消息不一定贯穿整个流

假设我有螺栓A、B、C、D。大多数情况下,消息将从A->B->->->D传递。但我有一些消息故意在螺栓A上停止。A将确认它们,但不会发出它们(由于我的业务逻辑,在这些情况下,我确实希望对消息进行进一步处理)


那么,我的KafkaSpout是否会知道,已确认但未从A发出的消息已被完全处理?因为我希望在螺栓A完成后,喷口会发出另一条信息,在这种情况下

Storm通过UDF代码必须使用的锚定机制在整个拓扑中跟踪元组。这种锚定会产生所谓的元组树,因为树的根是喷口发出的元组,而所有其他节点(以树结构连接)表示从使用输入元组作为锚定的Bolt发出的元组(不过,这只是一个逻辑模型,在Storm中没有以这种方式实现)

例如,喷口发出一个句子元组,该元组由单词中的第一个螺栓拆分,一些单词由第二个螺栓过滤,单词计数由第三个螺栓应用。最后,一个下沉螺栓将结果写入文件。这棵树看起来像这样:

"this is an example sentence" -+-> "this" 
                               +-> "is" 
                               +-> "an"
                               +-> "example" -> "example",1 -> "example",1
                               +-> "sentence" -> "sentence",1 -> "sentence",1
最初的句子由spout发出,由bolt1用作所有发出的令牌的锚,并由bolt1确认。Bolt2过滤掉“this”、“is”和“an”,只确认三个元组。“示例”和“句子”只是转发,用作输出元组的锚点,然后确认。同样的情况也发生在bolt2中,最后一个sink bolt只是确认所有传入的元组

此外,Storm跟踪所有元组的所有ack,即来自中间螺栓和sink螺栓的ack。首先,喷口将输出元组的ID发送给acker任务。每次将一个元组用作锚定时,acker还将获得一条带有锚定元组ID和输出元组ID(由Storm自动生成)的消息。来自bolt的ack也会转到与xor相同的acker任务。如果接收到所有ack(即,对于喷口和所有递归锚定的输出元组而言)(XOR结果将为零),则acker会向喷口发送一条消息,说明元组已被完全处理,并且会发生对
spout.ack(MessageId)
的回叫(即,当元组被完全处理时,回叫会立即完成)。此外,如果acker注册的元组长于超时时间,则acker会定期检查。如果发生这种情况,则应答器将丢弃元组ID,并将元组失败的消息发送给喷口(导致调用
spout.fail(MessageId)

此外,如果此计数超过了
maxTuplesPending
参数,则Spouts会保留正在运行的所有元组的计数,并停止调用
Spout.nextTuple()
。据我所知,参数是全局应用的,也就是说,每个喷口任务的局部计数相加,并将全局计数与参数进行比较(但不确定这在细节上是如何实现的)


因此,
timeout
参数独立于
maxTuplesPending

非常感谢您的详细回答。你能谈谈我在编辑中提到的情景吗。Storm如何知道“已收到所有ACK”。如果我故意在螺栓A之后确认,但不向螺栓B发出元组,消息会超时吗?请看我的示例。元组“this”、“is”和“an”将通过中间螺栓过滤掉,即,仅确认,无输出。这个很好用。如果一个句子中的所有单词都被过滤掉,这棵树就不那么深了,但是最初的句子会被过滤掉。再次感谢。我仍然对风暴如何处理这件事感到困惑。如果螺栓A调用ack并且不发出,Storm如何知道调用Spout.ack(messageId)?我认为只有当一个元组被元组树中的最后一个螺栓确认时,它才会调用Spout.ack(messageId)(它怎么知道在我没有发出的情况下,树没有典型的那么深)。我问这个是因为我被看见了