2017-04-11 6 views
0

私は、ユーザーの詳細を取得するためにAPIを呼び出す必要がある約2000のユーザーオブジェクト(マップ)の配列を持っています - >応答を処理する - >ローカルDBをできるだけ早く更新します。 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

2000件の同時リクエストを試したことがありますか?通常、開いている接続を一定の値に制限する方が効率的です。 – JimB

+0

ここで何か改善できるとは思われません。ユーザーを取得する際にサードパーティのAPIサポートのバッチ操作を使用していますか? –

+1

理論的には、同時実行性を使用している場合、最も遅いプロセスほど高速です。最も遅い応答のためにネットワークメトリックをチェックしましたか? – stratovarius

答えて

2

状況のこの種は、一般的でに対処することは非常に困難です。このレベルのパフォーマンスは、サーバー、APIの仕様に非常に多くを依存して、ネットワーク、などしかし、ここであなたが軌道に乗るためにいくつかの提案です:

  1. の同時接続数を制限してください。

    コメントで@JimBで述べたように、2000同時接続を処理しようとすると、サーバーとクライアントの両方で非効率的になる可能性があります。 10,20,50,100の同時接続に制限してみてください。最高のパフォーマンスを得るまで、それぞれの価値をベンチマークし、それに応じて調整してください。

    クライアント側では、接続を再利用することができます(つまり、リクエストごとの平均オーバーヘッドを減らすことができます)。

  2. サーバがHTTP/2をサポートしている場合、HTTP/2を使用していることを確認してください(複数のリクエストがあるため、上記の#1にもよります)。 debugging HTTP/2に関するドキュメントを参照してください。

  3. APIがバルクリクエストをサポートしている場合は、これを利用して、1回のリクエストで複数のユーザーをリクエストします。

関連する問題