帅气的毛毛侠

导航

2017年在技术方面的总结

去年的8月到今年的4月,做数据接入这个程序,一直做的是数据的抽取,以及公安接口的程序,原先的ETL抽取速度很慢,项目经理要求提高速度性能,刚开始是往并发方面去想,但是,增加多线程抽取(oracle)后发现与单线程抽取并没有很大幅度的提升。因此,我觉得性能瓶颈不是由单线程引起的,因此,去年春节下班前,将项目中抽取相关的部分代码整理出来,组成一段小程序,回去研究。具体如下:

1、简单过滤流程速度的提升:对于工具中原有的简单过滤进行修改,经过去年过年时,单独提取抽取流程,进行研究,发现(事实上应当从执行最多次的那段代码入手)ETL工具在简单过滤(过滤‘;“:/。等一些特殊字符)这个环节消耗时间太长,因此将此函数单独进行性能测试,原先的函数是通过java自带的,比如indexOf(int ch) , replace(char oldChar, char newChar) ,replaceAll(String regex, String replacement)等函数完成,查看了indexOf函数源码之后,发现查找算法是暴力查找法,而replace和replaceAll函数则是采用正则表达式算法在流程上也做了一些冗余操作,因此认为这段过滤算法有改进的空间,通过对比正则表达式过滤、空间换时间等算法的试验后,发现使用正则表达过滤时,如果匹配到的特殊字符串是空,则效率很高,但是如果匹配到的特殊字符比较的多,则性能就会下降;空间换时间的算法是:将待过滤字符串转换成字符数组,每一个待过滤字符,与特殊字符数组进行逐个比较,如果不是特殊字符,则放到另一个新的数组中,否则就跳过。虽然这种算法很简单,但在这里起到了很大的作用,比起使用正则,这个函数要稳定许多。

 

2、将单线程,修改为多线程(oracle全量抽取):在修改为多线程时,编程也遇到了很多的问题。首先将整个SQL的构造进行修改(原先是直接执行SQL查询语句,获取游标),使用rowid将数据分组(也想过使用分页进行查询,但是通过了解,oracle数据库的分页(rownum)会在数据的插入和删除操作后,前后查询出来的数据会有所不同,会造成数据的重复抽取,或者漏抽),64位的rowid经过合理的拆分后被分组(我拆出了后四位--AAAA-/H//--组装最小和最大后,使用between 子句,就能获取在此rowid区间的数据)。解决了并发时所用的SQL语句问题后,随之而来又并发问题:在程序之初,我使用wait和notify进行并发的控制,程序写的比较臃肿,逻辑比较复杂,后来参考了《java编程思想》以及《Java并发编程实战》等书籍后,对程序进行改写,使用了volatile修饰中断信号变量,concurrentHashMap用来存储共享信息,使用CountLatch进行并发控制,使用ThreadPoolExecutor进行线程池的开启,减少了代码,也提升了程序的鲁棒性。在之后,了解到了有fork-join框架之后,就想再次改写此逻辑流程,但是会破坏原线的任务调度框架。因此没能进行进一步的调优。

 

3、公安接口:接触了23种WebService的调用方法,具体的暂时无。

 

4、FTP同步软件:使用Quartz调度程序,每一次上传或者下载需要就需要连接一次或者释放一次(这也是我想改进的地方,自己写个连接池什么的,但是耽搁了,就没有写了,目前程序会造成FTP服务器压力比较大,程序中也规避了由FTP连接所造成的问题,正常执行是没有问题,效率上也没有问题)。目前支持,从FTP下载到本地,从FTP到FTP,从本地上传到FTP等功能(保留原目录级联),在写整个程序的时候,唯一遇到的问题就是:FTP上获取路径不能直接获取,需要使用递归函数,进一层,保存本层的路径,进一层保存路径……直到将FTP上的路径全部访问完,也就获取到了所设定的FTP路径下的所有子目录,保存在了list中,进而在下载(或者上传)时,遍历此目录,将各个目录下的文件取得,并下载到本地目录

 

今年5月开始到现在,接触的是全息侦控项目:

这个项目的问题在于,之前的前端程序与后端程序之间耦合度太高(有些表都是共用的,前端是以服务的方式调用我方后台程序),这就导致了我后端开发人员需要了解前端的某些业务逻辑,否则表里的字段不会一 一清楚明白,因此在开发之初,显得有些懵逼,除此之外我记得有一次,现场报来bug,说是我们的程序停住不执行了,后来经过我们的排查,发现是前端那边将数据库里的内容修改了,没有及时的提交,导致我们程序在执行SQL时,等待数据库锁的释放,就不往下执行了。接触这个项目的主要目的就是为了推到重做,将前端和后台彻底分离,自己维护自己的表,目标是做成组建的方式,加入中间件,解耦合。因此在中间件方面采用了RocketMQ3.2.6版本和Kafka0.9版本(kafka的加入,完全是为了公司的统一--数据文件传输使用kafka)。整个侦控项目设计到的技术有:Spring+Hibernate+RocketMQ+Kafka。对于Spring,用到了常用的IOC,Hibernate常使用HQL(对于跨Session更新,需要有ID字段)(线程绑定session等知识),RocketMQ的存储使用了零拷贝,以及RocketMQ服务器的推送功能是利用了Ajax的长连接完成等等。在做全息侦控这个阶段,学习了各个技术的大概的原理,均没有深入实践。

posted on 2018-02-25 23:12  帅气的毛毛侠  阅读(105)  评论(0编辑  收藏  举报