概率性出错,也就是说在极小的概率下,即使不按上面的确认流程来走,异或链的结果也可能出现0.但这个概率极小,小到什么程度呢?
用官方的话说就是,如果每秒发送1万个ack消息,50,000,000年时才可能发生这种情况。
如果ackVal不为0,说明tuple-tree或DAG没有完成。如果长时间不为0,通过超时,可以触发一个超时回调,在这个回调中调用spout的fail方法,来进行重放。
如此,就保证了消息处理不会漏掉,但可能会重复。
结语以上,就是storm保证消息至少处理一次的语义的机制 。