00:00
好,那接下来呢,我们就看这个优化二啊叫什么呢?异步查询。甩锅大法加未来站未来站点对了啊,这个在工程当中是正常的,这个真真不是说什么甩锅不甩锅对吧?啊,我懂了,你甩锅是说甩给那个项目经理对吧?应该知道这个意思啊好,呃,那咱们看一下啊,这个地方呢,第二个优化用异步查询啊呃,所谓的叫异步查询呢,就这个意思,大家看啊。就我们直接看图啊,直接看这个图对吧?好,那比方说现在啊,在map这个函数里边,假如说我们用的是这个map方式。对吧?Map function,注意map function里边这所有东西是同步的,所谓同步是什么意思呢?当我们第一条数据进来,进来之后处理完返回以后,再对第二条数据再做处理,也就是说它时间是真正意义上这个做累加的,他也就是map方向啊,它是一个同步的函数啊,那也就是说第一个就这样子的,比方说我A这条数据来了,我要去访问这个数据库,对吧?然后中间这个橙色部分呢,是等待时间。
01:15
等是等待这个时间,接下来等待完之后,诶,数据库给你响应了,对吧,这个中间可能就是我们的13毫秒或者说一毫秒对吧?啊等待的时间,那下来B在发起他的请求,然后呢,B开始进入等待时间啊,因为这边呢要去访问响应,然后呢返回对吧,所以我们之前很简单粗暴的说,一条数据要访问数据库的六次,所以我直接做了一个五毫秒的累加,对吧,我就规定诶减一点来让他算五毫秒。呃,那一条数据五毫秒,两条数据十毫秒,就是这样直接乘就完了,对吧,但实际上从弗1.2,注意1.2不是01:12 1.2就开始了,咱们是01:12已经远远高于这个版本了,对吧?从1.2就引入了一个异步IO的一个方式,那也就什么意思呢,这个地方我们可以干什么?
02:12
直接。所有的数据来了,大家呢?用异步的方式发送请求,然后共同等待。啊,不是说等我处理完了你再发,接下来呢在谁。响应了谁,被响应了,谁就出去。啊,谁就出去。对吧,是这个意思啊,那这个是所谓的异步查询啊,反正我发过去了,我就等着就完了。我就等着对吧,而不需要大家,我必须等在紧后面,大家可以谁来了谁就赶紧发请求,只要资源够对吧,我就发这个请求,只要资源够我就发请求。对吧,好,然后呢,大家一起等着,这样的话,大家明显能看到这边。要比这边的效率高太多了。
03:03
对吧?啊,那这边呢,就是说你如果说同时可以发四个请求,那这边是不是相当于这边的四倍。对吧,如果说我可以发同时发十个请求呢,那是不是这边的十倍了。有没有问题?对吧,就看这边我可以同时发多少个请求。对不对。这个没问题吧,啊,就是这样子的啊,所以这个就是异步查询,然后接下来我们看一下这个官方文档,这个东西应该怎么去用,对吧?我们要用到异步查询的一个方式啊,呃,那打开咱们的官方文档,我们对着来看一看,其实我们文档当中这些啊中文字我们带大家看这个其实就是文档当中这个,呃,翻译过来的啊,我们就直接看这个官方文档。
04:05
然后呢,进到我们documentation啊,就进到文档当中,然后呢,我们还是看12,不要看13,有可能13有一点不一样,对吧,有很多东西可能改了啊,因为我没有研究过13,所以我们还是直接老老实实看12,在data stream API当中,昨天我们看到operator对吧,今天又切到operator,那这个对吧,Window啊,Join对吧,Process方式最后一个,哎,就是我们的A的一个IO对吧,异步IO好点开。点开好以后呢,我们来看一下啊,这个地方首先那这张图啊,其实就是我们从官方那其实弗当中那个所有的图啊,都是我们从官方文档截出去的啊截出去的好呃,那我们看一下啊,这个地方他说异步IO操作的一个必要性,对吧,为什么要有这个异步IO操作啊呃,他说了比方说。当我们需要跟外部系统进行交互的时候。
05:03
跟外部系统交互的时候对吧,好,那举个例子说,呃,什么事呢,我们当我们去enrich丰富我们的流的事件,也就是说。补充作弹,刚好我们当前这种应用场景,就是我们要用系统外部系统当中的。数据来丰富我们流里边的数据对吧?啊,然后呢,With data用什么数据呢?存储在数据库的数据来丰富我们流里边事件的时候,对吧?举了一个例子,刚好我们场景就是这个啊,他说呢。One needs to take care。要注意的是咱们的一个。Communication delay交互延迟交流对吧,交流交互延迟对吧?啊与这个外部系统的交互延迟往往是我们这个流的什么。我们这个流streaming application整个工作的要注意的一个点。对吧,在这啊,也就是说它最耗时的就在这个地方,好,那我们看一下,呃,比方说这边。
06:02
他举个例子,当我们要跟web系统要去交互,要访问web系统里面数据的时候,对吧,访问access data啊,然后举个例子,For example in mapb function,在map方式里边,它呢,明显意味着这个同步的方式啊,同步的方式什么意思呢?啊,那比方说一个请求被发送到了这个database啊,此时麦克风就要等待,等待等待到什么呢?直到until对吧,直到这个响应被发回来。Response has been received,当这个响应被接收到的时候,对吧,他一直要等着,也就是说第一条数据就是我们说的A来了,你要等着,等着什么呢?A接收到请求,再去发B的请求才可以,对吧?啊,那往往来说呢,在绝大部分的一个案例当中,在绝大部分的一个操作当中,对吧,那这个等待。等待啊,往往是这个什么看啊,用了两个,连续用了两个巨大的词。
07:03
Vast major,对吧,啊,都是巨大的,然后是什么呢?这个等待的一个延迟往往是。绝对影响了我们整个函数的一个时间,这个倒没有问题,对吧,其实就是把这个图我刚才给大家解释了啊,那你要发一个请求,你要等着下一个人才能发请求,所以在这个时候呢,他会非常的耗时。非常好使,而且整个的瓶颈就在于这儿,对吧,好,那接下来我们看啊这呢。异步的方式就意味着什么呢?单个柄度,一个方位式实例可以处理更多的请求,而且是con并行处理,对吧?啊,呃,然后呢,Receive the response conculy。啊,也就是说可以并行的发请求,可以共同的接请求,这个没有问题啊,互相不干扰对吧,互相不干扰,呃,然后呢,他说你看啊,The waiting time,等待的时间可以被overlay,什么意思,被覆盖重叠对吧?啊,重叠就这一部分,就我们说的,你四个人发送请求了,大家一起等着。
08:10
一起等着把这个时间进行一个压缩,进行一个压缩,对吧?啊是这个意思,那最后我们看看这个。说。这将导致啊,或者会影响对吧,在更多的我们的案例当中,可以有更高的留的这个什么。是不的吞吐量吧,哎,吞吐更高的吞吐不就是我们说的,当数据量这个高峰期来的很大的时候,我们用。之前的方式处理不了了,可以用这种方式来处理,对吧?是这个意思啊,这个意思好呃,那另外啊,当然我们今天说了,像这种note这种要注意的地方,我们要看一看啊呃,那这边呢,提高吞吐量,提高吞吐量啊呃,除了用ebo的方式,还有另外一种方式什么呢?来看啊,Just调用我们这个什么main function。
09:06
用一个非常高的并行度,我们之前说了,我们200啊80啊,都是什么单并行度来说的,其实我们还有一个很简单很简单提高我们处理能力的方式,那就是提高背题度。对吧,啊,提高并行度啊好,但是呢,这个大家也知道,不看后面的这些东西,你都知道提高并行度会带来什么问题。我们单纯的去提高变异度,它会带来什么问题?成本资源对了啊,要更高的成本,或者就是资源对吧?这个成本就是资源的一个成本啊,啊,那我们来看把它看完啊,但是呢,通常会带来什么呢?Comes at very high resource cost,对吧?非常高的资源开销啊呃,拥有这个在map map function当中啊,拥有更多的这个map function的一个并一路的实力,意味着更多的task没问题对吧?线程数啊,没问题,然后另内部网卡的交互对吧?因为你的并路多了,假如说下游一个,那明显的交互多了,我三个跟五个肯定不一样,对吧,然后呢。
10:30
网络更多的与数据库的网络连接,对吧,更多的需要消耗我们的内存,也就是说。我们的内存消耗更高的资源,对吧?啊就是这个意思。啊,资源浪费,那这个毋庸置疑,肯定肯定很容易能想到这个问题对吧?啊,所以是这样子的啊这样子的啊呃,那接下来我们继续往后看啊,把这个看完,呃,这边是。什么前置基础对吧?以要求啊,就是你要写这个东西的要求,好,然后呢,他说这个东西啊,呃,如果说我们要实现这个一步IO跟这个数据库啊一步IO的话,那。
11:11
往往需要一个客户端,需要什么客户端呢?这个数据库提供一个。可以做。发送异步请求的一个客户端。对吧,这个我们想想也合理啊,想想也合理,确实是这样,那你没有一步客户端怎么做呢,对吧,而且他说了,呃,对于。这种非常主流的这个数据库呢,往往都会提供这个客户端啊,往往提供这个客户端对吧?好,但是有一个问题啊,我们现在呢是要查。和Phoenix。对吧,我们要查两个地方,不是单个的,好呃,那这是第一个问题,要查两个啊,不方便使用这个客户端,第二个第二个,那我们如果只用这种客户端的方式,那如果说没有客户端,没有这种异步客户端的方式,我们就用不了了吗?对不对啊,不是的,所以我们选择第二种最通用的一种方式啊,最通用的一种方式,他说如果说没有这个客户端。
12:18
对吧,那怎么办呢,我们可以。尝试自己去实现这种客户端啊怎么做呢,看这个。创建多个客户端啊,同时创建多个客户端,并且处理这些请求用一个什么。线程时的方式,也就是说什么意思呢?我们这边假如说没有这种可以提交if步请求的客户端的这种方式,但其实可以啊,它本身是有的,可以做这个事情啊,但是呢,由于我们这个工具类都已经写好了,对吧,而且里边不光访问red,还要访问这个非,所以这个地方呢,没法做这个事情啊,啊那怎么做呢?那你看。
13:15
这边我们可以用线程值,也就是说其实就是用多线程的方式来做这个事情。啊,用多线程的方式来做这个事情。对吧?好,那多线程的方式呢,你比方说第一个数据来了,你开一个线程去发送请求,你也开通一个线程去发送这个请求,所以你俩就没有互相关联了,对吧?这也是一种方案,对,能明白这个意思吗?对吧,他说的还可以用线程值,也就是说多线程嘛,那为什么要线程值,那不就多线程的方式来做这个事情嘛,对吧?所以这里边我们不光要用到异步IO啊,还要用到多线程啊,用到多线程的方式啊,然后他这边说了,然而,然而怎么样呢?往往这种,呃,提供了这个客户端,这句话就是提供了客户端,一还客户端的往往效率呢,要比这个多线程的要好一点,那这个我们也得想明白,人家自己给定封装做了优化了,你自己写的多线程肯定稍微差一点,但是呢,它也有好处,就在于通用嘛。
14:17
它更通用对不对,对吧,我不管这个数据库有没有提供这种异步响应的这种客户端,那都可以用,对吧,所以呢,我们在项目当中选择的是这个这种方式,用多线程的方式来实现的啊好,这是我们关于这个异步IO它的一个说明。
我来说两句