您的当前位置:官网首页 > 新闻动态 > 团队活动 >

4次版本迭代,我们将项目性能提升了360倍!

时间:2019-08-27

接下来就是具体实现类的问题了,这里实现类主要实现的是三个功能:


1、接收上一环的数据:

属于Interactive接口的receive方法的实现,基于之前的设计,即是对象中有一个ConcurrentLinkedQueue类型的属性,用来接收上一环传来的数据。

2、处理数据并传递给下一环:

在每一个对象属性中,放入下一环的对象。如Reader中要有Processor对象,Processor要有Writer,一旦有数据需要加入下一环的队列,调用其receiive方法即可。

3、告诉下一环我结束了:

本任务结束时,调用下一环对象的closeInteractive方法。而每个对象判断自身结束的方法视情况而定

比如Reader结束的条件是批量读取的数据超过了一开始设置的total,说明数据读取完毕,可以结束。

而Processor结束的条件是,它被上一环通知了结束,并且从自己的队列中poll不出东西了,证明应该结束,结束后再通知下一环节。

这样整个工序就安全有序地退出了。不过由于是多线程,所以Processor不能贸然通知Writer结束信号,需要在Processor内部弄一个计数器,只有计数器达到预期的数量的那个线程的Processor,才能发起结束通知。

5.2、效率问题:

正如上一版提出的,Processor的处理速度要慢于Writer,所以Writer并不需要用batch去处理数据的插入,该成逐条插入反而是提高性能的一种方式。

大数据量limit操作十分耗时,由于测试部分只是在前几百万条测试,所以还是大大低估了效率的损失。在后几百万条可以说每一次limit的读取都寸步难行。

考虑到这个问题,我选去了唯一一个有索引并且稍稍易于排序的字段“用户的手机号”,

每次全表将手机号排序,再limit查询。查询之后将最后一条的手机号保存起来,成为当前读取的最后一条数据的一个标识。下次再limit操作就可以从这个手机号之后开始查询了。

这样每次查询不论从哪里开始,速度都是一样的。虽然前面部分的数据速度与之前的方案相比慢了不少,但却完美解决了大数据量limit操作的超长等待时间,预防了危险的发生。

至此,项目架构再次简洁起来,但同第一版相比,已经不是同一级别的简洁了。 

1、Reader部分是单线程在处理,由于读取是从数据库中,并不是队列中,因此设计成多线程有些麻烦,但并不是不可,这里是优化点

2、日志部分占有很大一部分比例,2000万条读、处理、写就要有至少6000万次日志输出。如果设计成异步处理,效率会提升不少。


Copyright © 2018 凯发k8凯发k8-凯发k8真人 All Rights Reserved