去掉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. 【转】关于 mate viewport属性的具体说明!

    什么是Viewport 手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"(viewport)比屏幕宽,这样就不用把每个网页 ...

  2. BW知识问答锦集2

    PM面试分为BW.BO两部分,根据顾问的简历和应聘的岗位所侧重的问题不同. BW包括基础知识.增量.增强.LO抽取.数据源. BO包括 CR.CR.WEBI.UNI. 一. 基础知识 技术面试 1. ...

  3. LinkedBlockingQueueE(示例,出错代码)

    java.util.concurrent 类 LinkedBlockingQueue<E> java.lang.Object java.util.AbstractCollection< ...

  4. Connection broken for id 62, my id = 70, error =

    启动费zokeeper失败,报错如下:Connection broken for id 62, my id = 70, error = 原因是因为zoo.cfg中server.id不正确. serve ...

  5. java 反编译

    JavaDecompiler http://jd.benow.ca/jd-eclipse/update/

  6. ORM框架通过映射(反射)获取数据库的数据

    ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中.只要提供了持久化类与表的映射关系,ORM ...

  7. Python正则化学习

  8. RDLC隔行变色的实现

    在RDLC设计页面设置行属性中的Background为: =IIF((RowNumber(Nothing)) Mod 2 =1,"Transparent","#F6FAF ...

  9. ios 常用字符串的操作

    //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response encoding:NSUTF8S ...

  10. 《开源安全运维平台:OSSIM最佳实践》内容简介

    <开源安全运维平台:OSSIM最佳实践 > 李晨光 著 清华大学出版社出版 内 容 简 介在传统的异构网络环境中,运维人员往往利用各种复杂的监管工具来管理网络,由于缺乏一种集成安全运维平台 ...