Без сервера - большое приложение

Я новичок в бессерверных рамках.

Я запускаю Rest API, который будет иметь несколько маршрутов, например:

GET user / {идентификатор пользователя}

Пользователь POST


GET account / {accountid}

POST аккаунт

Нужны ли мне 2 услуги - учетная запись + пользователи?

Каковы лучшие практики? Если 2 службы, то 2 serverless.yml? У кого-нибудь есть пример для безсерверного большого приложения?

Спасибо всем!

3 ответа

Для вашего примера достаточно использовать один сервис (serverless.yml).

Вы можете использовать одну лямбду в 1 сервисе для обработки 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 лямбды (по одному на сущность)

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

Это действительно зависит от архитектуры, которую вы хотите для своего приложения. Посмотрите сюда, я думаю, что это может помочь вам решить, чего вы действительно хотите.

Если у вас много конечных точек в какой-то момент, вам могут понадобиться 2 службы, потому что вы достигнете предела ресурсов. Вы всегда можете установить pathmapping если вы хотите иметь один единственный URL для вашего приложения.

resources:
  Resources:
    pathmapping:
      Type: AWS::ApiGateway::BasePathMapping
      Properties:
        BasePath: <your base for this service>
        DomainName: mydomain.com
        RestApiId:
            Ref: ApiGatewayRestApi
        Stage: dev

В двух словах - как пожелаешь. Технически: вы можете объединить несколько функций в одну и вызывать конкретную, основываясь на атрибуте параметра события. Более того - вы можете без проблем запускать сервер Express/ KOA в AWS-лямбдах (или других FaaS).
+ в качестве бонуса вы можете использовать ANY а также {any+}:

    events:
  - http:
      path: /foo
      method: ANY
  - http:
      path: /foo/{any+}
      method: ANY

Но в целом - зависит от ситуации. Если вы вызываете определенную конечную точку очень часто, лучше переместить ее в разделенную лямбду. Если вы знаете, что скамейка конечных точек вызывается редко - лучше объединить их в одну лямбду. Особенно, если вы используете разминку.

В архитектуре мне нравится то, что здесь нет правильного ответа, но он наиболее подходит для вашей проблемы / ситуации. Кроме того, лучшие / передовые практики - это руководство, которое поможет вам во всем этом.

В моем случае я добавил сложности коду, поэтому мои пути CRUD очень просты. cms/{entity} или cms/{entity}/{id}. Entity означает мою коллекцию в моем BackEnd, поэтому я знаю, какую модель использовать.

Применив это к своему вопросу, у вас будет что-то вроде:

GET {entity}/{userid}
POST {entity}

С помощью этого решения вам не нужно создавать функцию для каждой новой сущности, которую вы создаете в своей БД. Он также имеет концепцию открытого-закрытого принципа SOLID.

Другие вопросы по тегам