壓測中測量異步寫入接口的延遲

在服務端性能優化的時候,有一種方案叫 「異步寫入」。就是把原本要寫入數據庫的功能放到異步來作,跟異步查詢轉同步的區別在於,異步查詢是要等結果的,而異步寫入則能夠不等返回結果,甚至直接把寫入任務丟到一個專門的任務隊列中。數據庫

在對於實時性要求並不高的業務來說,這是一個很是值得推薦的方法,好比用戶消費了一筆金額場景中,對於用戶消費信息的記錄以及消費帶來的積分提高、會員等級提高均可以異步來實現。平常接觸最多的異步應該是日誌和打點系統,幾乎沒有見過非異步實現的方案。編程

異步寫入帶來的另一個問題就是 「延遲」,通常開發會給出一些延遲的參數值,可是在性能測試過程當中這個值可能會很是大,甚至超出用戶的可接受範圍。這個時候就須要測試 延遲在不用壓力狀況下的數值大小,以便給出最好的服務負載數據。性能優化

下面分享一個檢測用戶更改我的信息的接口的延遲測試方案:框架

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}"
    }
}

上面的參數能夠根據實際大小來調整,一邊壓測一邊另起進程測試寫入接口的延遲狀況。異步


  • 鄭重聲明:文章首發於公衆號「FunTester」,禁止第三方(騰訊雲除外)轉載、發表。

技術類文章精選

非技術文章精選

相關文章
相關標籤/搜索