Spout和Bolt

Spout

ITransactionalSpout<T>,同BaseTransactionalSpout<T>,普通事务Spout

IPartitionedTransactionalSpout<T>,同BasePartitionedTransactionalSpout<T>,分区事务Spout

IOpaquePartitionedTransactionalSpout<T>:同BaseOpaquePartitionedTransactionalSpout<T>,不透明分区事务Spout

Bolt

IBatchBolt<T>:同BaseBatchBolt<T>,普通批处理

BaseTransactionalBolt:事务Bolt

接口Icommitter:标识IBatchBoltBaseTransactionalBolt是否是一个committer CoordinatedBolt

1、传统事务

ITransactionalSpout<T>:普通事务Spout

-- ITransactionalSpout.Coordinator<X>

--initializeTransaction(BigInteger txid, XprevMetadata) :

创建一个新的metadata,当isReady() 为true时,发射该metadata(事务tuple)到“batchemit”流

--isReady() :为true时启动新事务,需要时可以在此sleep

-- ITransactionalSpout.Emitter<X>

--emitBatch(TransactionAttempt tx,X coordinatorMeta,       BatchOutputCollector collector) :逐个发射batch的tuple

2、分区事务

IPartitionedTransactionalSpout<T>:分区事务Spout,主流事务Spout,原因是目前主流MessageQueue都支持分区,分区的作用是增加MQ的吞吐量(每个分区作为一个数据源发送点),主流MQKafkaRocketMQ

  --IPartitionedTransactionalSpout.Coordinator

    --isReady():同上--numPartitions():返回分区个数。当增加了数据源新分区,同时一个事务被replayed,此时则不发射新分区的tuples,因为它知道该事务中有多少个分区。

--IPartitionedTransactionalSpout.Emitter<X>--emitPartitionBatchNew(TransactionAttempttx,BatchOutputCollectorcollector,intpartition,XlastPartitionMeta):发射一个新的Batch,返回Metadata

--emitPartitionBatch(TransactionAttempttx,BatchOutputCollectorcollector,intpartition,XpartitionMeta):如果这批消息Bolt消费失败了,emitPartitionBatch负责重发这批消息

3、不透明分区事务

IOpaquePartitionedTransactionalSpout<T>:不透明分区事务Spout

  --IOpaquePartitionedTransactionalSpout.Coordinator

--isReady():同上--IOpaquePartitionedTransactionalSpout.Emitter<X>

-- emitPartitionBatch(TransactionAttempttx,BatchOutputCollectorcollector,intpartition,XlastPartitionMeta)
      --
numPartitions()

它不区分发新消息还是重发旧消息,全部用emitPartitionBatch搞定。虽然emitPartitionBatch返回的X应该是下一批次供自己使用的(emitPartitionBatch的第4个参数),但是只有一个批次成功以后X才会更新到ZooKeeper中,如果失败重发,emitPartitionBatch读取的X还是旧的。所以这时候自定义的X不需要记录当前批次的开始位置和下一批次的开始位置两个值,只需要记录下一批次开始位置一个值即可,例如:

public class BatchMeta
    public long
nextOffset; //下一批次的偏移量 }

4、分布事务和不透明分区事务Spout的区别与联系

IPartitionedTransactionalSpoutIOpaquePartitionedTransactionalSpout都是把tuple封装成batch进行处理,同时可以保证每一个tuple都被完整地处理,都支持消息重发。为了支持事务性,它们为每一个批次(batch)提供一个唯一的事务IDtransaction idtxid),txid是顺序递增的,而且保证对批次的处理是强有序的,即必须完整处理完txid=1才能再接着处理txid=2

二者的区别以及用法:

IPartitionedTransactionalSpout的每一个tuple都会绑定在固定的批次中。无论一个tuple重发多少次,它都在同一个批次里面,都有同样的事务ID;一个tuple不会出现在两个以上的批次里。一个批次无论重发多少次,它也只有一个唯一且相同的事务ID,不会改变。这也就是说,一个批次无论重发多少次,它所包含的内容都是完全一致的。

但是IPartitionedTransactionalSpout会有一个问题,虽然这种问题非常罕见:假设一批消息在被bolt消费过程中失败了,需要spout重发,此时如果正巧遇到消息发送中间件故障,例如某一个分区不可读,spout为了保证重发时每一批次包含的tuple一致,它只能等待消息中间件恢复,也就是卡在那里无法再继续发送给bolt消息了,直至消息中间件恢复。IOpaquePartitionedTransactionalSpout可以解决这个问题。

而IOpaquePartitionedTransactionalSpout为了解决这个问题,它不保证每次重发一个批次的消息所包含的tuple完全一致。也就是说某个tuple可能第一次在txid=2的批次中出现,后面有可能在txid=5的批次中出现。这种情况只出现在当某一批次消息消费失败需要重发且恰巧消息中间件故障时。这时,IOpaquePartitionedTransactionalSpout不是等待消息中间件故障恢复,而是先读取可读的partition。例如txid=2的批次在消费过程中失败了,需要重发,恰巧消息中间件的16个分区有1个分区(partition=3)因为故障不可读了。这时候IOpaquePartitionedTransactionalSpout会先读另外的15个分区,完成txid=2这个批次的发送,这时候同样的批次其实包含的tuple已经少了。假设在txid=5时消息中间件的故障恢复了,那之前在txid=2且在分区partition=3的tuple会重新发送,包含在txid=5的批次中。

