我有lambda触发器,该触发器从SQS队列读取消息。在某些情况下,消息可能尚未准备好进行处理,因此我想将消息放回队列中1分钟,然后重试。当前,我正在创建此客户记录的另一个副本,并将此新副本发布到队列中。我是否有理由/方式将原始记录保留在队列中,而不是创建一个新记录
def postToQueue(customer):
if 'attemptCount' in customer.keys():
attemptCount = int(customer["attemptCount"]) + 1
else:
attemptCount = 2
customer["attemptCount"] = attemptCount
# Get the service resource
sqs = boto3.resource('sqs')
# Get the queue
queue = sqs.get_queue_by_name(QueueName='testCustomerQueue')
response = queue.send_message(MessageBody=json.dumps(customer), DelaySeconds=60)
print('customer postback: ', customer)
print ('response from writing ot the queue is: ', response)
#main function
for record in event['Records']:
if 'body' in record.keys():
customer = json.loads(record['body'])
print("attempting to process customer", customer, " at: ", datetime.datetime.now())
if (not ifReadyToProcess(customer)):
postToQueue(customer)
else:
processCustomer(customer)
答案 0 :(得分:0)
这不是SQS触发Lambda函数的理想设置。
我的测试表明,即使提供了“延迟”设置,发送到SQS的邮件也会立即触发Lambda函数。因此,将消息放回SQS队列将导致Lambda立即再次触发。
为避免Lambda不断检查邮件是否已准备好处理的情况,我建议:
请注意,这与让SQS直接触发Lambda不同。相反,Lambda函数应该调用ReceiveMessages()
来获取消息本身,这允许Delay函数在两次检查之间增加一些时间。
另一个选项:您可以通过不删除消息来简单地利用默认可见性超时设置,而不是将消息重新插入队列中。从队列中读取但未被删除的消息将自动“重新出现”在队列中。您可以将其用作“重试”时间段。但是,这意味着您将需要自己处理“死信”处理(例如,如果在 n 尝试后无法处理消息)。