【问题标题】:Serverless - large app无服务器 - 大型应用程序
【发布时间】:2018-06-03 19:01:36
【问题描述】:
我是无服务器框架的新手。
我正在启动一个具有多个路由的 Rest API,例如:
获取用户/{userid}
发布用户
获取帐户/{accountid}
发布帐户
我需要 2 项服务 - 帐户 + 用户吗?
最佳做法是什么?如果有 2 个服务,那么 2 个 serverless.yml?有人有无服务器大型应用的例子吗?
谢谢大家!
【问题讨论】:
标签:
serverless-framework
serverless
serverless-architecture
【解决方案1】:
这实际上取决于您希望应用的架构。
看看here,我想它可能会帮助你决定你真正想要什么。
如果您同时有很多端点,您可能需要 2 个服务,因为您将达到资源限制。如果您想为您的应用设置一个 url,您可以随时设置 pathmapping。
resources:
Resources:
pathmapping:
Type: AWS::ApiGateway::BasePathMapping
Properties:
BasePath: <your base for this service>
DomainName: mydomain.com
RestApiId:
Ref: ApiGatewayRestApi
Stage: dev
【解决方案2】:
对于您的示例,使用一项服务 (serverless.yml) 就足够了。
您可以在 1 个服务中使用一个 lambda 来处理 users 和 accounts 请求。
functions:
<your-function-name>:
handler: handler.execute
events:
- http:
path: /user/{userid}
method: get
- http:
method: post
path: /user
- http:
path: /account/{accountid}
method: get
- http:
method: post
path: /account
或者您可以创建 2 个 lambda(每个实体一个)
functions:
user:
handler: userHandler.execute
events:
- http:
path: /user/{userid}
method: get
- http:
method: post
path: /user
account:
handler: accountHandler.execute
events:
- http:
path: /account/{accountid}
method: get
- http:
method: post
path: /account
【解决方案3】:
简而言之 - 如您所愿。
从技术上讲:您可以将多个函数聚合为一个,并根据事件参数属性调用特定的一个。此外 - 您可以在 AWS lambdas(或其他 FaaS)中运行 express/koa 服务器而不会感到任何痛苦。
+ 作为奖励,您可以使用ANY 和{any+}:
events:
- http:
path: /foo
method: ANY
- http:
path: /foo/{any+}
method: ANY
但总的来说 - 取决于情况。如果您经常调用特定端点,那么最好将其移动到单独的 lambda。如果您知道很少调用端点的工作台 - 最好将它们聚合在一个 lambda 下。特别是如果您使用热身。
【解决方案4】:
我喜欢架构的一件事是没有正确答案,但最适合您的问题/情况。最重要的是,最佳/最佳实践是在所有这些方面为您提供帮助的指南。
在我的例子中,我增加了代码的复杂性,所以我的 CRUD 路径非常简单。
cms/{entity} 或 cms/{entity}/{id}。 Entity 表示我在后端的集合,所以我知道要使用哪个模型。
将此应用于您的问题,您会得到类似的结果:
GET {entity}/{userid}
POST {entity}
使用此解决方案,您不必为您在数据库中创建的每个新实体创建一个函数。它还具有 SOLID 原则的 Open-Closed 概念。