現象:某產品查詢客戶可訂購商品的功能,經過(guò)兩年的需求迭代,校驗規則越來越多,查詢效率越來越慢。
分析(xī):借助Arthas工具分析商品查詢調用鏈上的每(měi)一步耗時,發現規則(zé)引擎執行耗時嚴重。進一步(bù)對(duì)規則引擎進行分析發現:
① 單個規格執(zhí)行耗時很短(duǎn),隻需十幾毫秒,但存在300多個規則,導致總體規則執行經常超過4S;
② 每次請求都重新(xīn)生成了多(duō)個規則(zé)引擎對象(xiàng),導致規則對象內存占用高達幾G,從(cóng)而頻繁觸發FullGC;
③ 業務邏(luó)輯對執行的規則缺少細分,所有規則都會執行。
解(jiě)決方案:通過優(yōu)化規則執行方法:
① 梳理出簡單規(guī)則,簡單規則不使用規則引擎engine.evals,改(gǎi)為直接比較(jiào)法進行判斷;
② 創建(jiàn)規則引擎池JsScriptEnginePool,減少規則引擎重複創建;
③ 業務規則增加狀態,隻(zhī)檢索有效的規則進行執(zhí)行。
優化前:10個並發(fā), tps在1.6左右,請求平均耗時7.5s(再增加並發量就大麵積請求(qiú)異常)。
優化後:100並發(fā)用戶時,平均tps為102,請求平均耗(hào)時在1s內。