storm(二) 事务机制
前言
为了保证tuple的强有序和exactly-once语义,storm提供了事务机制,为每个tuple提供一个id
设计方法1
为每个tuple设置一个事务id,在数据库保存事务id和当前处理的id做比较。
1.两个id不一样,由于事务的强有序特点,判断出该tuple没有出现过,所以更新id
2.id一样,重复出现,可以不用处理
问题:
这样做会导致新能很低,每个tuple都必须处理完后才能处理下一个tuple(否则会影响和下一个tuple的顺序),并且每个tuple还得至少访问一次数据库
设计方法2
单个性能慢,很自然的就想到了多个一起处理。多个tuple形成一个batch。这样也可以保证强有序性

这样性能就提高了很多,如果一个batch处理了1000个tuples,那么性能就提高了1000倍。但是这还是没有更好的把资源利用充分。每个batch都是一个个处理,第二个batch必须等第一个batch完全处理完之后才能开始处理。

设计方法3
(storm选择的设计方法)
通过前两中设计方法,我们意识到了一个关键的思想,并不是所有的处理过程都需要保证强有序。只要保证最终执行完的那瞬间是强有序就ok。抽象出每次处理都需要两步。
1.计算一个batch的部分次数
2.在数据库更新该batch的部分次数
storm实现把对一个batch的计算分成了两块
1.处理。在此环节可以并发处理多个batch
2.提交。在此环节只能处理1个batch。这样就保证了强有序。
当这两块的其中某块出现问题,该事务都会被重新执行。
其实这跟设计方法二有点相似,都用了batch的思想。并结合分治思想,把整体尽可能的拆成许多小碎片,对每一个碎片都用最优的方法处理。
设计细节
1.storm把事务相关的信息存储在zookeeper中
2.storm会管理所有事务的处理或提交时机
3.关于容错。storm利用ack机制,会在合适的时候自动回放失败的事务。使用者不需要做任何acking
回放失败的事务需要一个tuple源的队列,比如kafka。
整体运行流程

Processer必须等前一个Committer完成提交后才能调用finishBatch。
关于事务失败
由于事务框架屏蔽了Ack接口,提供了另一种方式,可以 throw FailedException.
关于配置
有两个重要配置
1.事务依赖的zookeeper,默认和storm集群依赖的一样,可以通过以下key修改
transactional.zookeeper.servers
2.同时处理batch的个数,默认是1,可以通过以下key修改
topology.max.spout.pending
参考资料
http://storm.apache.org/releases/1.1.1/Transactional-topologies.html
storm(二) 事务机制的更多相关文章
- Storm(三)Storm的原理机制
一.Storm的数据分发策略 1. Shuffle Grouping 随机分组,随机派发stream里面的tuple,保证每个bolt task接收到的tuple数目大致相同. 轮询,平均分配 2. ...
- Redis学习笔记~Redis事务机制与Lind.DDD.Repositories.Redis事务机制的实现
回到目录 Redis本身支持事务,这就是SQL数据库有Transaction一样,而Redis的驱动也支持事务,这在ServiceStack.Redis就有所体现,它也是目前最受业界认可的Redis ...
- 理解storm的ACKER机制原理
一.简介: storm中有一个很重要的特性: 保证发出的每个tuple都会被完整处理.一个tuple被完全处理的意思是: 这个tuple以及由这个tuple所产生的所有的子tuple都被成 ...
- Storm的ack机制在项目应用中的坑
正在学习storm的大兄弟们,我又来传道授业解惑了,是不是觉得自己会用ack了.好吧,那就让我开始啪啪打你们脸吧. 先说一下ACK机制: 为了保证数据能正确的被处理, 对于spout产生的每一个tup ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...
- 学习RabbitMQ(三):AMQP事务机制
本文转自:http://m.blog.csdn.net/article/details?id=54315940 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的 ...
- MQ确认机制之事务机制------tx
一:介绍 1.介绍 在前面的说的模式中会出现一个问题. 就是生产者将消息发送出去到底有没有到达rabbitMq,默认情况下是不知道. 有两种解决方式. AMQP实现事务机制 Confirm机制. 这里 ...
- {Django基础六之ORM中的锁和事务}一 锁 二 事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...
- Kafka设计解析(八)Exactly Once语义与事务机制原理
转载自 技术世界,原文链接 Kafka设计解析(八)- Exactly Once语义与事务机制原理 本文介绍了Kafka实现事务性的几个阶段——正好一次语义与原子操作.之后详细分析了Kafka事务机制 ...
随机推荐
- 解决IOS7在TableView 被导航栏挡住的BUG!!
self.edgesForExtendedLayout = UIRectEdgeNone; 就这么简单!
- Graphite grafana
Graphite http://graphiteapp.org/ Graphite is an enterprise-ready monitoring tool that runs equally w ...
- CSS语义化命名
CSS语义化命名 从上图我们可以大概看出这里有两种CSS的命名方式:1.结构化命名法:2.语义化命名法. 结构化命名法:根据页面中板块的位置而命名,如上图中的content-left,这时如果我们想把 ...
- 【我的Android进阶之旅】Android目录过长造成错误:Failed to crunch file abc_textfield_search_activated_mtrl_alpha.9.png
一.编译异常描述 一大早来开发一个新的需求,拉取了一个新的分支,然后导入Android Studio之后,编译就报错了,报错如下所示: 错误具体日志如下所示: Information:Gradle t ...
- 01-开始使用django(全、简)
目录 (一)创建项目 1.生成django默认目录 2.创建应用目录 3.安装应用 4.配置使用mysql数据库 5.运行轻量级web服务器,预览 (二)设计模型 1.在models.py中定义模型类 ...
- 【云安全与同态加密_调研分析(4)】云计算安全领域主要研究成果——By Me
下表列举了在云安全问题研究表现突出的ICT公司和研究机构以及其在云计算安全方面主要研究成果: ◆ICT公司和研究机构(云计算安全领域主要研究成果)◆ ◆机构名称◆ ◆机构类别◆ ◆主要研究成果◆ ◆备 ...
- 思辨“从外至内的认识和表达”——By Me at 20140928
从下面几个维度,来思辨“从外至内的认识和表达” [思考维度1]提到研发前期的架构工作 ...
- JVM堆内存相关的启动参数:年轻代、老年代和永久代的内存分配
如果想观察JVM进程占用的堆内存,可以通过命令工具jmap或者可视化工具jvisualvm.exe.JVM这些启动参数都拥有默认值,如果想了解JVM的内存分配策略,最好手动设置这些启动参数.再通过JD ...
- 查看pc ip地址
1.使用Windows+R键打开“运行”窗口,然后输入CMD进入命令提示窗口 2.进入命令窗口之后,输入:ipconfig/all 回车即可看到整个电脑的详细的IP配置信息
- vertical-align和line-height的深入应用
vertical-align和line-height的深入应用 本文的重点是了解vertical-align和line-height的使用 涉及到的名词:基线,底端,行内框,行框,行间距,替换元素及非 ...