2017-01-25 3 views
0

リクエストを受け取った後、S3からデータを取得するサービスを作成しています。データは.gzファイルに保存されます。このサービスにはデータが常に氾濫しません。つまり、2回目のリクエストを受信するまでに何秒もかかることがあります。私は、S3接続がかなり短時間でリセットされないようにするのに問題があります。問題は、boto3.client()が私が望んでいるよりもはるかに迅速に接続をリセットしているようです。試験するPython 2.7でS3接続がすぐにタイムアウトする

、私はこのコードのビットを使用する:

import boto3 
import logging 
import datetime 
import time 
import gzipinputstream 

logging.basicConfig(level='DEBUG') 
logging.getLogger('botocore').setLevel('INFO') 

s3_client = boto3.client('s3') 
bucket = 'foo' 
key = 'bar' 

count = 0 
while True: 
    count += 1 
    start = datetime.datetime.now() 
    x = s3_client.get_object(Bucket=bucket, Key=key) 
    y = x['Body'] 
    z = gzipinputstream.GzipInputStream(y) 
    final_obj = z.read() 
    end = datetime.datetime.now() 
    print "Test #%d: started at %s, ended at %s, duration = %s" % (count,start,end,end-start) 

私は上記のコードを実行すると、私は、次を参照。最初のリクエストは残りの部分よりも少し時間がかかりますが、以降#2からの各要求は、はるかに高速です:

INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): session4c.s3.amazonaws.com 
Test #1: started at 2017-01-25 14:50:26.295239, ended at 2017-01-25 14:50:30.412478, duration = 0:00:04.117239 
Test #2: started at 2017-01-25 14:50:30.412581, ended at 2017-01-25 14:50:30.447595, duration = 0:00:00.035014 
Test #3: started at 2017-01-25 14:50:30.447655, ended at 2017-01-25 14:50:30.474377, duration = 0:00:00.026722 
Test #4: started at 2017-01-25 14:50:30.474443, ended at 2017-01-25 14:50:30.499979, duration = 0:00:00.025536 
Test #5: started at 2017-01-25 14:50:30.500040, ended at 2017-01-25 14:50:30.595240, duration = 0:00:00.095200 

は私がリクエストの間のギャップをシミュレートするために、同じコードすることを取ると、ループの底にtime.sleep(10)を追加します、私は以下を参照してください。各要求は限り最初などによる各要求の再接続にほぼとります

INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): session4c.s3.amazonaws.com 
Test #1: started at 2017-01-25 14:50:44.916388, ended at 2017-01-25 14:50:49.315392, duration = 0:00:04.399004 
INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Resetting dropped connection: session4c.s3.amazonaws.com 
Test #2: started at 2017-01-25 14:50:59.325521, ended at 2017-01-25 14:51:03.726388, duration = 0:00:04.400867 
INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Resetting dropped connection: session4c.s3.amazonaws.com 
Test #3: started at 2017-01-25 14:51:13.736561, ended at 2017-01-25 14:51:17.273182, duration = 0:00:03.536621 
INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Resetting dropped connection: session4c.s3.amazonaws.com 
Test #4: started at 2017-01-25 14:51:27.282636, ended at 2017-01-25 14:51:31.682258, duration = 0:00:04.399622 
INFO:botocore.vendored.requests.packages.urllib3.connectionpool:Resetting dropped connection: session4c.s3.amazonaws.com 
Test #5: started at 2017-01-25 14:51:41.692450, ended at 2017-01-25 14:51:45.225243, duration = 0:00:03.532793 

私はboto3.client()内タイムアウトを増やす方法とその基礎となるrequestsurllib3ライブラリのためのハイとローで検索しましたが、空が出ています。私はboto3の文書の中にも何も見ません。電話番号boto3.client()use_ssl=Falseを追加すると、ネットワークのチャタリングを減らすことができます。再接続は、<の10秒ではなく、20-30秒後に発生します。

S3接続を開いたままにする時間を長くする方法はありますか?どんな助けでも大歓迎です!

答えて

1

いいえ、ありません。

S3に接続すると、S3 APIエンドポイントへのHTTP/S接続だけで、数秒後にS3がアイドル状態のキープアライブ接続を切断します。彼らは非常に長い間使用可能なままであることを意味しません。

実際の問題は、接続に4秒かかることがあります。それは過度に思える。

関連する問題