在一个流系统中,事件流通过串联的处理器,直至最终结果产生,每个输入事件产生一系列图谱式派生的子事件,为了确保可靠性,有必要在失败时确保整个图谱中事件全部被成功处理,然后才能重新启动处理。
下面是Twitter的 Storm如何跟踪事件的过程处理:
1.所有从源点,也就是处理图中第一个数据节点出发的事件,都有一个随机ID,对于每个源点,框架将维护一对数据[event ID -> signature], 对于每个初始事件,signature签名是由event ID初始的.
2.下游节点基于接受到的初始事件可能产生更多事件,每个事件都带有初始事件的那个随机 ID
3. 如果事件被下一个节点成功接受和处理,这个节点将更新相应初始事件的签名,通过异或操作,将输入事件的ID和所有基于该输入事件产生的所有事件的ID进行异或操作,如下图,事件 01111 产生子事件 01100, 10010, 和 00010, 这样事件 01111的签名是11100 (= 01111 (initial value) xor 01111 xor 01100 xor 10010 xor 00010).
4.一个事件可能基于一个或多个输入事件产生的,因此它带有几个初始化事件信息,带有多个初始化事件的ID.
5.只要签名将变成0,事件成功被处理,当图谱中最后一个节点事件被成功处理,也就是再也没有事件发往下游, 框架自己将发出一个commit信息到源点。图中三部分
6.框架将定期遍历初始事件的表,寻找旧的未被commit的事件(也就是签名不为0的事件),这些事件被认为是失败的,框架请求源点再重新播放处理它们。
7.注意的是签名的更新顺序并不是很重要,因为XOR异或操作本身的可替代性。....
8. 上面的算法并不是严格的可靠,当签名可能因为不幸的ID结合突然变为0,64位的ID足够降低这种错误的发生...
待续..
