1. 背景-什么是流计算
在传统的数据处理流程中,总是先收集数据,然后将数据放到数据库中,当人们需要的时候通过查询对应的数据进行处理。这样看起来没什么大问题,但是当我们遇到以下场景的时候就有问题了。比如:金融风控,双十一抢购,推荐系统等,这类系统有一个共同的特点,就是对时效性要求非常高。
所谓“时光一逝不复返,往事只能回味“。我们举一个简单的例子,当前你的余额宝账户有3000块,你去商场消费了2000。这时候触发支付宝结算,假设支付宝处理这笔数据需要10秒,而10秒之内,你接着又消费了2000,这时候应该提示你余额不足了,但由于结算程序还在处理,实际上余额还有3000,那么你这2000又结结实实可以消费了。10秒后支付宝反应过来了,这时候钱已经扣了,找谁还钱去啊,这样引发了很大的金融风险。
其实还有一个简单的办法,支付宝在结账的时候(10秒钟之内)禁止消费,又带来的问题是交易量下跌,这样的损失更加接受不了,所以这就对数据的实时处理要求非常高,这1秒的数据这1秒就要处理完,下一秒的数据可能又是其它的情况了。数据就像流水一样不断变化,我们需要实时的处理数据。
2. 流式计算优化之拓扑排序
2.1 流式计算
流式计算就是实时查询并且对数据进行计算,假设我们遇到了如下计算场景:
A = D + B
B = C + E
C = D + E
我们需要计算得到 A 的值,如何才能最快的计算出结果呢?我们可以从以下几个方面来分析问题。
2.2 单线程
如果是单线程的情况,我们只能线性的去执行任务,最开始计算 a = d + b,先计算 d,然后计算 b,而 b = c + e,只能再去计算 c,而 c = d + e。先计算出 d 和 e 相加得出 c,然后计算 c 加 e 得出 b,最后计算 d 加 b 得出 a。最后我们统计计算 a,一共做了多少次计算: