簡體   English   中英

異步API帶來更差的性能

[英]Async API giving worse performance

有趣的是,我認為有255個並發用戶,異步API會有更好的性能。 這是我的Spring服務器中的兩個端點:

@RequestMapping("/async")
public CompletableFuture<String> g(){
    CompletableFuture<String> f = new CompletableFuture<>();
    f.runAsync(() -> {
        try {
            Thread.sleep(500);
            f.complete("Finished");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });

    return f;
}

@RequestMapping("/sync")
public String h() throws InterruptedException {
    Thread.sleep(500);
    return "Finished";
}

/async ,它在另一個線程上運行。 我正在使用Siege進行負載測試,如下所示:

siege http://localhost:8080/sync --concurrent=255 --time=10S > /dev/null

對於async端點,我的交易次數為27 hits

對於sync端點,我獲得了1531 hits的交易數

那為什么呢? 為什么異步端點不能處理更多事務?

因為異步端點正在使用共享的(較小的ForkJoinPool.commonPool() )線程池執行睡眠,而同步端點則使用應用程序服務器的較大線程池。 由於公共池是如此之小,因此您可能一次運行4至8個操作(好吧,如果您叫sleeping一個操作),而其他人則等待輪到他們進入池中。 您可以將更大的池與CompletableFuture.runAsync(Runnable, Executor) (您還將方法稱為錯誤,這是一個返回CompletableFuture的靜態方法)。

異步並不是一種神奇的“使事情更快”的技術。 您的示例存在缺陷,因為所有請求都需要500毫秒,而您只是在異步請求中增加了開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM