00:00
好,同学们,现在呢,给大家介绍一下我们在Java里面呢,如何去异步写入Fla DB。首先呢,为了跟这个同步写入的代码区分开呢,我去创建一个新的类。呃,叫做aync。好,呃,现在呢,我们就在这里面去写,我们异步同异步写入的。代码,呃,先去我们的之前的代码里面呢,把我们需要的I talking,然后buck这些信息呢给粘过来。好,同样还是创建一个慢方法。呃,接下来呢,我们先去创建我们的连接客户端,跟之前的操作呢,都是一模一样的。啊,这里需要传入我们的URL。然后呢,再传入我们的talking。呃,之后呢,由我们的org组织。在之后呢,是我们的存储桶好点,呃,现在呢,我们就去创建一个异步写入的API,我们用inlu DB client点注意点啊,这里呢,不是get了啊,我们之前的这些API对象呢,都是都是通过这个client对象呢去调用get方法拿到的,呃,那么这里面。
01:20
这个API呢,要用make方法,有一个make write API,我们后面呢会给大家讲它为什么叫make不叫get啊呃,因为它后面呢还有一些别的操作,呃,Make right API之后呢点哇,要把它做成一个变量,这里呢,我们先带着大家呢去看一下right API里面有什么啊,有什么方法点一下诶可以看到呢,这里面有right啊,没什词啊和和这个方法的这个结构呢,基本上和我们之前看的同步写入的一样,哎,都是分为measurement啊,还有这个point,还有record这三类。呃,那么接下来呢,我们就去写一个直接用这个什么吧,直接用这个行协议去写write record。
02:05
然后我这里呢,把之前的这个行协议直接拿来。啊,可以看到这个写入的方法呢,参数也是一样的啊啊第一个参数呢,是写入的时间戳精度,我们写入毫秒。呃,那么这个时候呢,其实我们的航线页里面,航线页里面呃,不带时间戳,但是in Fla DB呢,那边会帮我们补上,把这个数据拿来,然后呢,这个location tag啊,这个标签我要给它改一下,呃,现在呢,我们用了三个方向啊,三个方位,呃,没有用到的呢,就是南方south,我这里呢改写south so。啊值呢,改成40好,呃,现在呢,我们再去把这个操作呢,直接。点right record。啊,已经已经写了,那么接下来呢,我们就这样先去跑一遍,看看什么效果。
03:05
好,大家可以看到呢,这个程序已经正常的退出了,我们现在去这个web UI上呢,看一下有没有数据,把这个页面刷新一下。好,点击这个uva Java。然后再看到这边的测量名称啊,点一下我们的location。啊,可以看到呢,这个数据没有进来,S这个tag呢,S这个标签也没有创建,那么这是为什么呢。呃,大家回想一下啊,我之前说过这个异步写入的一个逻辑。啊,我这里几支,拿支笔给大家画一下。呃,我们说呢,这是一二三四五五行代码。呃,其中呢,这一行是我们要写入in DB的操作。呃,我们的这个make API呢,它其实会创建一个线程池和一个缓冲区。我这里呢,给大家画一下,就是因为换个颜色吧。
04:01
那个黄色呢,表示我们的线程池。然后呢,我再换个颜色,用绿色呢,表示我们的缓冲区。呃,那么这行代码呢,我们刚才调的这个write record record。呃,它会执行这个写入操作吗?他的这个操作呢,其实是把数据放到我们的缓冲区里。那么这是一条数据。然后呢,现在在线程池里面呢,有一条线程,有一个线程。他呢,哎,去每隔一段时间,每隔一秒钟呢,去看一下这个缓冲区有没有数据,如果有的话呢,它就像我们的英拉DB。执行写入操作。呃,这么这个呢,就是我们的英拉TB。啊,Plus TVB的服务端,它一来是每隔一秒钟,二来呢,就是说这个集合这个缓冲区满了,哎,它去比如说到了1000条了,他满足这两个条件,写到我们的in class DB,然后写入成功的话呢,就把缓冲区里的数据删掉。
05:01
呃,那么我们这个操作呢,我们可以看到我们刚才呢,执行到write record。把这个数据放到缓冲区里来了,但是这个程序执行很快,慢方法呢,一执行完啊,人家一看你这个这个这个后台线程的一看。哎,这个程序已经要退出了,然后一秒钟和1000条呢,这两个条件都还没有满足,你这个程序就要退出了,那么这个线程呢,就被销毁了,所以说这个数数据呢,就在这个缓冲池里面躺着,一直没发出去,而且呢直到被销毁。呃,那么这里要发出数据的话怎么办呢?其实这个API给我们提供了一个flash方法。点flash,呃,那么这个东西呢,就是强制的去呃刷写缓冲区,也就是说通过这个方式呢,我们就直接强制让这个后台线程把这个数据直接从缓冲区里面发到in Fla DB,然后成功之后呢,再回来删掉缓冲区里的数据,我们可以看一下加上这个flash的方法之后呢,程序的执行会变成什么样子,点开运行。
06:06
好,现在呢,去看我们的web UI。刷新一下。看到example Java,然后点击这个呃,测量再看location,现在呢,你可以看到S这个数据呢,就加进来了,再点下可以看到呢,这里就是我刚才啊写的这个点啊写的这个点。看一下原始数据啊,可以看到呢,这个值是40,说明真的是我刚才写进来的。嗯,那么现在呢,我们再说一下,就是除了这个flash呢。你其实调in Fla DB in Fla DB client这个变量,它不是有个close方法吗?呃,那么这个close呢,其实就是帮我们处理各种善后工作的啊,调查这个方法呢,数据也可以被写出去,比如我这里把这个数字,数字呢改成。改成65,好,我们现在呢,点击运行。
07:01
啊,稍微等一下。那么可以看到呢,我这个程序呢,是正常退出没有异常,呃,接下来看到我们的外部UI点一下刷新。呃,可以看到我们值为65的数据呢,已经成功进入。再看一下折线图啊,也变成了一条线啊,那么这就是我们让这个缓冲区呢啊,去进行刷新的两个操作。好,那么我们说这个,如果你用的是异步写入的方式呢?呃,那么这个展批的过程啊,数据展批的过程其实是在后台影视完成的。呃,那么我们怎么样去在程序里面控制这个后台线程的工作逻辑呢?答案是在make right API的时候呢,传入一些配置参数啊,我们可以看到这里面呢,你可以首先是有一个无参方法,另外呢,就是你可以传入right options,那么right options呢,就是我们这个后台线程去执行,呃,这个插入操作的一些配置我们可以看一下。
08:05
Right options。呃,先不敲东西啊,我们先点到源码里面看一下,呃,那么这里可以看到你,你点进来呢,在这个类的属性里面写了一堆大写的这个final,这是什么?这是常量,那么这些常量呢,都是以default开头的,说明这是什么?这些都是默认值。呃,那么如果说呢,你觉得这个阅读性差,我们可以下载源码登录的sources。那么稍等一下把源码下下来,那现在你看到这个结果呢,其实反编译的。好,源码下下来之后呢,会带上这些注释信息,这样更方便我们呢去阅读,呃,我们还是去这个里面看看源码。好,那么你可以看到呢,这里面其实它有时候会带上一些这个啊,包括这个get。你比如说这个它这里面不是封装了各个属性吗?然后你比如说他有better啊better,然后flash interval,那么这里面呢,你可以通过get方法来看到,呃,这每一个对应的它的这个成员变量是什么含义?
09:05
呃,比如说我们要看一下这个,呃,Try interval,你就可以看到这里面呢,就有一个文档注释说这个the try interval is used,就是说这个从市的间隔呢,是当in Fla DB server。没有在请求头里面指定re try after这个hier的时候啊,没有在请求头里面指定啊,这个re try after建呃,这个这个建设队的时候,呃,那么你的这个呃,Re try inter呢才会生效,呃,那么这就是我们可以看到它每一个呃,每一个这个参数的解释,呃,接下来呢,我们就可以去做一下这个right option。啊,这里面呢,还需要再给大家提前解释两个参数啊,现在还不能太着急。呃,这里面有一个有一个batch size,我们可以看到有一个叫做BTCH,这个batch size,它是1000,也就是说我们这个后台线程向in Fla DB发送数据的时候呢。
10:02
我们这个缓冲区里面有个缓冲区,缓冲区里面满1000的时候。会触发一次这个协助操作,呃,但是呢,大家要注意这个P的大小和缓冲区大小呢,是两个概念啊,我们可以看到缓冲区呢,它是P大小的十倍,这里呢给的是1万条。呃,那么接下来呢,我们就说这个Bach size呢,它既然能能够影响触发是吧,那么我们就可以通过这个呃参数呢去进行一个实验。来,我们写到这个代码里面来。啊,给大家说一下这个right options options呢,它提供了一个构造者的设计模式,那么我们先调它的builder。啊之后呢,就可以在这里面,呃,使用它的这个各种方法去写,去直接指定我们想要的参数啊,我们要给这个参数设的值啊,比如说我们把这个batch size,呃,设成999条。然后再把刷写的时间有个flash interval。
11:03
啊,这里面呢,传的是毫秒数,那我们现在呢,给它改成1万,那十秒钟呢一刷鞋。最后呢,调一下B的方法,再点就可以看到,你就获得了一个呃,Right options的变量。把这个变量名改一下。Op options,好啊,那么现在呢,我们make write API的时候呢,就把这个带上options。那么为了这里呢,给大家演示一下,就是后台线程它是如何去处理刷写的,我把这个先注掉啊,我们现在呢,让这个后台线程呢,直接写一个,我们现在写一个for外循环。I等于零,I小于999,也就是说我们让这个循环呢,哎,执行999次啊,先不要执行999,先执行998次,呃,然后把这个写入的代码写入操作代码移动到我们的for循环里面来。我现在把值改成77。
12:03
好,执行这个代码,我们看看这个数据呢,能不能写进去。好程序呢,没有异常,现在已经正常的跑完了啊,我们再去看一下我们的VIVO UI,刷新一下,重新进行这个查询,我们可以看到选这个tag location的resource的submit。我们直接看原始数据吧,现在呢,你可以看到我这里面呢,还是两条数据,我刚才的数据的值呢是77,它这里呢是65,说明我们刚才这条数据没有进来,呃,现在如果我如果把它升成99 999,我们再去跑一下这个程序看怎么样。好。来刷新一下。然后呢,再去查询。
13:01
找这个south。提交,那么现在你可以看到呢,第三个点出现了啊,第三个点出现了啊,这就是我们通过控制这个,呃,异步写入的。参数啊,来控制这个后台线程呢,它向in class DB提交数据的行为,刚才呢,我们改成九十九百九十八,那么这个数据呢,就写不进来,原因呢,就是首先我们这个程序的执行呢,它用不了十秒,那么这一个触发的条件啊,这一个写入触发条件就不满足啊,还没到十秒的时候呢,我们这个程序就执行完了,该销毁的东西呢,就都销毁了。呃,那么另外呢,就是我们,呃,这个执行998次呢,Write record方法执行998次是在缓冲区里面放了998条数据,那么还没有到达我们一个批次999条的要求,所以说呢,当我们把这个改成999的时候,哎,就满足了我们一个批次有999条数据的要求,这个时候呢,后台线程触发一次向英拉DB写入的操作。
14:01
好,那么这些呢,就是我们全部的异步写入的知识。
我来说两句