00:00
OK啊来,接下来呢,我们就来去想一想这个解决方案啊,呃,那么你想去想这个解决方案,那么你就一定要先把这个问题的。原因啊,给他想得很清楚,想得很透彻。嗯,就是你的重复消费也好,或者说你的漏消费也好,它导致的这个原因是什么。对吧,就这两个问题的这个关键点在哪里。啊,你再最后看一下这个这两个图啊,它的关键点在哪里,同学们,我把这个盯一下啊,这是漏消费的,好来对比一下我们这个重复消费的。是吧,你看看这两个的关键点在哪里,同学们。怎么导致的这个漏烧费啊?啊,怎么导致漏消费啊,是不是先提交后写出啊,那怎么导致的这个重复消费呢?是不是先输出后提交啊。那你现在就发现就这俩哥们,好像谁谁在前,谁写在后都会有问题,对不对。
01:02
能理解我的意思吧,就目前来看,他写到钱,他写到后有问题吗?有问题,那他写到钱,他写到后有问题吗?他也有问题。诶,那我就搞不明白,你说你你们两个谁写到前谁写到后都有问题,那到底谁写到前谁写到后呢。是吧,那你就再去分析,你表象上看的是谁写到前,谁写到后都会有问题,但实际真正的问题原因是。写到后面的那个哥们儿,如果出问题了才会。出现我们的漏消费或重复消费吧。对吧,如果说我就这么写的,对吧,我成功提交offset了,我也成功写出数据了,你说我会有问题吗。或者说我就这么写的,我成功的写出数据了,我也成功的提交offset了,你说会有问题吗?不会有问题。对吧,所以说问题的根本点在哪呢?根本点是在他们两个。
02:00
不能分开。至于谁在前谁在后,我觉得无所谓。只要我能够保证,你们两个要么呢都成功,你们要么呢都失败。这不就搞定了吗?比如说我提交奥成功了,但是你写出数据失败了,OK,那我把你的提交呢,给他回滚,就相当于我没有提交。对吧,那这样的话呢,我的数据呢,可以什么重发就不会漏消费了,好那我写出成功了,但是我这个提交off失败了,好那我这个时候呢,把写出的数据回滚,就相当于我的数据没有写出,那你重发过来以后呢,我再做一次处理,是不是也相当于不是重复处理了呀。对吧,所以说问题的关键点在哪?关键点就在这俩哥们呢。你不能说让一个成功,让一个失败,你们两个要么都成功,如果要失败的话,你们都得失败,就说白了,你们做了事呢,都得回滚,就相当于你们什么都没有做。对不对,这样我就能够保证你这个数据呢,不会出现什么漏消费,不会出现出现什么重复消费了。能听懂我的意思吧,好行,那你把这个关键点能够分析出来以后呢,接下来就是我们的方案,什么方案呢?解决方案。
03:04
对吧,按照我刚才这个描述啊,大家肯定已经想到了一种解决方案。你看啊,我说你们两个要么同时成功,要么同时失败,你看这句话的描述。这不就相当于把答案告诉你了吗?这不就是在说什么说事物了呗,对吧?事物是不是就可以保证原子性,就是你们不可再分,就是我可就可以保证你们的这两个操作要么同时成功,要么同时失败。对吧,你们以前都学过事物吧?就如果说诶,你成功了,你失败了,好,那我把你的操作回滚一下,你成功了,你失败了,那我把你的操作回滚一下,就我们两个人保证要么都成功,要么都失败。对吧,同生共死。是不是,所以说你看第一种方案我们就想出来了,怎么解决呢?通过事物来解决,来看一下吧,我这里面也给大家去提了啊,就是解决这个我不要了啊,这个问题的解决啊,策略的第一种策略就是通过事物方案来去解决,你看我是怎么解决的啊,非常简单,就我刚刚描述那个过程,现在的问题就是他们两个呢,不能够分开,对吧,你给它,你得把它们两个绑到一起。
04:12
怎么就绑到一起了呢?做成事物啊?对吧,做成事物不就绑定到一起了吗?做成事物以后呢,你们两个就是一条船上的蚂蚱,对不对?要么我们同时都成功,要么我们同时都失败。啊,就是所谓的同生共死啊,所以你看一下,将写出数据和提交做成事物进行原子绑定,就是不可再分,你们两个不能够分开处理啊,你必须得什么原子绑定,然后呢,达到什么同生共死。这样我就可以解决这个问题。理解了吧?来先从这个思想上去想啊,这个方案肯定是可行的啊,肯定是可以怎么解决这个问题的啊,那你有了这个方案以后,接下来你要想的就是落地啊,那我在我当前的这个情况里面,我方不方便或者说呢,我合不合适使用这个事物来去解决,就把他们绑定到一起。如果我要去落地的话,我应该用什么方式来去做?
05:03
对吧,这就是你接下来去分析的,来,那我们一起来分析一下,这种方案其实放在我们目前来讲呢,它并不是很合适啊,为什么呢。因为有这么几个痛点啊,来说一下。嗯,再见。啊,就它的好处是什么呀,我一定能够保证你的精确一次消费,对吧,如果说你想了这个方案,你都保证不了这个精确一次消费,那你这个方案肯定是不行的。对吧,这种方案一定是可以保证的,但是它有很多限制,你能明白吗?同学们,首先第一种限制。你要用事物了,那我问你,你是不是得去找一个能够支持事物的这个主将来去做这个事情啊。那可不是说我自己随随便便,我想写15就写15的啊,同学们,你得找一个什么支持事物的主件。那你就想吧,现在我们两个问题,一个是提交oppositeset对吧,一个是写出数据OK吧,那你说我现在数据呢,我写到了这个卡不卡,对不对,我数据写到卡夫卡,然后呢,我的这个outside也是提交卡卡他。
06:04
支持我们这个所谓的这个数吗。就他能帮我去做这个原子绑定吗?你一封信好像不行。对吧,那你就得换组件,换什么组件呢?比如说诶我买soq支持呀,我们都知道是吧,我的my soq是支持的呀,OK,那这个时候你要怎么做呢?那你就得把你的数据呢,写出到你的MYSO口,把你的offset呢也在MYSQL里面做一个维护,就他们两个同时去通过MYSQL去实现。对吧。那这个时候就是你要把数据呢,都放在一个什么关系型数据库中。能不能听明白我的意思,这个时候你想想吧,你用你说把我这个数据呢,我再写出来,我这个买烧烤合适不合适啊,我们当前这个场景。你把这个数据拆分成这个明细数据了,然后呢,明细数据本来也很大,你又把它写到MYSQL了,那你写到MYSQL以后影不影响我的这个实时处理过程呢?那肯定是会影响的呀。对不对啊,这是一个痛点啊,好,第二个就是事物本身性能不好啊,这个也是必须的啊,你的为什么这个事物它能够保证你这个精确一次呢?它肯定会什么,通过各种各样的操作,然后呢,去保证你们不被分开,对吧,而且的话,当有一个成功以后,另外一个失败了,那我还要去回滚,那么他要做很多操作,说它本身的事物的性能是不太好的,这也是一个痛点。
07:23
理解吧,好,那么还有一个痛点是什么呀?如果说你保存数据量较大,一个数据库节点不够,那你多个节点的话,你还得考虑分布式事物的问题啊,就说白了,我的数据要我买买买小狗写,但你是大数据场景啊,你说你我买搜狗写,我不一定能够搁得下。那我就可能考虑什么搞个买车,或者什么集群啊,或者怎么着的,对吧,我有很多台机器,那你要往不同的机器里面去写。关键你的事物的控制是一个呀,对吧,你这一个事物要控制什么,控制往多个MYS节点写这个,如果你要放到我们这个Java层面的话呢,我们有一个数专业的叫法叫什么叫分布式事务。
08:04
这个玩意就更不好做了。你能明白吧,你要说单节点的对吧,那我鸡蛋呢,放到一个篮子里面,我还好管理,现在呢,你把它什么分到不同的篮子里面,你要统一做这个状态的一个管理。对吧,这个事情呢,还是很难的。啊,这个有有兴趣的同学,你可以找这个Java的同学跟他们聊一聊这个分布式事务啊,看看他们怎么做的啊,现在这个比较主流的通过主K呀什么呀都可以去做啊,你得什么借助于什么第三方的主件,然后呢去做这个事儿很麻烦的。对吧,当然呢,也有人呢,他会这么去做。怎么做呢?就是他会这样。我们在处理的时候,我们的数据啊,它一定是什么分并行度的,对不对,比如说我们有这个四个并行度。对吧,我有四个并行度,那我的数据呢,在这个四个并行度中呢,分别去做了这个分流操作,但是我在写出去的时候呢,我可不在并行度里面去写,我怎么做呀,我把这四个并行中的数据呢,我统一都给它拉回到我的driver端,那听懂我统一都拉回到driverva端,然后这样的话呢,我的数据呢,又从多个篮子,然后呢,变到了一个篮子中,我在Java端再把数据呢往我的下一层去写。
09:14
我可以这么去做。这样的话呢,我就不用去考虑你的分布式的事物,我在什么,单点事物就可以了,单机事物就可以做到这个事情。好,但这种的限制是什么限制就是如果你的数据量很大,你在每个并行度里面去做还OK,你统一都拉回到这个抓尾端,首先你的抓尾端能不能顶得住,再一个就是你的数据要什么呀,来回传输。对吧,你从你的ex,你把它怎么拉回到我这个Java端,那这个不得传输数据吗。是不是?啊,你这个都会造成你这个性能的一个影响。明白了吧,啊,所以说如果说你的,诶,我的数据量很小对吧,那我觉得你这么试一试呢,还可以,那如果你的数据量很大,你就别想了啊,这种方案肯定不适合你。
10:00
明白了吧,肯定不适合你啊,所以说我们使用这个事物,它的限制呢就会比较多啊,限制呢会比较多,因此你就要去衡量一下,我们在目前这个环节中,我们到底要不要用这个事物来去解决,如果说我不用事物解决的话,那我还有没有别的方案?对吧,哎,你要去想想。好吧,行。呃,那我们刚才这个事务方案的话呢,这个我们在目前的场景中,我们就不选择它了,但是呢,将来大家可以在适当的场景里面去选择它,比如说你的数据量的足够少,就是你这个比如说经过聚合以后的数据量都比较小了,对吧,那你可以怎么把它拉回到你这个Java端啊,拉回到你的这个Java端,然后呢,再。统一写数据库,而且的话呢,你写数据库的话也要保证什么呀,就是你是聚合以后的结果,就说白了,这个结果我已经什么算出来了,对不对,那我就可以去用的结果了,那我觉得你写到买so中还是比较合适的,但如果说你就是一个中间处理的一个状态,比如说我把数据拆成明细了,我还没有什么做过任何的聚合操作,你就把它写到买买sol里面。
11:01
那这个是不合适的,因为这个数据量会变大,你写到MYSQL肯定不合适。对吧,而且呢,你下一层还要进行处理呢,你下一层你不能说让我从你的买车后拿数据吧。对吧,这都不合适好吧,所以说呢,你的数据量比较小,而且呢,你是经过聚合以后的数据,那这个时候我觉得你写到MYSQL,或者是写到什么支持这个事物的数据库,呃,还是可行的。但现在我们这个地方,我们数据下一层写到什么地方了,同学们,我们的下一层还在卡不卡。而且我们这个数据呢,并不是什么所谓的聚合以后的数据,我们是拆分以后的明细数据。对吧,方方面面啊,都其实跟你这个事物呢,不太靠谱啊,不太这个不能说靠谱啊,不太这个呃,不太对付对不对啊,所以说呢,事务方案能用,但是在目前的场景中我们不用。理解了吧,啊,把这个事情给大家说明白啊,OK。
我来说两句