2017-04-11 46 views
0

我有一個大約2000個用戶對象(地圖)的數組,我需要調用API來獲取用戶詳細信息 - >處理響應 - >儘快更新我的本地數據庫。我使用Go的waitgroup和goroutine來實現併發請求發送方法,但是如果要調用2000個請求,我的2014 Macbook Pro需要大約24秒。無論如何要讓它更快?發送多個HTTP請求的最快方式

var wg sync.WaitGroup 

json.Unmarshal(responseData, &users) 
wg.Add(len(users)) 

for i:= 0; i<len(users); i++ { 
    go func(userid string){ 
     url := "https://www.example.com/user_detail/"+ userid 
     response, _ := http.Get(url) 
     defer response.Body.Close() 
     data, _ := ioutil.ReadAll(response.Body) 
     wg.Done() 
    }(users[i]["userid"]) 
} 

wg.Wait() 
+2

你有沒有試過_not_使2000個併發請求?通常將開放連接限制爲某種理智的價值更有效。 – JimB

+0

看起來你可以在這裏改進一些東西,也許第三方API支持檢索用戶的批量操作? –

+1

從理論上講,使用併發時,速度與最慢的進程一樣快。那麼你是否檢查了最慢響應的網絡指標? – stratovarius

回答

2

這種情況是非常難以解決一般。性能在這個水平在很大程度上取決於你的服務器,API,網絡等的具體細節,但這裏有一些建議,讓你去:

  1. 嘗試限制併發連接數。

    正如@JimB在評論中提到的,對於服務器和客戶端來說,試圖處理2000個併發連接可能是低效的。嘗試限制爲10,20,50,100同時連接。基準每個值,並相應調整,直到獲得最佳性能。

    在客戶端,這可能允許重新使用連接(從而降低平均每個請求的開銷),這是目前不可能的,因爲您在完成任何連接之前啓動所有2000個連接。

  2. 如果服務器支持HTTP/2,請確保您使用的是HTTP/2,它可以更高效(有多個請求 - 所以這真的取決於上面的#1)。請參閱有關debugging HTTP/2的文檔。

  3. 如果API支持批量請求,請利用此優勢,並在單個請求中請求多個用戶。