联机交易与批量交易
联机交易就意味着系统对外直接提供的交易,该类交易具有事务性——可回滚;实时性——交易有生命周期,并有超时机制等,调用方需实时等待被调方的反馈,成功或失败皆有反馈;并发性——同一类甚至同一个交易可同时被多个线程调用,相互间有锁处理机制。
批量处理则意味着该交易相关的参数、系统状态已经锁定,系统需要进行的是某一类操作,该类操作具有统一性——使用相同的规则处理大量数据;串行性——并不是说批量交易中不能有并发,而是有固定的步骤,先做哪一步,再做哪一步,每一步都有对某些条件的依赖;可重复性——这个不是必须的,但强烈建议批量程序在设计之初就考虑可重复运行,否则后续的运行与维护会带来诸多麻烦;
典型联机为取款交易,余额的查询(可能出现余额不足的情况)及更新、交易流水的生成、账户使用记录的生成、会计凭证的生成、存款及现金科目总账的登记、需要一次完成,如果其中某一步产生异常,则整个交易回退;典型的批量交易为对账交易,对账的先决条件为上一日的处理已经全部结束,系统需要的是对上一日处理结果的验证,验证的方式是设定一些筛选规则,检查是否有不符合规则的数据,如果有,将其自身及相关数据生成对账差错日志,供运营人员查询及处理,如果对账结果完全无误,则交易通过,进行下一个批量程序(比如生成日增量数据文件,发送给下游系统)。
批处理与流处理
在了解这两个概念之前先来了解一下下面的概念:
有边界数据和无边界数据
无边界数据,其实就是一种可增长,无限的数据集。我们也可以称他为”流数据(Streaming Data)“。
有边界数据,其实就是一种保存好了的数据,例如数据库中的数据或者csv中的数据等
拿我们之前的交易数据来说,如果按照一定的时间窗口,拿取一小部分数据,那么提取出来的数据也是有边界数据了。例如我提取2019年08月19日这天地数据来做处理,我们提取出来地这份数据就是有边界数据。
事件时间和处理时间
事件时间(Event Time)指的是一个数据实际产生的时间,处理时间(Precessing Time)指的是这条数据实际被处理数据的系统接收的时间。
下面我们通过一个例子更了解事件时间和处理时间。
例如:我打开淘宝准备购物,在12点05分下了单,由于进入车库没信号,导致这个订单一直在重试支付,直到我离开车库,提示支付成功,这时的时间是12点08分。这里的12点05分就是事件时间,而12点08分就是处理时间,这样你是否明白了呢?
批处理
数据的批处理,可以理解为一系列相关的任务按顺序或并行的,一个接一个地执行。批处理地输入是在一段时间内收集好地数据。每次批处理地输出都可以是下次批处理地输入。
大部分情况下,批处理地输入数据和输出数据都是有边界数据。所以在批处理中,我们更关注地事件事件。
由于批处理一般都具有高延迟性,有可能计算需要几小时、几天甚至是几周的时间。所以对实时性比较有要求,那么应该考虑使用流处理的方式处理数据。
流处理
数据的流处理可以理解为系统需要接收并处理一系列连续不断变化的数据。例如,音视频的实时推荐、周边推荐等。
流处理的输入基本都是无边界数据。而流处理系统中是关心事件时间还是处理时间一般是随应用场景而定的。
流处理的特点应该是足够快、低延迟、以及来自各种数据源的大规模数据。流处理所需的响应时间更应该以毫秒(或秒)来进行计算。像我们平时用到的搜索引擎,系统必须在用户输入关键字后以毫秒级的延时返回搜索结果给用户。
流处理快的原因,是因为他是在数据未达到磁盘时计算的,也就是在内存中计算的。
当流处理架构拥有一定时间间隔(毫秒)内产生逻辑上正确的结果,这种架构可以被定义为实时处理(Real-time Processing)。
当一个系统可以接收以分钟为单位的数据处理时间延时,我们可以把它定义为准实时处理(Near Real-time Processing)。
总结
像是对不需要实时分析结果的情况下,其实批处理是一个很好的选择。特别是业务逻辑十分复杂,数据量大的时候,更容易从数据中挖掘到有用的信息。
而对应用的实时分析处理有要求的情况下,或者数据传输的结束时间、数据量无法确定的情况下,就可以采用流处理的处理架构来完成这件事情