2017-01-25 2 views
0

Я пишу службу, которая будет получать данные с 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 может оставаться открытым? Любая помощь будет принята с благодарностью!

ответ

1

Нет, нет.

S3 сам по себе отказывается от любых подключений Keep-Alive через несколько секунд ... как это делает любой веб-сервер ... «соединения» с S3 - это просто соединения HTTP/S с конечной точкой API S3. Они не предназначены для долгого использования.

Реальный вопрос может быть, поэтому подключение занимает 4 секунды, чтобы установить. Это кажется чрезмерным.

Смежные вопросы