AWS Lambda从SQS队列中读取

时间:2018-04-14 15:50:45

标签: amazon-web-services aws-lambda amazon-sqs serverless

我有一个AWS Lambda函数来从SQS队列中读取。 lambda逻辑基本上是从SQS读取一条消息,然后处理和删除消息。用于读取消息的代码。

 ReceiveMessageRequest messageRequest =
        new ReceiveMessageRequest(queueUrl).withWaitTimeSeconds(5).withMaxNumberOfMessages(1);

现在我的问题是触发这个lambda的最佳方法是什么?这个lambda如何缩放,例如,如果让队列中有1000条消息,那么将会有1000个lambdas一起运行,因为在我的情况下,一个lambda只能读取队列中的一条消息。

关于此类设计的最佳实践的任何指示。

4 个答案:

答案 0 :(得分:1)

我们现在可以使用SQS消息来触发AWS Lambda函数。而且,不再需要运行消息轮询服务或创建SQS到SNS映射。

enter image description here

更多详细信息:
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)

答案 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

我在生产环境中使用此解决方案已近一年没有任何问题,即使队列中有数千条消息。如果你缩小了缩放部分,它一次只能做一条消息。