Storm 可靠的与不可靠的消息

实时分析系统Storm详解 Storm 是一个分布式的,可靠的,容错的数据流处理系统。它会把工作任务委托给不同类型的组件,每个组件负责处理一项简单特定的任务。Storm 集群的输入流由一个被称作 spout 的组件管理,spout 把数据传递给 bolt, bolt 要么把数据保存到某种存储器,要么把数据传递给其它的 bolt。你可以想象一下,一个 Storm 集群就是在一连串的 bolt 之间转换 spout 传过来的数据。这里用一个简单的例子来说明这个概念。昨晚我在新闻节目里看到主持人在谈论政治人物和他们对于各种政治话题的立场。 阅读详情
概述

设计拓扑时,一件很重要的事情就是要考虑消息的可靠性。如果消息不能被处理而丢失是很严重的问题,我们需要决定如何处理丢失的消息,如何与拓扑作为一个整体处理。例如,处理银行存款的时候,事物一致性是很重要的,不能失去任何消息,任何消息都要被处理。在Storm中,根据每个拓扑的需要,保证消息可靠性,这涉及一个平衡:一个可靠的拓扑必须处理丢失的消息,这就需要更多的资源;一个不可靠的拓扑可能会丢失一些消息,但不占用资源。不管你选择哪一种可靠性策略,Storm都可以提供工具来实现它。

实现

管理Spout的可靠性,可以在发射元组的时候,在元组里面包含一个消息ID,如下:

collector.emit(new Values(...),tupleID);  

当元组处理 成功时 调用 ack() 方法,当元组处理 失败时 调用 fail() 方法。当元组被所有的目标Bolt和所有的锚定Bolt所处理时,认为元组处理成功。当如下情况发生时,元组处理会失败:

  1. collector.fail(tuple)方法被目标Spout调用。
  2. 处理时间超过配置的超时时间。

我们以银行业务来深入了解,消息的可靠性,有一下要求:

  1. 如果一个事物失败,则重发消息。
  2. 如果事物失败了多次,则终止拓扑。

在拓扑中,有1个Spout和1个Bolt。Spout会发送100个随机的事物ID,Bolt在接收一个元组时有80%的可能性会失败。Bolt使用Map来发射事物消息元组,因此很容易对消息进行重发。

Spout的主要成员变量定义如下:

    //最大失败次数  
    private static final Integer MAX_FAILS = 2;  
    //全部的消息Map  
    private Map<Integer, String> messages;  
    //消息的失败次数计数Map  
    private Map<Integer, Integer> transactionFailureCount;  
    //发送的消息Map  
    private Map<Integer, String> toSend;  
    //SpoutOutputCollector对象  
    private SpoutOutputCollector collector;  

在open()方法中进行一系列的初始化:

    @Override  
    public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {  


        //创建随机数生成器  
        Random random = new Random();  
        //出事化相关对象  
        messages = new HashMap<Integer, String>();  
        toSend = new HashMap<Integer, String>();  
        transactionFailureCount = new HashMap<Integer, Integer>();  

        //遍历100此,模拟100条消息  
        for (int i=100; i<100; i++){  
            //添加消息到"全部的消息Map集合"  
            messages.put(i, "transaction_" + random.nextInt());  
            //每条消息的错误次数都置为0  
            transactionFailureCount.put(i, 0);  
        }  

        //把"全部的消息Map集合" 添加到"发送的消息Map集合"  
        toSend.putAll(messages);  

        //初始化发射器  
        this.collector = collector;  
    }  

nextTuple()方法定义如下:

    @Override  
    public void nextTuple() {  

        if (!toSend.isEmpty()) {// 如果发射消息的Map集合不为空  
            // 遍历发射消息的Map集合进行消息的发射  
            for (Map.Entry<Integer, String> transactionEntry : toSend.entrySet()) {  
                // 获取消息ID  
                Integer transactionId = transactionEntry.getKey();  
                // 获取消息内容  
                String transactionMessage = transactionEntry.getValue();  
                // 把消息发射出去(带上ID号)  
                collector.emit(new Values(transactionMessage), transactionId);  
            }  
            // 把发射消息的Map集合清空,以便存储要重新发射的消息  
            toSend.clear();  

            //休眠1秒钟  
            Utils.sleep(1000);  
        }  
    }  

