使用调试模式时,我发现了以下内容。 TOPOLOGY_MESSAGE_TIMEOUT_SECS设置为90s。从发送到收到失败消息,Spout不应超过90s,但是为什么日志中有135s?
2019-05-14 16:53:12.037 o.a.s.s.CheckpointSpout Thread-13-$checkpointspout-executor[1 1] [DEBUG] Current state CheckPointState{txid=7, state=COMMITTING}, emitting txid 7, action COMMIT
2019-05-14 16:55:27.097 o.a.s.s.CheckpointSpout Thread-13-$checkpointspout-executor[1 1] [DEBUG] Got fail with msgid 7
2019-05-14 16:55:27.097 o.a.s.s.CheckpointSpout Thread-13-$checkpointspout-executor[1 1] [DEBUG] Checkpoint failed, will trigger recovery
答案 0 :(得分:1)
消息超时不是硬性限制。消息可能需要多达2倍的超时时间才能真正超时。这是由于性能优化,我们有两个存储桶,而不是每秒使元组超时。创建元组后,将其放入存储区1。一旦超时,我们将所有存储区1元组旋转到存储区2中,并使所有存储区2元组失效。这样就可以保证元组至少可以完成整个消息超时,同时计算起来也很便宜。