从AWS Lambda

时间:2016-01-08 12:29:24

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

我有以下基础设施:

我有一个带有NodeJS + Express进程的EC2实例在端口上侦听消息(进程1 )。每次进程收到消息时,都会将其发送到SQS队列。然后我在同一台机器上有另一个进程使用长轮询(进程2 )读取队列。当它在队列中找到消息时,它会将数据插入位于RDS实例上的MariaDB数据库中。

只是澄清一下,消息是由用户生成的,他们会发送一大块数据,这些数据可以包含任意信息到进程1正在侦听的端点

现在我想将读取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队列但是 lambda函数只有在从命令行:

https://github.com/robinjmurphy/sqs-to-lambda

在自述文件中,作者提到了以下内容:

  

更新:Lambda现在支持SNS通知作为事件源,   这使得这个hack完全不需要SNS通知。您   如果您喜欢使用Lambda的想法,可能仍然会发现它很有用   用于处理SQS队列上的作业。

但我认为这并没有解决我的问题,SNS通知可以调用Lambda函数,但我不知道如何在SQS队列中收到消息时创建通知。

由于

5 个答案:

答案 0 :(得分:10)

可以使用几种策略来连接点,(A)同步或运行 - 睡眠 - 运行以保持数据处理在SNS,SQS,Lambda之间流动。

策略1 :让Lambda函数侦听SNS并实时处理[请注意,SQS队列可以订阅SNS主题 - 可以有助于记录/审核/重试处理]

策略2 :鉴于您正在获取源自SQS队列的数据。您可以尝试使用2个Lambda函数[Feeder&工人]。

  

Feedder 将是scheduled lambda function,他的工作是拿走物品   来自SQS(如果有的话)并将其作为SNS主题推送(并继续永久地完成)

     将链接

工作人员以侦听将执行actual data processing

的SNS主题

答案 1 :(得分:3)

我们现在可以使用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/

答案 2 :(得分:1)

我有类似的情况(现在有一个工作解决方案)。我已通过以下方式解决了这个问题:

enter image description here

即。向SNS发布活动;然后散布到Lambda和SQS。

注意:这不适用于必须按特定顺序处理的事件。

有一些陷阱(有可能的解决方案),例如:

  • 竞争条件:在将消息存入队列之前可能会调用lambda
  • 即使存在消息note1,SQS队列的分布式特性也可能导致不返回消息。

两种情况的解决方案都是对SQS队列进行长轮询;但这确实使你的lambda账单更加昂贵。

备注1

  

短轮询是默认行为,其中在ReceiveMessage调用上对加权随机机器集进行采样。这意味着只返回采样机器上的消息。如果队列中的消息数量很少(小于1000),则可能会获得比每次ReceiveMessage调用请求的消息少的消息。如果队列中的消息数量非常小,您可能不会在特定的ReceiveMessage响应中收到任何消息;在这种情况下,您应该重复该请求。   http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html

答案 3 :(得分:1)

AWS SQS是亚马逊最古老的产品之一,直到2018年6月才支持轮询(长短)。如this answer中所述,AWS SQS现在支持在新消息上触发lambda函数的功能。到达SQS。 this document中提供了完整的教程。

我曾经使用不同的机制来解决此问题,下面提供了一些可以使用的方法。

  1. 您可以在Lambda中开发一个简单的轮询应用程序,并使用 AWS CloudWatch 每隔5分钟左右调用一次。您可以使用CloudWatch事件以较短的停机时间调用lambda,从而接近实时。为此使用this tutorialthis tutorial。 (这可能会在Lambda上花费更多)

  2. 如果您不需要保留消息或不保证传递顺序,则可以认为SQS是多余的。您可以使用 AWS SNS (简单通知服务)直接调用lambda函数并执行所需的任何处理。为此使用this tutorial。这将实时发生。但是主要缺点是在给定时间每个区域可以启动的lambda数。在采用这种方法之前,请阅读this并了解限制。但是,AWS SNS保证交付顺序。另外,SNS可以直接调用HTTP端点并将消息存储在您的数据库中。

答案 4 :(得分:0)

我们有一些类似的要求,所以我们最终建立了一个库并开放它以帮助SQS到Lambda异步。我不确定这是否符合您的特定要求,但认为值得一看:https://read.iopipe.com/sqs-lambda-teaming-up-92c4096be49c