我正在使用boto3 SQS客户端从AWS SQS FIFO队列中接收消息。
def consume_msgs():
sqs = None
try:
sqs = boto3.client('sqs',
region_name=S3_BUCKET_REGION,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
except Exception:
logger.warning('SQS client error {}'.format(sys.exc_info()[0]))
logger.error(traceback.format_exc())
### more code to process message
应用程序通过使用
upstart
在EC2上设置为服务。大部分时间它都运行良好。但有时当我在代码更改后重新启动服务时,应用程序会因以下错误而退出。2018-10-06 01:29:38,654 WARNING SQS client error <class 'KeyError'>
2018-10-06 01:29:38,658 WARNING SQS client error <class 'KeyError'>
2018-10-06 01:29:38,663 ERROR Traceback (most recent call last):
File "/home/ec2-user/aae_client/app/run.py", line 194, in consume_msgs
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
File "/home/ec2-user/aae_client/env/lib64/python3.6/dist-packages/boto3/__init__.py", line 83, in client
return _get_default_session().client(*args, **kwargs)
File "/home/ec2-user/aae_client/env/lib64/python3.6/dist-packages/boto3/session.py", line 263, in client
aws_session_token=aws_session_token, config=config)
File "/home/ec2-user/aae_client/env/lib64/python3.6/dist-packages/botocore/session.py", line 851, in create_client
endpoint_resolver = self.get_component('endpoint_resolver')
File "/home/ec2-user/aae_client/env/lib64/python3.6/dist-packages/botocore/session.py", line 726, in get_component
return self._components.get_component(name)
File "/home/ec2-user/aae_client/env/lib64/python3.6/dist-packages/botocore/session.py", line 926, in get_component
del self._deferred[name]
KeyError: 'endpoint_resolver'
重新启动服务通常可以解决此问题。并不是每次重新启动服务都会出现此问题。令人困惑的是,
KeyError
警告引导了实际的错误回溯。这个KeyError
具体指的是什么?它不能是AWS_SECRET_ACCESS_KEY
,因为这个密钥从未改变,并且大多数情况下都能正常工作。该问题发生得相当随机,并且来去无踪,因此很难调试。我不明白这个错误是如何逃过try..except
块的。
编辑
根据评论,这似乎与多线程有关。确实有多个线程运行consume_msg
函数:
def process_msgs():for i in range(NUM_WORKERS):
t = threading.Thread(target=consume_msgs, name='worker-%s' % i)
t.setDaemon(True)
t.start()
while True:
time.sleep(MAIN_PROCESS_SLEEP_INTERVAL)