1、先看一下数学中的异或
异或xor是一个数学运算符。它应用于逻辑运算。异或符号为“^”。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1),
既然相同的对象XOR操作,结果是0,那么有这样一个公式,
A xor B…xor B xor A = 0,其中每一个操作数出现且仅出现两次。
2、storm可靠性的机制
storm中有一个系统级别的组件是acker,acker追踪从spout发射出的流ID(msgId)在每一个task中生成的tuple是否完成。spout或者bolt在处理完tuple后,都会告诉acker我已经处理完了该源tuple(如tupleId=1),如果emit一个tuple的话,同时会告诉acker我发射了一个tuple(如tupleId=2),如果在大量的高并发的消息的情况下,传统的在内存中跟踪执行情况的方式,内存的开销会非常大,甚至内存溢出。acker巧妙的利用了xor的机制,只需要维护一个msgId的标记位即可,处理方法是acker在初始的时候,对每个msgId初始化一个校验值ack-val(为0),在处理完tuple和emit tuple的时候,会先对这两个个值做xor操作,生成的中间值再和acker中的当前校验值ack-val做xor生成新的ack-val值,当所有的tuple都处理完成都得到确认,那么最后的ack-val自然就为0了(因为每一个tuple,从emit到ack都是经过两次xor操作,所以最后的结果为0可以由上面的那个公式可以验证出来)。
见下图:
时间: 2024-10-06 04:16:14