我已经使用Lambda和SQS设置了一个小型的无服务器应用程序。 在我的情况下,每次消息 添加到SQS队列中时,我想触发一个 lambda 。
在我的serverless.yml中起作用
functions:
collectGame:
handler: js/collect.collectGame
memorySize: 128
timeout: 10
events:
- sqs:
arn:
Fn::GetAtt:
- gameRequestQueue
- Arn
- http:
method: post
cors:
origin: "https://my-api-url.com"
path: get/game/{id}
private: true
request:
parameters:
paths:
id:true
我通过一次向队列发送31条消息来测试该过程,但意识到只有9个Lambda执行(通过查看cloudwatch日志)。我查看了队列,可以确认队列中已填充所有消息,并且在触发9个Lambda之后可以确认队列为空。
我希望有31条Lambda死刑,但事实并非如此。有人知道为什么这些消息不会触发我的Lambda的潜在原因吗?
答案 0 :(得分:3)
您的lambda函数可能正在被多个消息调用。如果您只希望在每次lambda调用中发送一条消息,则在创建事件源映射时应该可以将BatchSize设置为1。
您似乎正在使用无服务器框架。请参阅其SQS事件documentation,以设置批量大小。
答案 1 :(得分:1)
我也面临着完全相同的问题。问题出在我的 lambda 函数中。 如果批量大小大于 1,在这种情况下,在单个 lambda 调用中,多个 SQS 消息将传递给 lambda(基于批量大小),只需处理 lambda 中的所有消息(通过遍历所有消息)。
检查多条消息的事件记录数组。
{Records: [{..},{..},{..}]}
答案 2 :(得分:0)
对于使用aws sam的任何人,这里是提及批处理大小的链接:here,请查找副标题“将队列配置为事件源”。这是我可以在yaml中与DLQ一起设置的代码:
# add an event trigger in the properties section of your function
Events:
MySQSEvent:
Type: SQS
Properties:
Queue: !GetAtt MySqsQueueName.Arn
BatchSize: 1
# then define the queue
MySqsQueueName:
Type: AWS::SQS::Queue
Properties:
VisibilityTimeout: 800
ReceiveMessageWaitTimeSeconds: 10
DelaySeconds: 10
RedrivePolicy:
deadLetterTargetArn: !GetAtt MyDLQueue.Arn
maxReceiveCount: 2
# define a dead letter queue to handle bad messages
MyDLQueue:
Type: AWS::SQS::Queue
Properties:
VisibilityTimeout: 900
希望这对某人有帮助-这使我花了很长时间为我的应用程序进行锻炼!