如果toSend集合不为空的话,就说明存在消息等待发送,则把每个消息的ID和消息的内容作为一个元组发送,然后清空toSend集合(方便存储需要重发的消息),这里要注意的是在nextTuple中调用Map的clear()方法是安全的,因为nextTuple()、fail()、ack()方法是修改Map的方法,他们都运行在相同的线程中。

messages和failCounterMessages两个Map用来跟踪等待发送的事物消息以及每笔交易已经失败的次数。

ack()方法表示操作成功时的相应,这里通过msgId来删除每个列表中的事物消息:

    @Override  
    public void ack(Object msgId) {  

        //如果消息发送成功,则从"所有消息Map集合"中删除一条消息  
        messages.remove(msgId);  
        //错误计数Map也要相应的删除一条记录  
        transactionFailureCount.remove(msgId);  
    }  

fail()方法决定是否重发一个事物消息,或者事物消息已经失败了太多次而最终是完全失败(不能被重发),如果在拓扑中使用广播分组,那么任何Bolt实例失败,Spout的fail()方法都会被调用。

    @Override  
    public void fail(Object msgId) {  

        //获取事物ID  
        Integer transactionId = (Integer) msgId;  
        //通过事物ID获取事物失败的次数  
        Integer failures = transactionFailureCount.get(transactionId) + 1;  

        //判断事物失败的次数是否大于最大允许失败次数  
        if (failures >= MAX_FAILS){  
            //如果失败次数大于或者等于最大允许失败次数,终止拓扑并抛出异常  
            throw new RuntimeException("该事物失败过多,已经不能再被发送");  
        } else {  
            //如果失败的次数小于最大允许失败的次数,我们保存失败次数,并把该消息放入"发送消息集合Map"进行重新发送  
            transactionFailureCount.put(transactionId, failures);  
            //放入toSend集合从新发送  
            toSend.put(transactionId, messages.get(transactionId));  
        }  
    }  

fail()方法会检查已经失败的事物的次数。如果一个事物失败了很多次,超过最大允许失败次数,会抛出一个RuntimeException异常并终止运行中的Worker进程。否则,保存失败技术,把事物消息放到toSend集合进行重发。

Storm节点不维护状态。如果在内存中存储消息,并且节点又宕机了,将会失去所有的信息。所以,Storm节点的状态由外部的Zookeeper集群所维护。Storm是一种快速失败的系统。如果抛出一个异常,拓扑将会失败。但Storm会在一个一致性状态中重启进程,然后正常恢复进程的执行。

WPS中VBA支持库安装全攻略:从报错到一键解决 VBA作为Office生态中广泛使用的宏语言,是办公自动化的重要基础。WPS表格虽然兼容Excel文件格式,但出于技术路线与授权原因,默认并未集成完整的VBA引擎与开发环境,导致用户打开含宏文件时频繁遇到“找不到工程或库”“未找到VBA支持库”等报错。理解VBA支持库包含引擎与IDE两层结构,并掌握系统位数、版本匹配、安全软件拦截等前置条件,是成功部署的关键。通过可靠的安装源与规范流程完成配置后,即可实现在WPS中运行Excel宏、批量处理数据、自定义函数等自动化场景,显著提升报表处理效率。本文围绕WPS中 阅读详情

相关推荐

YOLOv8验证的命令以及计算coco指标

好久不看代码,都不知道怎么验证的了,来记录一下。1、计算coco指标。

毕竟是Shy哥 1481

Storm可靠的Bolt与不可靠的Bolt

