storm消息容错机制(ack-fail)

1、介绍

  • 在storm中,可靠的信息处理机制是从spout开始的。
  • 一个提供了可靠的处理机制的spout需要记录他发射出去的tuple,当下游bolt处理tuple或者子tuple失败时spout能够重新发射。
  • Storm通过调用Spout的nextTuple()发送一个tuple。为实现可靠的消息处理,首先要给每个发出的tuple带上唯一的ID,并且将ID作为参数传递给SpoutOutputCollector的emit()方法:collector.emit(new Values("value1","value2"), msgId); messageid就是用来标示唯一的tuple的,而rootid是随机生成的。

给每个tuple指定ID告诉Storm系统,无论处理成功还是失败,spout都要接收tuple树上所有节点返回的通知。如果处理成功,spout的ack()方法将会对编号是msgId的消息应答确认;如果处理失败或者超时,会调用fail()方法。

2、基本实现

Storm 系统中有一组叫做"acker"的特殊的任务,它们负责跟踪DAG(有向无环图)中的每个消息。

acker任务保存了spout id到一对值的映射。第一个值就是spout的任务id,通过这个id,acker就知道消息处理完成时该通知哪个spout任务。第二个值是一个64bit的数字,我们称之为"ack val", 它是树中所有消息的随机id的异或计算结果。

ack val表示了整棵树(tuple树)的的状态,无论这棵树多大,只需要这个固定大小的数字就可以跟踪整棵树。当消息被创建和被应答的时候都会有相同的消息id发送过来做异或。 每当acker发现一棵树的ack val值为0的时候,它就知道这棵树已经被完全处理了。

3、可靠性配置

有三种方法可以去掉消息的可靠性:

将参数Config.TOPOLOGY_ACKERS设置为0,通过此方法,当Spout发送一个消息的时候,它的ack方法将立刻被调用;

Spout发送一个消息时,不指定此消息的messageID。当需要关闭特定消息可靠性的时候,可以使用此方法;

最后,如果你不在意某个消息派生出来的子孙消息的可靠性,则此消息派生出来的子消息在发送时不要做锚定,即在emit方法中不指定输入消息。因为这些子孙消息没有被锚定在任何tuple tree中,因此他们的失败不会引起任何spout重新发送消息。

最新文章

  1. JAVA中使用DOM解析XML文件
  2. android platform下载地址
  3. Solr4.3之拼写检查Spellcheck功能
  4. fork&exec
  5. MySQL Replication, 主从和双主配置
  6. 在浏览器运行 java applet时遇到的一些问题及其解决方法
  7. C/C++语言学习——内存分配管理
  8. Bigcommerce:安装的出错解决方案
  9. Network view
  10. DRAM Memory Rank知识
  11. 学习jQuery必须知道的几种常用方法
  12. 逆向工程-真码保存在系统文件破解QQ游戏对对碰助手
  13. 常见IO模型
  14. echarts地图散点高亮弹框制作
  15. openstack学习-Horizon安装(八)
  16. 微信小游戏 50M那部分的缓存机制的使用
  17. 《GPU高性能编程CUDA实战》附录四 其他头文件
  18. pdf转word在线转换器
  19. Jquery实现可拖动进度条demo
  20. jQuery中绑定事件的几种方法

热门文章

  1. 一个简单的"RPC框架"代码分析
  2. float导致出现大面积空白
  3. linux查看防火墙的状态以及开启关闭
  4. 零基础http代理http完美代理访问
  5. Keil MDK忽略警告:文件末尾空白行警告
  6. AF_INET域与AF_UNIX域socket通信原理对比【转】
  7. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
  8. zabbix系列(七)zabbix3.0添加对tcp连接数及状态的监控
  9. nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
  10. (转)eclipse 创建maven web项目