Я пишу службу, которая будет получать данные с S3 после получения запроса. Данные хранятся в файлах .gz. Эта служба не будет постоянно заполняться данными, то есть она может занять много секунд, прежде чем получать второй запрос. У меня возникли проблемы с заменой моего S3-соединения после довольно небольшого количества времени. Проблема заключается в том, что boto3.client()
сбрасывает соединение гораздо быстрее, чем хотелось бы.S3 соединения быстро выходят из строя в Python 2.7
Для тестирования я использовал этот кусок кода:
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)
к нижней части петли, чтобы имитировать разрыв между запросами , Я вижу следующее. Каждый запрос занимает примерно до тех пор, как первые из-за каждый запрос Reconnecting:
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. Добавление use_ssl=False
к вызову boto3.client()
действительно помогает в уменьшении сетевой болтовни. Повторное соединение происходит через 20-30 секунд вместо < 10 секунд.
Есть ли способ увеличить время, в течение которого соединение S3 может оставаться открытым? Любая помощь будет принята с благодарностью!