【发布时间】:2016-10-06 18:12:58
【问题描述】:
在无服务器中,我有以下文件夹结构
/component_a/function_1/function_1.js (get)
/component_a/function_2/function_2.js (get)
使用无服务器框架从 function_1 调用 function_2 的最佳方式是什么?
【问题讨论】:
标签: node.js amazon-web-services lambda
在无服务器中,我有以下文件夹结构
/component_a/function_1/function_1.js (get)
/component_a/function_2/function_2.js (get)
使用无服务器框架从 function_1 调用 function_2 的最佳方式是什么?
【问题讨论】:
标签: node.js amazon-web-services lambda
这通常是不受欢迎的,因为它会产生依赖关系。直接调用其他 lambda 函数是一种选择(Can an AWS Lambda function call another),但是 lambda 的重点是让它们独立运行。如果您最终使用递归 lambda 模式,这也可能很危险。如果您需要快速响应时间,最好的方式通常是通过 SQS 和 SNS 进行通信。
【讨论】:
不要从 function_1 调用 function_2。
编写两个函数,使其能够独立完成各自的任务。
为了控制执行流程,您应该使用 AWS Step Functions,它可以让您在各种 lambda 函数之间进行协调。
如果您想持久化信息,请使用其他存储服务(如 S3 或 DynamoDB)来存储 function_2 可以使用的信息。然后让 Step Functions 引导流量。但请检查您正在部署功能的区域中是否存在此服务。
这里是 AWS Step Functions 的快速指南:
http://docs.aws.amazon.com/step-functions/latest/dg/welcome.html
【讨论】:
这取决于你是否对function_2的返回值感兴趣。
如果需要获取function_2的返回值,必须直接调用。你有两个选择:
同步调用函数 2 Lambda。请参阅 AWS-SDK 文档中的 Lambda.invoke()。
如果您可以在 Function 1 包中包含 Function 2(默认情况下 serverless 会这样做),您可能可以直接导入它,具体取决于您的代码编写方式。
如果Function 1不需要知道Function 2的响应或返回值,你应该使用SNS来调用它异步。为此,建议采用以下方法:
【讨论】:
InvocationType 设置为 Event docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/… 来使 Lambda.invoke() 异步化