問題描述:由於業務原因,網站並發一般發生在晚上1點左右,持續半個小時,某晚移動端商品圖片加載不出來,公司大佬緊急聯系各個負責人,高峰期過后恢復正常,第二天查找原因,從商品查找到了ES這邊。接手項目前聽說由於CPU100%掛過一次,測試壓力測試查詢並發在每秒80左右就不行了,於是增加機器負載,連續幾天還是接二連三的報警,於是仔細查看了代碼。性能測試結果如下:
解決方案:發現主站搜索用的是API方式Post提交搜索,出問題的幾個接口是使用客戶端搜索,換成了API方式后性能提升可以看的到,大概是客戶端查詢的5倍,看來官方的Client也不是很靠譜。。。
主要代碼如下:
//API查詢方法 public static GoodsSearchReturnModel GetList(object query) { var model = new GoodsSearchReturnModel(); var url = ConfigHelper.GeElasticSearchUrl() + "goods_index/_search"; try { var r = HttpClientHelper.PostAsJsonAsync(url, query); var result = JsonConvert.DeserializeObject<ResultModel<GoodsIndexModel>>(r); if (result != null) { if (result.hits.hits != null && result.hits.hits.Any()) { result.hits.hits.ToList().ForEach(a => { model.GoodsList.Add(a._source); }); model.Total = result.hits.total; } } } catch (Exception ex) { LoggerHelper.GetLogger("SearchApiLog").Info(string.Format("{0}服務調用失敗{1},錯誤原因{2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), url, ex)); } return model; }
在瀏覽器中的數據管理端可直接模擬操作