在使用IOpaquePartitionedTransactionalSpout时,因为tuple与txid的对应关系有可能改变,因此与业务计算结果同时保存一个txid就无法保证事务性了。这时候解决方案会稍微复杂一些,除了保存业务计算结果以外,还要保存两个元素:前一批次的业务计算结果以及本批次的事务ID。

如:

{value = 4,

prevValue = 1,

txid = 2

}

STORM的三种事务相关推荐

  1. Java面试题之Oracle 支持哪三种事务隔离级别

    Oracle 支持三种事务隔离级别: 1.读已提交:(默认) 2.串行化: 3.只读模式 转载于:https://www.cnblogs.com/hujinshui/p/10463883.html

  2. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)

    一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...

  3. 小白面试:EF Core的三种事务

    有一次小白面试回来说,面试官问EF Core怎么实现,他当时懵逼了,之前写过但是长时间不用了,最近的事务还是用第三方封装的方法,早忘记原生的怎么写了.本文将替小白回答这个问题,而且有三种实现方法. 事 ...

  4. Spring的三种事务控制

    Spring的三种方式的事务控制 1:基于编程式的事务控制 1.1:编程式事务控制相关对象 PlatformTransactionManager接口是spring的事务管理器,他里面提供了我们常用的操 ...

  5. Sql Server 三种事务模式

    显式事务 显式事务(Explicit Transaction)是由设计人员明确定义事务的启动与结束的一种事务. 可使用 BEGIN TRANSACTION.COMMIT TRANSACTION.COM ...

  6. 分布式事务讲解 - TX-LCN分布式事务框架(含LCN、TCC、TXC三种模式)

    分布式事务讲解 - TX-LCN分布式事务框架(含LCN.TCC.TXC三种模式) 分布式事务系列博客: TX-LCN框架原理 LCN 原理及主要特点 代码实现 实现场景 创建数据库及表(三个数据库, ...

  7. 什么是分布式事务Seata?Seata的几种事务模式详解

    最后更新于:2020-04-08 17:37 目录 概念 发展历程 核心组件 三种事务模式 AT模式 前提 一个分布式事务在Seata中的执行流程 Seata 的事务提交方式与 XA 协议的两段式提交 ...

  8. Java 三种模型,四种策略

    Java 三种模型,四种策略 (转) 混淆事务模型与事务策略是一个常见的错误.本系列关于 事务策略 的第二篇文章将概述 Java™ 平台支持的三种事务模型,并介绍使用这些模型的四种主要事务策略.通过使 ...

  9. 流式大数据处理的三种框架:Storm,Spark和Samza

    2019独角兽企业重金招聘Python工程师标准>>> 许多分布式计算系统都可以实时或接近实时地处理大数据流.本文将对三种Apache框架分别进行简单介绍,然后尝试快速.高度概述其异 ...

  10. flink 三种时间机制_360深度实践:Flink 与 Storm 协议级对比

    本文从数据传输和数据可靠性的角度出发,对比测试了 Storm 与 Flink 在流处理上的性能,并对测试结果进行分析,给出在使用 Flink 时提高性能的建议. Apache Storm.Apache ...

最新文章

  1. linux 失败模式,在Linux中在AP模式下扫描失败(wpa_supplicant)
  2. 人工智能是什么?带你一次掌握人工智能的三大重点及三大领域
  3. 《实用》secureCRT远程连接linux虚拟机-突然连接不上-解决办法
  4. 文献记录(part61)--基于不完备数据聚类的缺失数据填补方法
  5. 静态工具类注入service的方法
  6. 有一句说一千句,是作家....
  7. ecs服务器换系统,ecs服务器更换操作系统
  8. 第五周课程总结与报告
  9. oracle从入门到精通视频教程下载,Oracle从入门到精通与实践视频教程
  10. Excel正确输入身份证号码
  11. Bloodsucker 【 ZOJ - 3551】
  12. 笔记本使用HDMI连接显示器没反应
  13. 深度搜索和广度搜索特点的深刻理解
  14. CSS 按钮悬停效果
  15. BackTrack 4 R1 – Public Release
  16. 模式源于生活:代理模式---中介租房
  17. 两篇文章都是翻译了一半就翻不下去了,E文水平有待提高啊
  18. 计算机音乐谱软件假装,愚人节整人方法 让电脑遭殃的整蛊软件
  19. Hexo 博客加入豆瓣读书界面(综合教程)
  20. Edge-TTS 语音朗读

热门文章

  1. 阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置
  2. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_8_Stream流中的常用方法_skip...
  3. ApiDoc 一键生成注释
  4. CTP2交易所成交回报
  5. idea中使用maven方式使用jetty+cmd中使用Jetty运行(maven)Web项目
  6. CST,CET,UTC,GMT,DST,Unix时间戳几种常见时间概述与关系(转)
  7. Hard To Get歌词分析
  8. JZOJ 1714. 小x的三角形(triangles.pas/cpp)
  9. 首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能。(已完善)...
  10. HDU 2899 :(二分求最小值)