作者:Eddy 历史版本:1 最后编辑:Eddy 更新时间:2024-10-24 16:08
编写版本:v3.3.7
适用版本:所有版本
跨服务调用时合并请求
已完成
对流程性能提升显著;
- 流程用户插件中有大量用户查询,且每条数据都进行服务调用查询;
- 将该类型的请求合并为一个远程请求统一处理;
- 示例:
com.lc.ibps.bpmn.plugin.task.userassign.plugin.UserQueryPlugin.filterUser(List<BpmIdentity>, List<BpmIdentity>)
中调用com.lc.ibps.org.api.IPartyEntityService.trans(PartyEntityTransVo)
,有效减少网络消耗; - 合并处理后使用多线程并行计算用户数据,逻辑在
com.lc.ibps.org.api.IPartyEntityService.trans(PartyEntityTransVo)
中处理;
org.slf4j.Logger对象静态化
已完成
影响全平台日志输出性能,积少成多的瓶颈;
- IBPS中大量使用org.slf4j.LoggerFactory.getLogger(getClass())获取日志对象并输出日志;
com.lc.ibps.base.framework.repository.AbstractRepository.get(PK)
中日志对象创建耗时的影响尤为突出;- 将Logger操作对象静态化,如:
private static final Logger LOGGER = LoggerFactory.getLogger(DataTemplateRepositoryImpl.class);
,可减少方法执行时创建时间;
动态获取系统配置属性优化
已完成
影响全平台配置读取性能,积少成多的瓶颈;
- 框架中频繁调用Environment.getProperty,导致累计耗时增加,对业务的影响直线上升,使用线程上下文隔离配置属性的获取,同一个线程中只从Environment中获取一次,之后都从线程上下文获取,从而减少Environment.getProperty的调用次数;
- Environment.getProperty对功能的影响:所有业务功能,包括服务发现(eureka)、网关(zuul)、认证服务、业务服务;
JSON工具优化
已完成
影响流程、表单性能,有效提升性能;
- JSON框架json-lib框架老旧、性能较低,因此需要替换该框架,将切换到
Jackson
; - JSON框架对功能的影响:表单(所有功能都受影响)、流程(受影响功能:审批意见);
BeanUtils.copy调用优化
进行中…
平台级提升;
- 缓存对象读取后全局调用BeanUtils.copy,导致很多不必要的损耗;
- 将ObjectStream方式改为其Kryo方式复制;
- 去掉只读场景的BeanUtils.copy调用;
Domain这层的原型对象创建过程优化
完成
平台级提升;
- Domain这层大对象的创建耗时在150ms左右,再加上频繁调用导致累计耗时增加,对业务的影响直线上升,目前尝试修改创建方式;
- 框架级问题,影响所有业务功能;
- 优化方案:将Domain改为单例对象,内部参数改为形参传递;
流程定义JAXB优化
未开始
- 流程定义中使用JAXB做xml与对象转换,效率有点低;
com.lc.ibps.bpmn.core.xml.BpmnXmlUtil.unmarshall
;
慢SQL优化
进行中…
- 流程引擎慢SQL查找、分析、解决;
缓存设计优化
进行中…
- 用户上下文缓存;
完成
- 表单定义计算结果缓存;
完成
- 数据字典缓存;
完成
- 菜单资源缓存;
完成
- 接口权限缓存;
未开始
- 持续中…
流程异步方案
进行中…
提升体验,并非性能解决方案;Request存在序列化问题暂时无法实现一键重试
;
- 流程切换使用异步接口;
- 通过socket推送消息提示成功或失败;
- 失败后在失败列表重试,重试时直接跳转到流程启动/审批页面并自动回填数据,手续操作由人工干预;
优化Web容器参数
- Undertow
- UNDERTOW_IO_THREADS=20 #与服务器CPU线程数一致
- UNDERTOW_WORKER_THREADS=256 #可以根据机器情况增大
- UNDERTOW_BUFFER_SIZE=1024
- UNDERTOW_DIRECT_BUFFERS=true
MySQL参数调优
进行中…
binlog_cache_size = 64M
binlog_format = mixed
max_binlog_cache_size = 128M
max_binlog_size = 200M
sync_binlog = 10
binlog_group_commit_sync_delay = 1
binlog_group_commit_sync_no_delay_count = 100
日志输出前判断日志级别是否开启
if(logger.isTraceEnabled()) {
logger.trace("Handle method argument not valid exception...");
}
if(logger.isDebugEnabled()) {
logger.debug("Handle method argument not valid exception...");
}
if(logger.isInfoEnabled()) {
logger.info("Handle method argument not valid exception...");
}
if(logger.isErrorEnabled()) {
logger.error("Handle method argument not valid exception...", e);
}
字符串拼接禁止使用“+”来处理
使用StringBuilder或StringBuffer替换
配置属性获取增加适当的静态处理
如:用户验证码获取,captcha配置对象获取消耗CPU资源过高,需要做静态化处理,赋值给内部变量,不要每次都去解析生成新的属性对象。
加密算法使用性能更高的工具实现3.5.6+
使用java security或spring security
Bean注入方式不能使用字段注入方式3.5.6+
应该是使用构造函数注入或setter注入方式
注:
1、继承关系不能重复定义字段、重复setter,会造成属性为空
2、慎用Lazy注解
减少频繁计算3.5.6+
例1:减少频繁读取某个配置属性,可以使用本地变量来控制每个方法读一次