在服務端性能優化的時候,有一種方案叫 「異步寫入」。就是把原本要寫入數據庫的功能放到異步來作,跟異步查詢轉同步的區別在於,異步查詢是要等結果的,而異步寫入則能夠不等返回結果,甚至直接把寫入任務丟到一個專門的任務隊列中。數據庫
在對於實時性要求並不高的業務來說,這是一個很是值得推薦的方法,好比用戶消費了一筆金額場景中,對於用戶消費信息的記錄以及消費帶來的積分提高、會員等級提高均可以異步來實現。平常接觸最多的異步應該是日誌和打點系統,幾乎沒有見過非異步實現的方案。編程
異步寫入帶來的另一個問題就是 「延遲」,通常開發會給出一些延遲的參數值,可是在性能測試過程當中這個值可能會很是大,甚至超出用戶的可接受範圍。這個時候就須要測試 延遲在不用壓力狀況下的數值大小,以便給出最好的服務負載數據。性能優化
下面分享一個檢測用戶更改我的信息的接口的延遲測試方案:框架
package com.okayqa.teacherpad import com.fun.utils.RString import com.okayqa.teacherpad.base.OkayBase import com.okayqa.teacherpad.function.UserInfo class T extends OkayBase { public static void main(String[] args) { def base = getBase() def info = new UserInfo(base) def total = [] def diff = [] 100.times { def uname = RString.getString(5) def result = info.updateInfo(1, uname) int i; if (isRight(result)) { def mark0 = getNanoMark() while (true) { def mark00 = getNanoMark() def userinfo = info.getUserInfo() def mark01 = getNanoMark() diff << mark01 - mark00 if (userinfo.getUserInfo().getString("uname") == uname) break; if (i++ > 5) break } def mark1 = getNanoMark() total << mark1 - mark0 } else { fail() } } //求平均值的兩種方法 def var = diff.sum() / diff.size() def average = total.stream().mapToInt().average(); output "單次修改信息延遲約${average - var / 2}" } }
上面的參數能夠根據實際大小來調整,一邊壓測一邊另起進程測試寫入接口的延遲狀況。異步