我有以下基础设施:
我有一个带有NodeJS Express进程的EC2实例在端口上侦听消息(进程1) . 每次进程收到消息时,都会将其发送到SQS队列 . 然后我在同一台机器上有另一个进程使用长轮询读取队列(进程2) . 当它在队列中找到消息时,它会将数据插入位于RDS实例上的MariaDB数据库中 .
(只是为了澄清,消息是由用户生成的,他们发送一大块数据,其中包含任意信息到进程1正在侦听的 endpoints )
现在我想将读取SQS(进程2)的进程放在Lambda函数中,以便写入队列的进程和从队列中读取的进程完全独立 . 问题是我不知道这是否可行 .
我知道Lambda函数是为响应事件而调用的,目前支持的事件是S3,SNS,SES,DynamoDB,Kinesis,Cognito,CloudWatch和Cloudformation,但是 NOT SQS .
我正在考虑使用SNS通知来调用Lambda函数,以便每次将消息推送到队列时,都会触发SNS通知并调用Lambda函数,但在使用它后,我意识到这是不可能的从SQS创建SNS通知,只能将SNS通知写入队列 .
现在我有点卡住,因为我不知道如何继续 . 由于AWS服务的当前限制,我觉得无法创建此基础结构 . 还有另一种方法可以做我想做的事情,还是我处于死胡同?
只是为了通过我做过的一些研究来扩展我的问题,这个github repo展示了如何从Lambda函数读取SQS队列 but lambda函数只有在从命令行触发时才起作用:
https://github.com/robinjmurphy/sqs-to-lambda
在自述文件中,作者提到了以下内容:
更新:Lambda现在支持SNS通知作为事件源,这使得这个hack完全不需要SNS通知 . 如果您喜欢使用Lambda函数处理SQS队列上的作业,您可能仍会发现它很有用 .
但我认为这并不能解决我的问题,SNS通知可以调用Lambda函数,但是当我在SQS队列中收到消息时,我看不出如何创建通知 .
谢谢
5 回答
有几种策略可用于连接点,(A)同步或运行 - 睡眠 - 运行以保持数据处理流在SNS,SQS,Lambda之间 .
Strategy 1 :有一个Lambda函数侦听SNS并实时处理它[请注意,SQS队列可以订阅SNS主题 - 这可能有助于记录/审计/重试处理]
Strategy 2 :鉴于您正在获取源自SQS队列的数据 . 您可以尝试使用2个Lambda函数[Feeder&Worker] .
我们现在可以使用SQS消息来触发AWS Lambda函数 . 此外,不再需要运行消息轮询服务或创建SQS到SNS映射 .
更多细节:https://aws.amazon.com/blogs/aws/aws-lambda-adds-amazon-simple-queue-service-to-supported-event-sources/
我有类似的情况(现在有一个工作解决方案deploed) . 我已通过以下方式解决了这个问题:
即向SNS发布活动;然后散布到Lambda和SQS .
注意:这不适用于必须按特定顺序处理的事件 .
有一些陷阱(有可能的解决方案),如:
即使存在消息note1,_Q9_SQS队列的分布式特性也可能导致不返回消息 .
两种情况的解决方案都是对SQS队列进行长轮询;但这确实使你的lambda账单更加昂贵 .
注1
AWS SQS是亚马逊最古老的产品之一,仅支持轮询(长和短),直到2018年6月 . 如this answer中所述,AWS SQS现在支持在新消息到达SQS时触发lambda函数的功能 . this document中提供了完整的教程 .
我曾经使用不同的机制解决这个问题,下面给出了一些你可以使用的方法 .
您可以在Lambda中开发一个简单的轮询应用程序,并使用 AWS CloudWatch 每隔5分钟左右调用一次 . 您可以通过使用CloudWatch事件以短暂的停机时间调用lambda来实现近乎实时的功能 . 为此,请使用this tutorial或this tutorial . (这可能会花费更多Lambdas)
如果您不需要保留消息也不保证交付顺序,则可以认为SQS是多余的 . 您可以使用 AWS SNS (简单通知服务)直接调用lambda函数并执行所需的任何处理 . 为此目的使用this tutorial . 这将实时发生 . 但主要缺点是在给定时间每个区域可以启动的lambda数量 . 在阅读此方法之前,请阅读this并了解限制 . 然而,AWS SNS保证了交付顺序 . 此外,SNS可以直接调用HTTP endpoints 并将消息存储在您的数据库中 .
我们有一些类似的要求,所以我们最终 Build 了一个库并开放它以帮助SQS到Lambda异步 . 我不确定这是否符合您的特定要求,但认为值得一看:https://read.iopipe.com/sqs-lambda-teaming-up-92c4096be49c