(还有一些关于超时和maxSpoutPending的问题)风暴如何知道邮件何时“完全处理”?
我在Storm文档中看到很多关于消息被完全处理的参考文献。但是,我的KafkaSpout如何知道消息何时完全处理?
希望它能认识到我的螺栓连接的方式,所以当我的Stream中的最后一个螺栓夹住一个元组时,喷口知道我的消息何时处理?否则,我会想象在超时时间到期后,检查消息的确认状态,并且如果由确认/锚定XOR指示,则认为它已被处理。但我希望事实并非如此?
我也有关于maxTuplesPending和超时配置的相关问题。
如果我将maxTuplePending设置为10k,那么我是否认为每个spout实例都会继续发射元组,直到spout实例正在跟踪10k元组中的10k个元组,这些元组尚未完全处理?然后当一个正在处理的飞行消息被完全处理时,新的元组被发射出去了吗?
最后,这是否与超时配置有关?喷嘴在发出新消息之前是否以任何方式等待发生配置的超时?或者,如果消息处于停滞/缓慢状态,超时配置才起作用,导致由于超时而失败?
更简洁(或希望更清楚),是否有一个效果来设置我的超时30分钟除非消息不会失败,除非他们在30分钟内被最终的博尔特认可?或者是否还有其他影响,例如影响喷口排放速率的超时配置?
对不起,漫长而漫长的问题。预先感谢任何回应。
*编辑进一步澄清
的原因,这对我来说是一个问题,是因为我的消息并不一定要通过整个流运行。
说我有螺栓A,B,C,D。大多数时间的消息将从A-> B - > - > D传递。但是我有一些信息会故意停在螺栓A上.A会识别它们,但不会发出它们(因为我的业务逻辑,在这种情况下,我希望进一步处理这些信息)。
那么我的KafkaSpout是否知道被Ack发送但未从A发出的消息会被完全处理?因为我希望在螺栓A完成之后马上从喷口发出另一条消息,在这种情况下。
非常感谢您的详细解答。你能解决我在编辑中提到的情况吗?风暴如何知道“所有的贿赂都已收到”。如果我故意在A后插入A,但不要将元组发送到B,那么这个消息是否会超时? – ab11
看看我的例子。元组“this”,“is”和“an”将被一个中间螺栓过滤掉,即只有acked和没有输出。这工作得很好。如果一个句子中的所有单词都会被过滤掉,那么这棵树就不那么深了,但是初始句子对喷口来说会很好。 –
再次感谢。我仍然对Storm如何处理这个问题感到困惑。如果螺栓A调用ack并且不发射,Storm如何知道调用Spout.ack(messageId)?我认为只有当Tuple树中的最后一个螺栓确定了一个元组时,它才会调用Spout.ack(messageId)(它怎么知道在这种情况下,我没有发出这个树,比典型的深)。我问这是因为即使我的拓扑在超时时间内完全处理了它的消息,我也看到了喷口故障,所以我怀疑这些故障来自螺栓A确认但没有发出的消息。 – ab11