去掉storm可靠性有三种方式:

1、Config.TOPOLOGY_ACKERS 设置为0;
2、在发送数据时不带上mesage id;
3、将tuple不做anchor发送到下一个节点,因为没有anchor到任何spout的tuple,就算没有成功处理被ack,也不会造成tuple fail
 
通过SpoutCollector, emit方法最后会调用sendMsg方法,其中判断条件为:
boolean needAck = (message_id != null ) && (ackNum > 0);
 
如果设置storm的信息处理不需要可靠性保证,spout的等待队列一直为空,因为无需缓存数据。
保证storm可靠性,需要构建tuple树,如果整个树在规定超时时间内不能没有处理完成,则认为是失败。为保证tuple树的构造:
1、在Spout发送数据时带上messageId(collector.emit(new Values(“test),msgId)),这样,当storm认为该tuple被成功处理,将调用spout的ack方法,并将msgId传给spout
2、在每个bolt处理tuple的时候,因tuple树需要生长,所以在bolt处理完tuple并发送数据的时候,需要通知storm在tuple树添加新的链路,通过anchor即可,anchor链接一个节点时,emit(tuple, new Value(“test”));如果需要同时链接两个节点,通过emit(List<Tupple>, new Value(“test”))
 
因为storm通过内存追踪元组的状态,所以需要保证可靠性时,一定要ack或者fail,不然会耗尽内存, messageId在发射数据时,根据anchors去生成新的messageId
参考 BoltCollector代码:
for (Integer t : out_tasks) {
MessageId msgid = getMessageId(anchors); TupleImplExt tp = new TupleImplExt(topologyContext, values, task_id, out_stream_id, msgid);
tp.setTargetTaskId(t);
taskTransfer.transfer(tp);
}
protected MessageId getMessageId(Collection<Tuple> anchors) {
Map<Long, Long> anchors_to_ids = new HashMap<Long, Long>();
if (anchors != null) {
for (Tuple a : anchors) {
Long edge_id = MessageId.generateId(random);
put_xor(pending_acks, a, edge_id);
for (Long root_id : a.getMessageId().getAnchorsToIds().keySet()) {
put_xor(anchors_to_ids, root_id, edge_id);
}
}
}

 
实现Bolt有两种方式,一种是实现IRichBolt,一种是继承实现IBasicBolt的BasicBolt,在TopologyBuilder中,可以看到在调用setBolt的方法时,对比两种类型的实现方法:
IRichBolt:
public BoltDeclarer setBolt(String id, IRichBolt bolt, Number parallelism_hint) {
validateUnusedId(id);
initCommon(id, bolt, parallelism_hint);
_bolts.put(id, bolt);
return new BoltGetter(id);
}
在该方法中,直接将IRichBolt作为参数传入topologyBuilder中初始化。
IBasicBolt:
 
public BoltDeclarer setBolt(String id, IBasicBolt bolt, Number parallelism_hint) {
return setBolt(id, new BasicBoltExecutor(bolt), parallelism_hint);
}
 
将IBasicBolt包装成BasicBoltExecutor,这个类中的execute方法将会自动ack tuple,这也就是为什么继承BasicBolt会自动ack tuple而无需手动ack:
public void execute(Tuple input) {
_collector.setContext(input);
try {
_bolt.execute(input, _collector);
_collector.getOutputter().ack(input);
} catch (FailedException e) {
if (e instanceof ReportedFailedException) {
_collector.reportError(e);
}
_collector.getOutputter().fail(input);
}
}
 
 
 

Jstorm可靠性分析的更多相关文章

  1. twitter storm源码走读之7 -- trident topology可靠性分析

    欢迎转载,转载请注明出处,徽沪一郎. 本文详细分析TridentTopology的可靠性实现, TridentTopology通过transactional spout与transactional s ...

  2. RabbitMQ消息可靠性分析和应用

    RabbitMQ流程简介(带Exchange) RabbitMQ使用一些机制来保证可靠性,如持久化.消费确认及发布确认等. 先看以下这个图: P为生产者,X为中转站(Exchange),红色部分为消息 ...

  3. RabbitMQ消息可靠性分析

    消息中间件的可靠性是指对消息不丢失的保障程度:而消息中间件的可用性是指无故障运行的时间百分比,通常用几个 9 来衡量.不存在绝对的可靠性只能尽量趋向完美.并且通常可靠性也意味着影响性能和付出更大的成本 ...

  4. RabbitMQ消息可靠性分析 - 简书

    原文:RabbitMQ消息可靠性分析 - 简书 有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就 ...

  5. Netty系列之Netty可靠性分析

      作者 李林锋 发布于 2014年6月19日 | 29 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单   1. 背景 1.1. 宕机的代价 1.1. ...

  6. 【转】Netty系列之Netty可靠性分析

    http://www.infoq.com/cn/articles/netty-reliability 首先,我们要从Netty的主要用途来分析它的可靠性,Netty目前的主流用法有三种: 1) 构建R ...

  7. [转载]RabbitMQ消息可靠性分析

    有很多人问过我这么一类问题:RabbitMQ如何确保消息可靠?很多时候,笔者的回答都是:说来话长的事情何来长话短说.的确,要确保消息可靠不只是单单几句就能够叙述明白的,包括Kafka也是如此.可靠并不 ...

  8. Netty系列之Netty可靠性分析--转载

    原文地址:http://www.infoq.com/cn/articles/netty-reliability 1. 背景 1.1. 宕机的代价 1.1.1. 电信行业 毕马威国际(KPMG Inte ...

  9. 【源码】canal和otter的高可靠性分析

    一般来说,我们对于数据库最主要的要求就是:数据不丢.不管是主从复制,还是使用类似otter+canal这样的数据库同步方案,我们最基本的需求是,在数据不丢失的前提下,尽可能的保证系统的高可用,也就是在 ...

随机推荐

  1. centos 6.4 升级python到版本2.7.12

    注意:需要root权限 查看python版本:python --version 1.下载Python-2.7.12wget https://www.python.org/ftp/python/2.7. ...

  2. 28.zookeeper单机(Standalones模式)和集群搭建笔记

    zookeeper单机(Standalones模式)和集群搭建: 前奏: (1).zookeeper也可以在windows下使用,和linux一样可以单机也可以集群,具体就是解压zookeeper-3 ...

  3. Cocos2d-x 核心概念 - 场景(Scene)

    场景(Scene):构成游戏的界面 场景类的几种: 展示类场景 选项类场景 游戏场景 场景类继承自Node类

  4. 运行Shell脚本的几种方式解析

    1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh, 如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可 2 sh/b ...

  5. AraxisMerge和beyond Compare做git mergetool配置

    打开.gitconfig文件,加入如下代码即可 [diff] external = /Applications/AraxisMerge.app/Contents/Utilities/araxisgit ...

  6. python成长之路【第八篇】:异常处理

    一.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 语法: try: pass except Exc ...

  7. goroutine

    Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干流传甚广的文章,可其中或多或少总有些与事实 ...

  8. Ajax form表单提交

    1. 使用 $("form").serialize() 来获取表单数据 $.ajax({ type: 'post', url: 'your url', data: $(" ...

  9. elk

    http://467754239.blog.51cto.com/4878013/1700828/

  10. C#日常总结

    if (!string.IsNullOrEmpty(userid)) { InitPage(); } IsNullOrEmpty 同时测试String是否为nullNothingnullptrnull ...