00:00
接下来呢,我们来去分析一下那我们的乐观所存在的一些问题。那么刚才呢,咱通过测试啊,月月同学呢,应该已经发现了一些问题了啊,那么首先第一个问题就是在高并发情况下情况下,那么性能性能极低啊,性能非常低下。那我们可以发现,咱们在压力测试过程中啊,我们随着吞吐量的上升啊,随着并发量的上升,比如说我这里呢,每次是发送100个请求,那发送发送50次。那么刚开始呢?在我的系统里面没有累积那么多并发量的情况下,它性能呢还是可以的啊。那随着这个并发量的上升,随着我这个请求越来越多,它吞吐量呢,会越来越低,越来越低。那么直到呢,200多的并发量。比我们的悲观,锁的性能反而更低了。更低了。二、三、乐观锁,现在高并发情况下反而不太适合使用乐观锁。
01:05
因为呢,我们的重试就变得越来越频繁了,因为我可能在高并发情况下啊,那我可能刚刚查过就被其他人给更新掉了,我刚刚查过呢,就被其他人给更新掉了,他可能进行反复的进行重试啊,重置次数呢变得极多越来越多。好,那么然后呢,他也会浪费我们的CPU资源,因为不停的重试。啊,代码呢,不停的运行。然后呢,反而会浪费更多CPU资源啊。而我们使用阻塞所。比如闭关锁,它会阻塞住,在锁那个位置的话呢,会进行等待。而反而呢,可能性能要高一些,因为它不会浪费我们的CPU资源。它是它啊第一个特征,那么然后第二个特征呢,我们来看啊,除了这个性能之外,它还会出现一个极常见的问题,那么这个问题呢,是由于CS导致了啊。
02:01
只要是CS,它都有可能会出现ABA问题。那么什么是ABA问题呢?API问题呢,是这样子的,比如说呢,我们有一个XX的变量。那我现在呢,要去更新X变量,你首先肯定要先查询X的就值,比如说我查询的结果呢,X等于A。那么此时呢,第二步我要去更新操作了啊,来做更新操作。那么更新的话呢,你得要先判断X的值是不是等于我之前查询那个旧值。如果等于我这个产品个旧值的话,我可能要把X的值呢更新为其他值。比如更新为呢,那AA这个值对不对啊,AA这个值。那么在这个中间有可能呢,会有其他人做一些非法操作。那比如说呢,有人呢在中间横插了一脚,把X的值呢定义为B了。然后可能又更新为C了。那朋友更新为。D了啊。
03:00
那最终呢,诶,他怕被别人发现,又偷偷的把X值呢,又更新回A了啊。又回到这个A了。那这就出现了ABA问题。最终你更新的时候,那么你这个等式依然成立,更新依然可以成功,但是其实这个值呢,早早已经发生变化了,只是呢,就你不知道而已。那这就假如说呢,比如说你谈了一个女朋友,那跟你分手了。那中间呢,空床了三年,谈了好几个男朋友。那最后呢,关系跟你和好了。那你不知道啊,那你不知道你有以为呢?哎,那他就你啊,你就是他唯一的一个男人呢。但是呢,此时不一定了啊。啊,这个所谓什么所谓的ABA问题。好,那么然后第三个问题呢,就是什么呢,就是我们的这个。就是在这个读写分离的情况下情况下,可能会导致咱的所机制等等不可靠,或者说乐观锁不可靠啊,导致乐观锁等等不可靠。
04:12
读写分离我们都知道,那么它其实是一种主从复制啊。那一般呢,我们搭建组,从集群的情况下,那我们一般写是从组里面来写数据的。那么让读的话呢,我们会从从里面来去读取数据。那么然后呢,组从怎么同步数据呢,那同步数据呢,其实就这样子的,我写完之后呀,那么组呢,会把自己的写操作记录到一个浪日志里面去,那么也就是说它是一个二进制的日志。好,那么进入到日志之后啊,那我们的从它会不停的从组里面发送请求,从组里面来拉取冰岛日志。
05:00
然后获取到b log日志之后呢,它会记录到自己的relay log日志里面去啊叫re。Log日志,那么啊,这是一个啥呢?这是一个中继日志啊,中继日志那么进入进去之后呢,那么它会不停的来去读取,然后进行重做重演啊,来一个reply,那翻过来就重做重演的意思。那么也就是说,比如说呢,我向组里面来去in射一条数据,那么它会把这个搜数语句啊记录到我们的冰冷日志。或者呢,把我们新增的数据啊,进入到冰岛的日志。那么记录进去之后呢,然后呢,它会拉取。瑞拉去这个冰冷日志,那么从啊,那么进入到自己的日志里面去。然后呢,把这个词汇语句,然后呢,进行重做一次啊,重演一次啊,来再重里面也去执行一下。那么执行好之后啊,那么从里面的数据就和组里面的数据呢,就一样了。
06:01
和它组成同步呢啊,还是需要过程的啊。它需要那么几次IO操作呢,那么主要记录到槟榔日志,它肯定要有一次IO操作啊。那么然后呢,咱读取出来响应给我的从是也需要一次IO操作,它需要读取出来啊,也需要IO操作。那么从它要从组里面来,以拉取冷为止。那么发送一次请求以及响应。它经过网络传输啊,就是网络IO。那么然后呢?我们进入到自己的中继日志。那寄到终极值也需要IO操作,那读取出来进行reply也要进行IO操IO的操作。所以呢,他们延迟呢是比较大的。延迟是比较大的。那就会导致呢,经常性的在高并发情况下啊,我们从从里面往往读取到的是一个旧的数据。但是我的组里面呢,可能已经是新的数据了。
07:04
那么此时呢,你去查,查的一直是旧的数据,那总是呢,会更新不成功啊。定义不成功,那在高并发情况下,那即使你读取到新的数据了,还有可能会不成功的,那如果你读取到的本来就是旧的数据。那肯定会失败呀。所以呢,使我们的乐观所啊就会愈发的艰难。啊,从事次数呢,又会增加不少。好是咱们这个乐观所的缺点呢,我们就分析到这。
我来说两句