2017-10-31 1 views
1

多くのURLからコンテンツを取得し、AWS S3に保存する必要があります。私は機能する関数を作成しました。しかし、私はを探しています。これは、httpクライアント接続を再利用してAWS sessionを再利用することで、より高速で効率的になります。さらに私は、一度に5人ずつ同時に実行するようにしています。HTTPフェッチとセッションを共有してS3操作に保存するにはどうすればいいですか?

func fetchPut(fromURL string, toS3 string) error { 

     start := time.Now() 
     resp, err := http.Get(fromURL) 
     if err != nil { 
      return err 
     } 
     defer resp.Body.Close() 

     sess := session.Must(session.Must(session.NewSession())) 
     s3svc := s3.New(sess) 

     s3URL, _ := url.Parse(toS3) 

     byteArray, _ := ioutil.ReadAll(resp.Body) 
     fetchElapsed := time.Since(start).Seconds() 

     start = time.Now() 
     input := &s3.PutObjectInput{ 
      Body:   bytes.NewReader(byteArray), 
      Bucket:  aws.String(s3URL.Host), 
      Key:   aws.String(s3URL.Path), 
     } 
     _, err = s3svc.PutObject(input) 
     putElapsed := time.Since(start).Seconds() 

     return err 
} 

は、私が理解していないことは、私はセッションを再使用する方法である(両方のhttp & AWS)。いくつかのグローバル変数に含めることはできますか?それとも、何らかのコンテキストを作成する必要がありますか?

このような使用例の良い例がありますか?

+0

私は時間のロジックがベンチマーク用であると仮定していますか? – Dale

+0

はい、申し訳ありませんが、コンパクトに保つ​​ためにログ行を削除しました。 – hendry

+0

接続と認証はどのくらいプロセス全体にかかるのですか? – zerkms

答えて

1

あなたの問題はかなり一般的なようです。

原則として、変更しないもの(セッション& AWSサービスオブジェクト、バケット名のような宛先不変部分)を変更する必要があります(src、dest。 )、次に設定を変更しない設定を一度実行してから、URLフェッチ+ S3ストアを同時に実行し、設定を追加のargとして渡します。 fetchPut機能のうち、あなたのs3svc作成を移動し、引数として渡す、そしておそらくあなたが完了するためにそれらのすべてを待つしたい場合はasync.WaitGroupを使用して、ゴルーチンでfetchPutを実行するに煮詰めるう

プロデューサ(URL取得)とコンシューマ(S3へのパッティング)の2つの作業者プールを実行し、チャネルを使用して別のものにフィードすることができます。 それはおそらくスピードアップの大部分を与えるだろう。

一般的に、私はあなたの考えをコンカレントにすることに同意します。これはかなり良い例です。早すぎる最適化と見なす必要はありません。 私はRob Pikeのexcellent talk "並行性は並列性ではありません"という広告にも抵抗できません。 Robのロードバランサの例は、あなたの場合よりも複雑ですが、依然として要求を同時に処理する方法の概要を示しています。

Btw、httpフェッチに使用される「セッション」は一種の透明です。すでにコメントした人のように、標準ライブラリのhttpクライアントは再利用されるので、心配する必要はありません。

関連する問題