【问题标题】: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 来处理 usersaccounts 请求。

      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 概念。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-05-28
            • 1970-01-01
            • 2017-09-08
            • 1970-01-01
            • 1970-01-01
            • 2019-02-13
            • 2020-09-01
            • 1970-01-01
            相关资源
            最近更新 更多