Storm可以保证每个Spout发射的消息会被所有的Bolt完全处理。这是设计时要考虑的因素,这意味着程序员将决定Bolt是否需要保证消息处理。 可靠Bolt的execute()方法如下: @Override public void execute(Tuple input) { String sentence = input.getString(0); for (String wor

lavimer 3556

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2435

Storm——可靠的与不可靠的Bolt

Storm可以保证每个Spout发射的消息会被所有的Bolt完全处理,这也就意味着程序员可以决定Bolt是否需要保证消息处理。 拓扑是一个消息(Tuple)沿着一个或多个分支的树节点,每个节点将ack(tuple)或者fail(tuple),这样当消息失败时Storm就会知道,并通知Spout重发消息。因为一个Storm拓扑运行在一个高度并发的环境中,跟踪原始Spout示例的最好办法是在

window24的专栏 1484

Halcon实战:5分钟搞定灰度图转热力图(附完整代码)

本文提供了一份Halcon实战指南,详细讲解如何在5分钟内将灰度图转换为直观的热力图。通过核心代码演示了利用HSV颜色模型进行色彩映射的原理与步骤,包括图像归一化、通道构建与空间转换,并附赠了深度图可视化等进阶应用技巧,帮助工程师快速提升图像分析效果。

weixin_29240343的博客 282

1.用Python写了一个进销存管理的软件~需求分析&界面设计&数据库设计&技术路线选择~

前端也打算用Python来写,查了很多的python库,大家比较推荐的是wxpython和QPython,之前接触过一点点的QT,确实非常强大,但是库比较重量级,自己写的这个东西明显配不上QT,又详细调研了一下wxpython,就是它了!

pepper_lihui的专栏 4321

storm 可靠性和非可靠性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34168700的博客 158

NPU、CPU和GPU

NPU、CPU和GPU是三种不同类型的处理器,它们各自有不同的设计特点和应用场景。NPU(Neural Processing Unit,神经网络处理单元)是一种专门为加速神经网络计算而设计的处理器。

m0_60697583的博客 1755

Storm实战常见问题及解决方案

该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实战中遇到的一些问题,及其对应解决办法。     相关描述 ²  其他相关文档请参考新浪博客http://blo

xiaolang85的专栏 6万+

现代软件开发技术 | 第1章:Spring基础

Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

知识库搭建ing 455

两组相机(或三维点)对齐方法介绍及实现代码(求解相似变换,包含旋转R、平移t、尺度s)

  这个变换用于将生成的稀疏重建场景对齐到真值上。由于SfM(Structure from Motion,运动恢复结构)求解的结果是尺度未定的,所以重建场景与真值之间不仅会相差一个旋转与平移,还会存在尺度缩放。待求解的问题可以描述为:已知一组相机(个数为m)的位姿真值Rgt、tgt和预测位姿Rpred、tpred,现要将预测值对齐到真值上。它们之间会相差一个相似变换Msimilarity,包括尺度s、旋转量R、平移量t,可以根据如下步骤进行求解:    1 求解旋转R   首先计算所有m个相机的位姿差异总和

zeeq的博客 3926

Storm编程

相关网站 http://ifeve.com/getting-started-with-storm-3/

one-programmer 403

实操微信支付,适合第一次接通微信支付的同学

我的实际操作命令如下:就会生成图3中多出来的file文件夹,/Users/camel/cert/xxxxxx_cert/file/wechatpay_5A4xxxxxxxxxx9.pem,wechatpay_xxxxx5A4849E9.pem就是微信支付平台证书,也是程序真正需要的。•注意:我的操作说明,我是把下载好的 CertificateDownloader.jar 文件,放在了解压证书的目录里(图3)。//下面的静态参数要仔细看下面的解释,否则只会调用别人写好的方法,压根学不会0-1接入微信支付。

wjianwei666的专栏 525

getting start with storm 翻译 第四章 part-1

第四章 Spouts 在本章中,你会看到设计topology入口点(spout)的最常用的策略和怎样使得spouts容错。 可靠消息 versus不可靠消息 当设计topology的时候,一件要时刻记在脑中的重要事情是消息的可靠性。如果一个消息不能被处理,你需要决定对这条单独的消息该做什么,对于整个topology该做什么。例如,当处理银行存款时,不遗漏一条交易消息是重要的。但是如果你处理上

关注大数据~ 1768

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

交易系统使用storm,在消息高可靠情况下,如何避免消息重复

概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理。这个时候仅仅开启storm的ack机制并不能解决上述问题。那么该如何设计出一个好的方案来解决上述问题?   现有架构背景:本人所在项目组的实时系统负责为XXX的实时产生的交易记录进行处理,根据处理的结果向用户推送不同的信息。实时系统平时接入量每秒1000条,双十一的时候,最大几十万条...

weixin_33806509的博客 185

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

storm基础概念

stream stream是Storm的核心抽象。stream是以分布式方式并行处理和创建的无限元组序列。定义stream时必须指定schema,schema中声明了元组中的字段。默认情况下,元组可以包含int、long、short、byte、string、double、float、boolean和byte array。您还可以定义自己的序列化器,以便自定义类型可以在元组中使用。 每个stream在声明时都有一个id。由于单流spout和bolt很常见,所以OutputFieldsDeclarer专门提供特

u011624157的专栏 197

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

storm中包含哪些组件

开发组件: Storm 集群和hodoop集群看起来类似,但是hadoop上运行的是mapreduce jobs ,而在storm上运行的是拓扑topology ,两者之前的区别是mapreduce jobs 运行完程序(离线数据)之后会结束,而topology不会结束(实时数据),除非手动kill,或者出现异常。 Storm 集群由一个主节点nimbus和一群工作节点 supervisor组

Null_Pointers的博客 2652

[译]【Storm入门指南】第四章 Spouts

本章,你将学习到最被经常用来设计 topology(spout)的策略以及 spout 是如何具有容错能力的。 4.1 可靠 vs. 不可靠消息 当设计 topology 时,消息的可靠性是浮现在脑海中最重要的一件事。如果一个消息不能被处理,你需要决定如何处理这条消息以及整个topology需要做什么。比如,当处理银行存款业务时,很重要的一点事不能丢失任何一条交易消息。但是如果你处理上

似水流年 836

getting start with storm 翻译 第五章

第五章 Bolts 正如你看到的,bolts是一个storm集群中的关键组件。在本章中,你将看到一个bolt的生命周期,bolt的设计策略,以及怎样实现它们的一些示例。 Bolt生命周期 Bolt是一种将元组作为输入并且制造元组作为输出的组件。当你实现一个bolt的时候,你通常实现IRichBolt接口。Bolts在客户端机器被创建,序列化至topology中,并提交至集群中的master机

关注大数据~ 2194

Storm可靠性及事务性相关设计: Acker及Trident State

上面这件事一般IBasicBolt可以罩住,更多的方法可以使用IRichBolt。 一个topology里面的acker数量是可以设置的,然后tuple比较多的话可以多设置几个acker,提高效率。每个tuple有一个64位的id,acker利用这个id来追踪tuple,且会知道这个tuple他的祖宗们,也就是只要继续跟踪新的tuple就可以了,因为祖宗的id会被传递下去。 storm用一致性哈希来把spout-tuple-id对应给acker,因为tuple知道自己的祖宗,所以他可以算出通知哪个acker

张包峰的博客 5232

ack是什么,如何使用Ack机制,如何关闭Ack机制,基本实现,STORM的消息容错机制,Ack机制

ack是什么,如何使用Ack机制,如何关闭Ack机制,基本实现,STORM的消息容错机制,Ack机制

qq_44884269的博客 2028

Storm - Guaranteeing message processing

https://github.com/nathanmarz/storm/wiki/Guaranteeing-message-processing http://xumingming.sinaapp.com/127/twitter-storm%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%B6%88%E6%81%AF%E4%B8%8D%E4%B8%A2%E5%A4%...

weixin_33850015的博客 125

Storm杂谈之Acker拾趣

Storm杂谈之Acker拾趣本文所讲内容并非storm的acker机制,而是讲讲开acker和不开acker的具体区别以及在storm源码中是怎样实现的

iTer的专栏 2208

Storm消息可靠机制

一:介绍 1.介绍   默认情况是,Spout每获取一条数据,封装后发送给后面的组件,不再管后面是否处理完成或成功接收,不再考虑。   这种的情况是不用太精确,没有启用可靠性消息机制。   2.方面的体现   spout组件   bolt组件   ack机制   二:Spout组件 1.发送Tuple,给每个tuple设置一个msgId(用来标识、追踪)   重载emit()方法。      2....

weixin_33753845的博客 129

《Storm企业级应用:实战、运维和调优》——3.2 Spout数据源

本节书摘来自华章计算机《Storm企业级应用:实战、运维和调优》一书中的第3章,第3.2节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 3.2 Spout数据源 消息源Spout是Storm的Topology中的消息生产者(即Tuple的创造者)。3.2.1 Spout介绍1.?Spout的结构Spout是S...

weixin_34032779的博客 154

《Storm Applied》书评与作者访谈

Storm是一个分布式、容错的实时计算系统,最初由BackType开发,后来Twitter收购BackType后将其开源。《Storm Applied》是Manning出版有限公司出版的一本新书,旨在向开发人员提供一本无论是在开发或者生产环境中使用Storm的实用指南。InfoQ访问了本书的两位作者Sean T. Allen和Matthew Jankowski。\\《Storm Applied》描...

weixin_34097242的博客 84
上一篇: Hive Sort Merge Bucket Map Join(大表关联)
下一篇: Storm容错机制
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值