【发布时间】:2016-04-13 03:27:01
【问题描述】:
我有以下基础设施:
我有一个带有 NodeJS+Express 进程的 EC2 实例,该进程在端口上侦听消息(进程 1)。每次进程接收到消息时,它都会将其发送到 SQS 队列。然后我在同一台机器上有另一个进程使用长轮询(process 2)读取队列。当它在队列中找到一条消息时,它会将数据插入 RDS 实例上的 MariaDB 数据库中。
(澄清一下,消息是由用户生成的,他们向进程 1 正在侦听的端点发送一段可以包含任意信息的数据)
现在我想将读取 SQS 的进程(process 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
在自述文件中,作者提到以下内容:
更新:Lambda 现在支持将 SNS 通知作为事件源, 这使得这种 hack 对于 SNS 通知完全没有必要。你 如果您喜欢使用 Lambda 的想法,它可能仍然有用 处理 SQS 队列上的作业的函数。
但我认为这并不能解决我的问题,SNS 通知可以调用 Lambda 函数,但我不知道如何在 SQS 队列中收到消息时创建通知。
谢谢
【问题讨论】:
-
2 件可以用来摆脱困境的东西 (1) Lambda 可以收听 SNS。如果这不是您想要的,那么 (2) 使 SQS 队列成为 SNS 主题的订阅者之一 [每条 SNS 消息都将写入 SQS 队列]
-
我认为这是我开始感到困惑的地方。我不想将 SNS 消息写入队列。进入队列的消息由用户生成(他们将数据发布到 URL,我的 nodejs 线程处理请求,格式化数据并将其发送到 SQS 队列)。然后我想做的是,每次将用户消息插入队列时,以某种方式触发 SNS 通知以调用 Lambda 函数(实际上是通过使 Lambda 函数监听 SNS 来实现的)
-
而不是连接 Lambda、SQS 和 SNS 之间的点。我想建议考虑调度 lambda 函数来查看队列,如果存在则处理这些项目。另一种变体是使用 2 个 Lambda 函数 - 一个将从 SQS[scheduled] 中读取项目并将项目推送到 SNS,然后由另一个处理 Lambda 函数处理。
-
这是有道理的。事实上,这个解决方案类似于我们目前使用 cronjobs 并每隔几分钟或几秒检查一次队列的系统。我还在考虑使用 CloudWatch 检查队列统计信息并在有任何消息时触发 lambda 函数。感谢您的建议。我将进一步调查。
-
很高兴有帮助。我会写这个作为答案。
标签: amazon-web-services amazon-ec2 amazon-sqs aws-lambda