(Step Functions Activity Worker) Лучшая практика для обработки длинных тайм-аутов опроса в boto? - PullRequest
0 голосов
/ 21 октября 2018

Я работаю над своим первым работником по шаговым функциям (EC2).Как и ожидалось, после 5 минут длительного опроса без активности со стороны конечного автомата «Функции шага» клиентское соединение прерывается с ошибкой:

botocore.exceptions.ReadTimeoutError: Тайм-аут чтения URL-адреса конечной точки: "https://states.us -east-1.amazonaws.com /"

Было бы лучше перехватить ошибку и повторить длинный опрос (каждые 5 минут, когда нет активности)или попытаться завершить звонок раньше и повторить попытку до ошибки?Я думал об использовании другого типа цикла, но я хочу максимизировать значение длинного опроса и не повторять запросы к API-интерфейсу Step Functions (хотя, если это будет лучшим способом, я сделаю это).

Спасибо,

Андрей

import boto3
import time
import json

region = 'us-east-1'
activity_arn = 'arn:aws:states:us-east-1:754112345676:activity:Process_Imagery' 

while True:
    client = boto3.client('stepfunctions', region_name=region)
    response = client.get_activity_task(activityArn=activity_arn,
                                    workerName='imagery_processor')    
    activity_token = response['taskToken']
    input_params = json.loads(response['input'])

    print("================")
    print(input_params)
    client.send_task_success(taskToken=activity_token, output='true')

1 Ответ

0 голосов
/ 24 октября 2018

Кажется, я ответил на свой вопрос здесь.Документация AWS гласит : «Максимальное время, в течение которого служба удерживает запрос до ответа, составляет 60 секунд. Если в течение 60 секунд задача недоступна, опрос возвращает taskToken с пустой строкой.»

Тем не менее, вместо того, чтобы возвращать строку, я считаю, что в ответе JSON от StepFunctions вообще нет 'taskToken'.Этот цикл while работает:

import boto3
import time
import json
from botocore.config import Config as BotoCoreConfig

region = 'us-east-1'
boto_config = BotoCoreConfig(read_timeout=70, region_name=region)
sf_client = boto3.client('stepfunctions', config=boto_config)
activity_arn = 'arn:aws:states:us-east-1:754185699999:activity:Process_Imagery'  

while True:
    response = sf_client.get_activity_task(activityArn=activity_arn,
                                    workerName='imagery_processor')    

    if 'taskToken' not in response:
        print('No Task Token')
        # time.sleep(2)
    else:
        print(response['taskToken']) 
        print("===================")
        activity_token = response['taskToken']
        sf_client.send_task_success(taskToken=activity_token, output='true')
...