リクエストを受け取った後、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()
内タイムアウトを増やす方法とその基礎となるrequests
とurllib3
ライブラリのためのハイとローで検索しましたが、空が出ています。私はboto3の文書の中にも何も見ません。電話番号boto3.client()
にuse_ssl=False
を追加すると、ネットワークのチャタリングを減らすことができます。再接続は、<の10秒ではなく、20-30秒後に発生します。
S3接続を開いたままにする時間を長くする方法はありますか?どんな助けでも大歓迎です!