xor算法在storm可靠性中的应用

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

xor算法在storm可靠性中的应用的相关文章

【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?

如何使用异或(XOR)运算找到数组中缺失的数? 今天给大家分享一篇关于使用XOR(异或)运算找到数组中缺失的数的问题. 在一次Javascript面试中,有这么一个问题: 假设有一个由0到99(包含99)的整数组成的长度为100的数组.从数组中随机移除一个元素,得到了一个长度为99的数组,那么请问如何找到所取出的数字是几?(假设数组未排序). 大多数面试者都是按照如下方法解答的: 首先对数组进行排序,然后遍历一遍数组,检查数组中相邻两项的的差,如果差大于1,则找到缺失的数字. 这是一种有效的算法

非阻塞算法在并发容器中的实现【转】

转自:https://www.ibm.com/developerworks/cn/java/j-lo-concurrent/ 非阻塞算法在 Java 中的应用越来越广泛 , ConcurrentLinkedQueue 是 java. concurrent 包中基于非阻塞算法实现的并发容器的典范.通过本文,您将了解非阻塞算法的工作原理及其在 ConcurrentLinkedQueue 中的具体实现机制. 简介 非阻塞算法在更细粒度的层面协调争用,它比传统的锁有更高的并发性.随着非阻塞算法在 Jav

x264代码剖析(十五):核心算法之宏块编码中的变换编码

x264代码剖析(十五):核心算法之宏块编码中的变换编码 为了进一步节省图像的传输码率,需要对图像进行压缩,通常采用变换编码及量化来消除图像中的相关性以减少图像编码的动态范围.本文主要介绍变换编码的相关内容,并给出x264中变换编码的代码分析. 1.变换编码 变换编码将图像时域信号变换成频域信号,在频域中图像信号能量大部分集中在低频区域,相对时域信号,码率有较大的下降. H.264对图像或预测残差采用4×4整数离散余弦变换技术,避免了以往标准中使用的通用8×8离散余弦变换逆变换经常出现的失配问题

C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)

总所周知,C++ STL中有个头文件,名为algorithm,即算法的意思. The header<algorithm>defines a collection of functions especially designed to be used on ranges of elements. 所以,要八一八这个头文件中C++11新增的几个算法,今天主要描述的几个算法不改变容器中元素的顺序. 这里还要啰嗦一句,使用stl算法时,如果与lambda表达式组合使用,那么代码会更加简洁. find_

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在内外参都不固定的情况下,计算最佳内外参.OpenCV中对应的函数为calibrateCamera2. (3)双目标定中,在左右相机的内外参及左右相机的位姿都不固定的情况下,计算最佳的左右相机的内外参及最佳的左右相机的位姿矩阵.OpenCV中对应的函数为stereoCalibrate. 本文文阅读前提

PHP 3DES 算法,与Java中的DESede兼容

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <?php class Crypt3Des {     public $key = &qu

算法7-6:图论中的难题

二部图 难度:★★ 二分图是图论中的一种特殊模型,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图. 下图是一个二分图的例子,红点之间不会相邻,白点之间不会相邻. 判断图中是否存在环 难度:★★ 通过深搜就可以解决了. 欧拉环 难度:★★ 从一个顶点出发,所有的边都只经过一次,最后回到起点.判断一张图中是否存在这样的路径. 哈密尔顿环 难度:★★★★ 从一个顶点出发,所有的顶点都经过一次,最后回到起点.判断一张图中是否存在这样的路径. 这个是一个经典的NP完全问题,目前

DeepLearning tutorial(2)机器学习算法在训练过程中保存参数

我是小白,说的不是很好,请原谅 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43169019 参考:pickle - Python object serialization.DeepLearning Getting started 一.python读取"***.pkl.gz"文件 用到Python里的gzip以及cPickle模块,简单的使用代码如下,如果想详细了解可以参考上面给出的链接. [p