转自:http://www.cnblogs.com/fxjwind/p/3806404.html

之前对这个的理解有些问题,今天用到有仔细梳理了一遍,记录一下

首先开启storm tracker机制的前提是,

1. 在spout emit tuple的时候,要加上第3个参数messageid 
2. 在配置中acker数目至少为1 
3. 在bolt emit的时候,要加上第二个参数anchor tuple,以保持tracker链路

流程,

1. 当tuple具有messageid时,spout会把该tuple加到pending list里面 
   并发消息给acker,通知acker开始tracker这条tuple

2. 然后再后续的bolt的处理逻辑中,你必须显式的ack或fail所有处理的tuple 
   如果这条tuple在整个DAG图上都成功执行了,那么acker会发现该tuple的track异或值为0 
   于是acker会发ack_message给spout 
   当然如果在DAG图上任意一个节点bolt上fail,那么acker会认为该tuple fail 
   于是acker会发fail_message给spout

3. 当spout收到ack或fail message如何处理, 
    首先是从pending list里面删掉这条tuple,因为无论ack或fail,只要得到结果,这条tuple就没有继续被cache的必要了 
    然后做的事是调用spout.ack或spout.fail 
    所以系统默认是不会做任何事的,甚至是fail后的重发,你也需要在fail里面自己实现 
    如何实现后面看

4. 如果一条tuple没有被ack或fail,最终是会超时的 
    Spout会根据system tick去rotate pending list,对于每个过时的tuple,都调用spout.fail

下面的问题就是如何做fail重发,

这个必须用户通过自己处理fail来做,系统是不会自己做的,

public void fail(Object msgId)

看看系统提供的接口,只有msgId这个参数,这里的设计不合理,其实在系统里是有cache整个msg的,只给用户一个messageid,用户如何取得原来的msg

貌似需要自己cache,然后用这个msgId去查询,太坑爹了

阿里自己的Jstorm会提供

public interface IFailValueSpout { void fail(Object msgId, List<object>values); }

这样更合理一些, 可以直接取得系统cache的msg values

Storm ack和fail机制再论的更多相关文章

  1. Storm Ack框架笔记

    Storm利用Acker Bolt节点跟踪消息,当Spout发送出去的消息以及这些消息所衍生出来的消息均被处理后,Spout将受到对应于该消息的Ack.实现要点: 1.Storm中每条发送出去的消息都 ...

  2. Storm消息可靠处理机制

    在很多应用场景中,分布式系统的可靠性保障尤其重要.比如电商平台中,客户的购买请求需要可靠处理,不能因为节点故障等原因丢失请求:比如告警系统中,产生的核心告警必须及时完整的知会监控人员,不能因为网络故障 ...

  3. Storm内部的消息传递机制

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 一个Storm拓扑,就是一个复杂的多阶段的流式计算.Storm中的组件 ...

  4. Storm编程入门API系列之Storm的可靠性的ACK消息确认机制

    概念,见博客 Storm概念学习系列之storm的可靠性  什么业务场景需要storm可靠性的ACK确认机制? 答:想要保住数据不丢,或者保住数据总是被处理.即若没被处理的,得让我们知道. publi ...

  5. Storm Ack容错机制

  6. Storm的acker确认机制

    Storm的acker消息确认机制... ack/fail消息确认机制(确保一个tuple被完全处理) 在spout中发射tuple的时候需要同时发送messageid,这样才相当于开启了消息确认机制 ...

  7. 【原】Storm 守护线程容错机制

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  8. 大数据处理框架之Strom: Storm拓扑的并行机制和通信机制

    一.并行机制 Storm的并行度 ,通过提高并行度可以提高storm程序的计算能力. 1.组件关系:Supervisor node物理节点,可以运行1到多个worker,不能超过supervisor. ...

  9. Storm程序的并发机制(重点掌握)

    概念 Workers (JVMs): 在一个物理节点上可以运行一个或多个独立的JVM 进程.一个Topology可以包含一个或多个worker(并行的跑在不同的物理机上), 所以worker proc ...

随机推荐

  1. java中你确定用对单例了吗?

    作为程序员这样的特殊物种来说,都掌握了一种特殊能力就是编程思想,逻辑比較慎重,可是有时候总会忽略到一些细节,比方我,一直以来总认为Singleton是设计模式里最简单的,不用太在意,然而就是由于这样的 ...

  2. MySQL数据分组GROUP BY 和HAVING

    对于分组的理解,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作. 举例如下:在产品表中,检索每一个供应商提供的商品的数量. mysql> SELEC ...

  3. ISE约束文件*.ucf的写法

    之前一直相不明白,为什么从官网下载的AC97的IP不能跑起来,整个IP就像空壳一样,bit_clk输进去,没有任何信号输出来.从IP的RTL来看,即使是IP不连到CPU的BUS上,只要是综合进FPGA ...

  4. C#compiler

    http://www.cnblogs.com/Ninputer/archive/2011/06/12/2078671.html Compilers - Managed Profile-Guided O ...

  5. Very very important SQL Server article

    https://support.microsoft.com/en-us/kb/2964518

  6. PairRDD中算子foldByKey图解

    foldByKey 函数原型: def foldByKey(zeroValue: V)(func: (V, V) => V): RDD[(K, V)] def foldByKey(zeroVal ...

  7. asp.net mvc 5 在没有外网win2008R2服务器部署方法

    我在本地用最新的.net 4.5和asp.net mvc 5框架做了一个小应用.本地都测试打包成功. 现在要放到服务器上,这个应用只是内网用.服务器不允许连接外网.看到www.asp.net 没有mv ...

  8. ehcache OR Memcache

    ehcache是纯java编写的,通信是通过RMI方式,适用于基于java技术的项目.memcached服务器端是c编写的,客户端有多个语言的实现,如c,php(淘宝,sina等各大门户网站),pyt ...

  9. java 日期获取时间戳

    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");            String dateS ...

  10. Qt学习之路3---Qt中的坐标系统

    -Qt使用统一的坐标系统定位窗口部件和位置大小 -Qt部件类提供成员函数在坐标系统中进行定位 -QWidget类提供了窗口部件所需的坐标系统成员函数 代码测试 #include "widge ...