Без сервера - большое приложение
Я новичок в бессерверных рамках.
Я запускаю 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.