从 AWS Lambda 读取 SQS 队列
Read SQS queue from AWS Lambda
我有以下基础设施:
我有一个 EC2 实例,其中有一个 NodeJS+Express 进程在端口上侦听消息(进程 1)。每次进程收到消息时,它都会将消息发送到 SQS 队列。然后我在同一台机器上有另一个进程使用长轮询读取队列(进程 2)。当它在队列中找到一条消息时,它会将数据插入位于 RDS 实例上的 MariaDB 数据库中。
(澄清一下,消息是由用户生成的,他们将包含任意信息的数据块发送到进程 1 正在侦听的端点)
现在我想把读取 SQS 的进程(进程 2)放在 Lambda 函数中,这样写入队列的进程和从队列读取的进程队列是完全独立的。问题是我不知道这是否可能。
我知道调用 Lambda 函数以响应事件,目前支持的事件有 S3、SNS、SES、DynamoDB、Kinesis、Cognito、CloudWatch 和 Cloudformation,但 不是 SQS.
我正在考虑使用 SNS 通知来调用 Lambda 函数,以便每次将消息推送到队列时,都会触发 SNS 通知并调用 Lambda 函数,但在玩了一下之后我意识到无法从 SQS 创建 SNS 通知,只能将 SNS 通知写入队列。
现在我有点卡住了,因为我不知道如何继续。由于 AWS 服务的当前限制,我感觉无法创建此基础设施。有没有另一种方法可以做我想做的事,还是我陷入了死胡同?
只是为了通过我所做的一些研究来扩展我的问题,这个 github 存储库展示了如何从 Lambda 函数读取 SQS 队列 但是 lambda 函数仅当从命令行触发时才有效:
https://github.com/robinjmurphy/sqs-to-lambda
在自述文件中,作者提到了以下内容:
Update: Lambda now supports SNS notifications as an event source,
which makes this hack entirely unneccessary for SNS notifcations. You
might still find it useful if you like the idea of using a Lambda
function to process jobs on an SQS queue.
但我认为这并不能解决我的问题,SNS 通知可以调用 Lambda 函数,但我不知道如何在 SQS 队列中收到消息时创建通知。
谢谢
有几个策略可用于连接点,(A)同步或Run-Sleep-Run以保持 SNS、SQS、Lambda 之间的数据处理流。
策略 1:让 Lambda 函数监听 SNS 并实时处理它[请注意,SQS 队列可以订阅 SNS 主题 - would 可能有助于记录/审计/重试处理]
策略 2:鉴于您正在获取 SQS 队列的数据。您可以尝试使用 2 个 Lambda 函数 [Feeder & Worker]。
Feeder would be scheduled lambda function
whose job is to take items
from SQS (if any) and push it as an SNS topic (and continue doing it forever)
Worker would be linked to listen the SNS topic which would do the actual data processing
我遇到过类似的情况(现在部署了一个可行的解决方案)。我已经通过以下方式解决了这个问题:
即将事件发布到 SNS;然后散开到 Lambda 和 SQS。
注意:这不适用于必须按特定顺序处理的事件。
有一些陷阱(有可能的解决方案),例如:
- 竞争条件:lambda 可能在消息存入队列之前被调用
- SQS 队列的分布式特性可能导致即使有消息 note1 也不会返回任何消息。
这两种情况的解决方案都是对 SQS 队列进行长轮询;但这确实会使您的 lambda 账单更加昂贵。
注1
Short poll is the default behavior where a weighted random set of machines is sampled on a ReceiveMessage call. This means only the messages on the sampled machines are returned. If the number of messages in the queue is small (less than 1000), it is likely you will get fewer messages than you requested per ReceiveMessage call. If the number of messages in the queue is extremely small, you might not receive any messages in a particular ReceiveMessage response; in which case you should repeat the request.
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html
我们有一些类似的要求,所以我们最终构建了一个库并将其开源以帮助 SQS 到 Lambda 异步。我不确定这是否满足您的特定要求,但我认为它可能值得一看:https://read.iopipe.com/sqs-lambda-teaming-up-92c4096be49c
我们现在可以使用 SQS 消息来触发 AWS Lambda 函数。此外,不再需要 运行 消息轮询服务或创建 SQS 到 SNS 映射。
AWS SQS 是 Amazon 最古老的产品之一,直到 2018 年 6 月才支持轮询(多头和空头)。如 , AWS SQS now supports the feature of triggering lambda functions on new message arrival in SQS. A complete tutorial for this is provided in this document.
中所述
我曾经使用不同的机制来解决这个问题,以下是您可以使用的一些方法。
您可以在 Lambda 中开发一个简单的轮询应用程序,并使用 AWS CloudWatch 每 5 分钟左右调用一次。您可以通过使用 CloudWatch 事件以短停机时间调用 lambda 来实现近乎实时的操作。为此使用 this tutorial or this tutorial。 (这在 Lambdas 上可能会花费更多)
如果不需要持久化消息,也不需要保证传递顺序,可以认为SQS是多余的。您可以使用 AWS SNS(简单通知服务)直接调用 lambda 函数并执行所需的任何处理。使用 this tutorial for this purpose. This will happen in real-time. But the main drawback is the number of lambdas that can be initiated per region at a given time. Please read this 并在遵循此方法之前了解限制。尽管如此,AWS SNS 保证交付顺序。 SNS 也可以直接调用 HTTP 端点并将消息存储在您的数据库中。
我有以下基础设施:
我有一个 EC2 实例,其中有一个 NodeJS+Express 进程在端口上侦听消息(进程 1)。每次进程收到消息时,它都会将消息发送到 SQS 队列。然后我在同一台机器上有另一个进程使用长轮询读取队列(进程 2)。当它在队列中找到一条消息时,它会将数据插入位于 RDS 实例上的 MariaDB 数据库中。
(澄清一下,消息是由用户生成的,他们将包含任意信息的数据块发送到进程 1 正在侦听的端点)
现在我想把读取 SQS 的进程(进程 2)放在 Lambda 函数中,这样写入队列的进程和从队列读取的进程队列是完全独立的。问题是我不知道这是否可能。
我知道调用 Lambda 函数以响应事件,目前支持的事件有 S3、SNS、SES、DynamoDB、Kinesis、Cognito、CloudWatch 和 Cloudformation,但 不是 SQS.
我正在考虑使用 SNS 通知来调用 Lambda 函数,以便每次将消息推送到队列时,都会触发 SNS 通知并调用 Lambda 函数,但在玩了一下之后我意识到无法从 SQS 创建 SNS 通知,只能将 SNS 通知写入队列。
现在我有点卡住了,因为我不知道如何继续。由于 AWS 服务的当前限制,我感觉无法创建此基础设施。有没有另一种方法可以做我想做的事,还是我陷入了死胡同?
只是为了通过我所做的一些研究来扩展我的问题,这个 github 存储库展示了如何从 Lambda 函数读取 SQS 队列 但是 lambda 函数仅当从命令行触发时才有效:
https://github.com/robinjmurphy/sqs-to-lambda
在自述文件中,作者提到了以下内容:
Update: Lambda now supports SNS notifications as an event source, which makes this hack entirely unneccessary for SNS notifcations. You might still find it useful if you like the idea of using a Lambda function to process jobs on an SQS queue.
但我认为这并不能解决我的问题,SNS 通知可以调用 Lambda 函数,但我不知道如何在 SQS 队列中收到消息时创建通知。
谢谢
有几个策略可用于连接点,(A)同步或Run-Sleep-Run以保持 SNS、SQS、Lambda 之间的数据处理流。
策略 1:让 Lambda 函数监听 SNS 并实时处理它[请注意,SQS 队列可以订阅 SNS 主题 - would 可能有助于记录/审计/重试处理]
策略 2:鉴于您正在获取 SQS 队列的数据。您可以尝试使用 2 个 Lambda 函数 [Feeder & Worker]。
Feeder would be
scheduled lambda function
whose job is to take items from SQS (if any) and push it as an SNS topic (and continue doing it forever)Worker would be linked to listen the SNS topic which would do the
actual data processing
我遇到过类似的情况(现在部署了一个可行的解决方案)。我已经通过以下方式解决了这个问题:
即将事件发布到 SNS;然后散开到 Lambda 和 SQS。
注意:这不适用于必须按特定顺序处理的事件。
有一些陷阱(有可能的解决方案),例如:
- 竞争条件:lambda 可能在消息存入队列之前被调用
- SQS 队列的分布式特性可能导致即使有消息 note1 也不会返回任何消息。
这两种情况的解决方案都是对 SQS 队列进行长轮询;但这确实会使您的 lambda 账单更加昂贵。
注1
Short poll is the default behavior where a weighted random set of machines is sampled on a ReceiveMessage call. This means only the messages on the sampled machines are returned. If the number of messages in the queue is small (less than 1000), it is likely you will get fewer messages than you requested per ReceiveMessage call. If the number of messages in the queue is extremely small, you might not receive any messages in a particular ReceiveMessage response; in which case you should repeat the request. http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html
我们有一些类似的要求,所以我们最终构建了一个库并将其开源以帮助 SQS 到 Lambda 异步。我不确定这是否满足您的特定要求,但我认为它可能值得一看:https://read.iopipe.com/sqs-lambda-teaming-up-92c4096be49c
我们现在可以使用 SQS 消息来触发 AWS Lambda 函数。此外,不再需要 运行 消息轮询服务或创建 SQS 到 SNS 映射。
AWS SQS 是 Amazon 最古老的产品之一,直到 2018 年 6 月才支持轮询(多头和空头)。如
我曾经使用不同的机制来解决这个问题,以下是您可以使用的一些方法。
您可以在 Lambda 中开发一个简单的轮询应用程序,并使用 AWS CloudWatch 每 5 分钟左右调用一次。您可以通过使用 CloudWatch 事件以短停机时间调用 lambda 来实现近乎实时的操作。为此使用 this tutorial or this tutorial。 (这在 Lambdas 上可能会花费更多)
如果不需要持久化消息,也不需要保证传递顺序,可以认为SQS是多余的。您可以使用 AWS SNS(简单通知服务)直接调用 lambda 函数并执行所需的任何处理。使用 this tutorial for this purpose. This will happen in real-time. But the main drawback is the number of lambdas that can be initiated per region at a given time. Please read this 并在遵循此方法之前了解限制。尽管如此,AWS SNS 保证交付顺序。 SNS 也可以直接调用 HTTP 端点并将消息存储在您的数据库中。