現象:某產品查詢客戶可訂購商品的功能,經過兩年的需求迭代,校驗規則越來越多,查詢效率越來越慢。
分析:借助Arthas工具分析商品查詢調用鏈上的每一步耗時,發現規則引擎執行耗時嚴重。進一步對規則引擎進行分析發現:
① 單個規格執行耗時很短,只需十幾毫秒,但存在300多個規則,導致總體規則執行經常超過4S;
② 每次請求都重新生成了多個規則引擎對象,導致規則對象內存占用高達幾G,從而頻繁觸發FullGC;
③ 業務邏輯對執行的規則缺少細分,所有規則都會執行。
解決方案:通過優化規則執行方法:
① 梳理出簡單規則,簡單規則不使用規則引擎engine.eval,改為直接比較法進行判斷;
② 創建規則引擎池JsScriptEnginePool,減少規則引擎重復創建;
③ 業務規則增加狀態,只檢索有效的規則進行執行。
優化前:10個并發, tps在1.6左右,請求平均耗時7.5s(再增加并發量就大面積請求異常)。
優化后:100并發用戶時,平均tps為102,請求平均耗時在1s內。