现象:某产品查询客户可订购商品的功能,经过两年的需求迭代,校验规则越来越多,查询效率越来越慢。
分析:借助Arthas工具分析商品查询调用链上的每一步耗时,发现规则引擎执行耗时严重。进一步对规则引擎进行分析发现:
① 单个规格执行耗时很短,只需十几毫秒,但存在300多个规则,导致总体规则执行经常超过4S;
② 每次请求都重新生成了多个规则引擎对象,导致规则对象内存占用高达几G,从而频繁触发FullGC;
③ 业务逻辑对执行的规则缺少细分,所有规则都会执行。
解决方案:通过优化规则执行方法:
① 梳理出简单规则,简单规则不使用规则引擎engine.eval,改为直接比较法进行判断;
② 创建规则引擎池JsScriptEnginePool,减少规则引擎重复创建;
③ 业务规则增加状态,只检索有效的规则进行执行。
优化前:10个并发, tps在1.6左右,请求平均耗时7.5s(再增加并发量就大面积请求异常)。
优化后:100并发用户时,平均tps为102,请求平均耗时在1s内。