我有一个AWS Lambda函数来从SQS队列中读取。 lambda逻辑基本上是从SQS读取一条消息,然后处理和删除消息。用于读取消息的代码。
ReceiveMessageRequest messageRequest =
new ReceiveMessageRequest(queueUrl).withWaitTimeSeconds(5).withMaxNumberOfMessages(1);
现在我的问题是触发这个lambda的最佳方法是什么?这个lambda如何缩放,例如,如果让队列中有1000条消息,那么将会有1000个lambdas一起运行,因为在我的情况下,一个lambda只能读取队列中的一条消息。
关于此类设计的最佳实践的任何指示。
答案 0 :(得分:1)
我们现在可以使用SQS消息来触发AWS Lambda函数。而且,不再需要运行消息轮询服务或创建SQS到SNS映射。
更多详细信息:
https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/
https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
答案 1 :(得分:0)
现在,您最好的选择可能是设置一个AWS Cloudwatch事件规则,该规则在您需要的时间间隔内调用lambda函数。
以下是AWS提供的示例应用程序:
https://github.com/awslabs/aws-serverless-sqs-event-source
我相信AWS最终将支持SQS作为AWS lambda的事件类型,这应该会使这更容易,但是现在你最好的选择可能是我上面链接的代码版本。
答案 2 :(得分:0)
AWS在2018年6月添加了本机支持:https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/
答案 3 :(得分:-1)
可能有几种方法可以做到这一点,但是当我尝试实现您在Node.js中描述的相同类型的功能时,我发现this guide非常有用。这种策略的一个缺点是你只能每60秒轮询一次队列。
基本工作流程看起来像这样:
设置在队列有一定数量的消息时触发的CloudWatch警报。
然后,Cloudwatch警报会发布到SNS
SNS消息触发Lambda scale()函数
scale()函数更新DynamoDB表中的配置记录,该表设置所需的工作进程数
然后你有一个主要的CloudWatch Schedule,每60秒调用一次worker()函数
worker()函数从DynamoDB读取配置,以根据队列大小确定需要多少并发进程。
然后,Worker()调用适当数量的process()函数
Process()函数使用来自SQS的消息,执行主应用程序逻辑,然后从队列中删除该项。
您可以在Node.js中找到缩放函数的示例here
我在生产环境中使用此解决方案已近一年没有任何问题,即使队列中有数千条消息。如果你缩小了缩放部分,它一次只能做一条消息。