跨服务调用时合并请求

已完成
对流程性能提升显著;

  • 流程用户插件中有大量用户查询,且每条数据都进行服务调用查询;
  • 将该类型的请求合并为一个远程请求统一处理;
  • 示例: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:减少频繁读取某个配置属性,可以使用本地变量来控制每个方法读一次

文档更新时间: 2023-07-12 15:38   作者:Eddy