1. 5年Java Web开发经验。
2. 熟练掌握Spring Cloud体系的分布式系统开发。
3. 熟悉node,Typescript,React,Vue等前端技术
4. 深入了解Oracle、Mysql关系型数据库
5. 熟悉MongoDB、Redis非关系型数据库
6. 熟悉互联网金融行业,资金清算结算平台的建设。
合同管理系统2017.06-2017.10
技术经理
λ 工作内容:
1. 实现文件分布式存储。
2. 完成Office文件在线预览、编辑、pdf转换功能。
3. 实现标准合同模板填充功能。
4. 实现文件签入、签出锁,实现文件版本管理、差异比较功能。
运用技术:
Java IO,Spring,SpringMVC,Mybatis,FreeMarker,MongoDB,Oracle。
项目问题:
1. 合同文件数量大且十分重要,传统的集中式文件管理难以保证可用性、容灾性。
2. 实现Office文件在线预览。
3. 实现标准合同模板填充、文件版本管理和差异比对。
4. 多人同时修改文件时,会产生冲突。
解决方案:
1. 搭建MongoDB分片加副本集高可用集群,利用其GridFS文件存储规范,实现文件的分布式存储。
2. 对比在服务器安装Libre Office,调用接口将文件转换成PDF实现在线预览的方案。最终选择了集成Office Online,实现WOPI协议接口,完成Office文件在线预览、编辑、pdf转换功能的功能。
3. 结合Word文件域功能,将需要填充的内容,进行域定义。然后使用FreeMarker模板引擎,将合同主数据填充至预先定义的域字段中。
4. 文件的同时修改,本质为一个分布式锁问题。为了实现方便,采用了在数据库中给文件操作打上标记来记录是否被正在被修改。使用用户ID作为锁标记,使锁可重入;记录锁失效时间,超时释放,避免死锁。
后续思考:
1. 可采用Java NIO技术,利用虚拟机外内存对IO操作进行优化。
2. 分布式锁还有Redis setnx和expire命令,以及Zookeeper分布式锁的实现方案
客户关系管理系统2016.08-2016.12
技术顾问
工作内容:
1. 产品、商机、报价模块的设计和开发。
2. ESB总线产品、客户、商机主数据推送接口的实现。
3. 操作记录功能的实现。
4. 客户分配策略的实现。
运用技术:
Java反射,Spring, Spring AOP,SpringMVC, Mybatis, Vue.js
项目问题:
1. ORM框架一般需要很多从数据库表到业务类的代码,人工书写容易出错。
2. 如何实现操作记录比对。
3. 日志存储失败会对业务数据存储进行回滚。日志存储操作阻塞了正常业务逻辑,影响执行效率。
4. 需要根据客户所属的行业或地域等信息作出其归属团队的判定,如何实现可配置的判定策略。
解决方案:
1. 分析Mybatis Generator源代码,使用Spring Boot和Vue.js开发了一个代码生成器。利用Jdbc获取数据库元数据和数据库表信息,实现了根据数据库表自动生成DTO、Mapper、Service、Controller的可视化代码生成器。
2. 最初设计的方案为数据库触发器实现,但影响数据库操作效率,移植性差。最终采用Spring AOP,拦截通用Mapper接口,结合自定义注解和反射,在执行插入、更新、删除操作时分析操作记录。
3.主事务方法中使用NO_ROLLBACK_FOR屏蔽日志异常,避免回滚主事务。但日志操作仍然会占用主事务执行时间,最后采用将日志操作任务提交给线程池异步处理。
4. 使用策略模式定义判定策略,使用责任链模式判定结果,对判定策略做缓存处理,仅在策略配置变化时做刷新操作,使用可重入读写锁,保证读与读不阻塞,读与写想阻塞。
后续思考:
1. 对于日志操作更加优雅的方式可以为,接触Kafka等消息中间件,在需要记录日志的地方发送日志存储队列,在日志处理类中订阅该队列,消费日志信息进行存储。可以更好地与业务逻辑相解耦。