Python (Step Functions Activity Worker)处理boto中长轮询超时的最佳实践?

Python (Step Functions Activity Worker)处理boto中长轮询超时的最佳实践?,python,boto3,long-polling,aws-step-functions,Python,Boto3,Long Polling,Aws Step Functions,我正在处理我的第一步功能活动工作者(EC2)。可以预见的是,在5分钟的长轮询后,没有来自Step Functions状态机的活动,客户端连接超时并出现以下错误: botocore.exceptions.ReadTimeoutError:端点URL上的读取超时:“” 捕获错误并重试长轮询(当不存在活动时,每5分钟重试一次)或尝试提前终止呼叫并在出现错误之前重试是更好的做法吗?我曾考虑过使用不同类型的循环,但我希望最大化长轮询的价值,而不是重复请求步骤函数API(尽管如果这是最好的方法,我会这样做)

我正在处理我的第一步功能活动工作者(EC2)。可以预见的是,在5分钟的长轮询后,没有来自Step Functions状态机的活动,客户端连接超时并出现以下错误:

botocore.exceptions.ReadTimeoutError:端点URL上的读取超时:“”

捕获错误并重试长轮询(当不存在活动时,每5分钟重试一次)或尝试提前终止呼叫并在出现错误之前重试是更好的做法吗?我曾考虑过使用不同类型的循环,但我希望最大化长轮询的价值,而不是重复请求步骤函数API(尽管如果这是最好的方法,我会这样做)

谢谢,

安德鲁

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')

我相信我在这里回答了我自己的问题。这个: 服务在响应之前保留请求的最长时间为60秒。如果60秒内没有可用的任务,轮询将返回一个带有空字符串的taskToken

但是,我相信StepFunctions的JSON响应根本没有“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')

我相信我在这里回答了我自己的问题。这个: 服务在响应之前保留请求的最长时间为60秒。如果60秒内没有可用的任务,轮询将返回一个带有空字符串的taskToken

但是,我相信StepFunctions的JSON响应根本没有“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')

我今天做了更多的测试(数据包捕获),它显示了实例和步骤函数API大约每1分钟通信一次,然后Botocore最终终止了尝试(~5分钟)。这让我相信我需要更好地处理空返回。我今天做了更多的测试(数据包捕获),它显示了实例和步骤函数API大约每1分钟通信一次,然后Botocore最终终止了尝试(~5分钟)。这让我相信我需要更好地处理空返回。我会研究的。