深入理解 Java 基础相关知识、IO、常用集合等基础知识和研发经验;
深入理解Java并发包常用组件底层原理,研究过volatile,AQS,线程池核心源码,实践过ReentrantReadWriteLock提升读操作的并发性能
深入理解 JVM 底层原理及 GC 回收算法,熟悉 JVM 各种垃圾收集器的使用,对 JVM 调优有一定的见解
深入理解且熟练使用 Spring,SpringBoot,SpringCloud等开源框架
深入理解 Redis 线程模型,熟练掌握 Redis 核心数据结构的使用场景,熟悉各种缓存并发的使用场景。
深入理解Mysql Innodb存储引擎的缓冲池、事务、索引底层工作原理
深入理解ElasticSearch倒排索引,正排索引底层原理和使用全文检索,数据聚合和数据分析
掌握分布式系统开发经验,了解分布式系统的一些常见问题解决方案,比如分布式锁,分布式事务
多子系统中数据流转保证事务:
描述:由于项目多子系统的设计,例如,收集子系统库向综合库中心系统移交数据,收集子系统将部分数据移交的时候需要修改当前条目的状态,并且同时综合库中心系统新增移交对应的条目数据。
措施:使用事务补偿机制保证数据在移交的过程中数据的一致性,使用Redis发布订阅模式和业务的反向补偿机制实现了分布式事务,并且记录相关日志。使用状态机和数据库中的字段唯一性保证了接口的幂等性。
大文件上传优化:
描述:系统中主要是以条目数据和对应的原文的数据,涉及到许多大文件的上传。一般的文件都是在200M之内,但是有移交的情况一般就是2G~8G之间。
措施:为了解决大文件上传引发的OOM的问题做了分片上传和断点续传的功能,为了优化上传性能使用了NIO的方式,而非传统的BIO的方式。
多子系统共享元数据方案保证数据准确性:
描述:各个业务子系统中的存放的业务表是通过统一配置的元数据方案动态生成修改。
措施:使用Redission框架,将修改添加元数据加分布式锁,保证在并发场景下造成数据紊乱
对大字段数据存放数据库优化:
描述:业务需要对上传的文件实现各种维度的全文检索,上传原文之后会先对原文进行OCR操作抽取文本。
措施:使用ElasticSearch中间件,对原文的OCR操作之后的结果进行存储,将大量的查询工作交给ElasticSearch去做统计分析,从而降低了数据库的压力,避免数据库全表扫描
优化代码结构:
描述:部署方式环境不固定,使用的缓存中间件不固定,适配多套接口
措施:设计使用SPI机制实现多缓存源的设计(JVM层面缓存,Redis等其他缓存) 提升代码的可扩展性,单机部署没有缓存中间件时采用的缓存策略时结合SoftReference和ReentReadWriteLock提升读并发,提升性能。集群部署采用Redis或者其他缓存中间件,做单点登录和缓存数据。之后由于不方便维护直接使用Spring提供的
@ConfigurationProperties通过配置文件动态加载由不同的中间件实现的缓存。
描述:系统各个OCR厂商的对接适配各种各样的接口,造成多套接口代码混乱
措施:适配多套不同厂商不同版本的OCR,采用适配器模式解决适配多厂商造成的代码冗余便于维护
根据业务制定适合业务的线程池:
描述:系统中需要记录每个人对于每条条目的操作,也有同时在线批量挂接电子原文的操作。
措施:对于日志采集使用固定核心线程数+有界队列+CallerRunsPolicy拒绝策略,对于文件批量挂接操作使用指定非核心线程数+有界队列+CallerRunsPolicy拒绝策略。
定位线上问题:
描述:线上新增了一个功能,导致的大量请求RT的时间比平常的时间超出一倍。
措施:使用jstack命令导出线程dump文件和使用JProfiler工具定位问题,发现做软件授权的功能的时候做了一个AOP切面,每个请求都是从磁盘加载license文件,导致系统每个请求都比较耗时,优化在项目启动的时候将license文件中的信息加载到缓存中,优化了性能。