Создание
С такой ориентированной на разработчиков основой нам нужно было предоставить клиентам производительное, реактивное
В этом посте будет рассказано о том, чего мы намеревались достичь при создании консоли Stax, о нашем опыте создания бессерверного API GraphQL для его работы, а также об уроках, которые мы извлекли на этом пути.
Бессерверный по дизайну
Мы хотели создать бессерверное решение с самого начала, чтобы оно соответствовало архитектуре, которую мы используем для остальной части продукта. Одним из самых больших преимуществ, которые мы увидели в результате использования бессерверных архитектур в Stax, является время безотказной работы и надежность. Отказ от использования сервера, который может стать единой точкой отказа, позволяет нам соблюдать наше Соглашение об уровне обслуживания и гарантировать клиентам доступ к платформе в периоды пиковой нагрузки. Использование AWS Lambda означает, что запросы от нашего внешнего интерфейса масштабируются горизонтально, и всегда имеется достаточно вычислительных ресурсов для обработки запросов.
Использование бессерверных продуктов также повышает безопасность во время разработки, поскольку такие сервисы, как AWS Lambda, обеспечивают встроенные уровни соответствия и обслуживания. Предоставление Amazon возможности выполнять обновления и исправления инфраструктуры, на которой работает наш код, позволяет нам сосредоточиться на создании программного обеспечения, а не на управлении оборудованием.
Минимальные накладные расходы на инфраструктуру при переходе на бессерверные решения позволили нашей команде полностью взять на себя развертывание и мониторинг нашего API GraphQL. Например, разработчики могут добавить новые функциональные возможности сетей, используя отдельные функции Lambda для извлечения данных учетной записи, сводя к минимуму радиус поражения от внедрения нового изменения в рабочую среду.
Первые дни
Первая итерация нашей консоли имела довольно традиционную
При таком подходе мы столкнулись с несколькими техническими проблемами:
Инструменты. Современные интерфейсные фреймворки развиваются быстро. Использование данных из REST API с помощью React было сложным, и им было трудно управлять состоянием.
Стабильность. Тесная связь нашего внешнего SPA с внутренним REST API была эффективной, но контракт между системами постоянно менялся по мере разработки функций, которые рисковали нарушить наш пользовательский интерфейс.
Обновления в реальном времени. Нам нужно будет создать собственную реализацию WebSocket для отправки данных в наш интерфейсный SPA для обеспечения обновлений в реальном времени. Это было бы сложно реализовать как во фронтенде, так и во бэкенде.
Также стало очевидным, что по мере роста Stax как продукта консоль нуждалась в интеграции с другими серверными службами, помимо нашего REST API, такими как данные о стоимости и соответствии для учетных записей и наша служба поддержки клиентов. Взаимодействие с несколькими API и протоколами с разными механизмами аутентификации привело нас к рассмотрению шаблона Back End for Front End с одним GraphQL API.
Наша консольная архитектура сейчас
Архитектура сосредоточена на уровне API GraphQL, который выступает в качестве
Ключевая причина, по которой GraphQL подходит для наших нужд, заключается в том, что данные могут быть получены из любого источника с помощью преобразователя и представлены во внешнем интерфейсе в виде единого интерфейса. Это означает, что по мере роста Stax мы можем реорганизовать и оптимизировать серверные службы с минимальным воздействием на наших разработчиков и клиентов. Аутентификация также значительно упрощена. Внешний интерфейс выполняет аутентификацию в нашем API GraphQL в одном месте, которое обрабатывает подключения к различным API REST и GraphQL и источникам событий за кулисами.
В Stax мы тесно сотрудничаем с AWS и стараемся использовать нативные решения AWS, где это возможно, в рамках нашей философии разработки. Мы решили использовать AWS AppSync, полностью управляемую бессерверную реализацию GraphQL в качестве ядра нашего сервиса.
AWS AppSync реализует основные директивы GraphQL, включая подписки GraphQL, которые управляют соединениями WebSocket между клиентами и вашим API GraphQL. AWS Lambda извлекает и преобразует данные в функциях преобразователя GraphQL, AWS DynamoDB используется для бессерверных хранилищ данных, а AWS EventBridge запускает функции Lambda в ответ на системные события.
Наша текущая архитектура консоли Stax использует GraphQL, AWS AppSync, AWS Dynamo и AWS EventBridge.
Создано с помощью Stax
Stax — это продукт, ориентированный на API, поэтому мы использовали общедоступный Stax REST API для создания большей части пользовательской консоли. Использование (на самом деле пробная версия) нашего собственного REST API означает, что мы можем протестировать функциональность и улучшить нашу документацию до того, как функциональность будет выпущена для клиентов, действуя в качестве нашего собственного контроля качества. Наличие GraphQL API, который проксирует нашу серверную часть, также позволяет нам внедрять новые функции в консоль до того, как они станут общедоступными для клиентов в Stax REST API. Мы можем просто подключить его к AppSync и добавить в консоль в качестве «
Наш API GraphQL взаимодействует с серверной частью Stax, обмениваясь данными аутентификации от AWS Cognito между сервисами. Это обеспечивает строгое разделение пользовательских данных организацией клиента на каждом этапе процесса и поддерживает контрольный журнал, привязанный к конкретному пользователю, инициировавшему действие. Наличие единого
AppSync API также подключается к шине событий Stax для прослушивания системных событий, генерируемых серверными службами, таких как статус завершения отдельных шагов настройки учетной записи. Мы используем подписки GraphQL для расширения функциональности, предоставляемой шиной событий Stax, и отправки обновлений на консоль без необходимости обновлять страницу.
Принимая ограничения
Аутентификация часто представляет собой проблему для бессерверных архитектур, поскольку информация об аутентификации пользователя должна передаваться каждой службе или API, участвующим в выполнении запроса. Один запрос GraphQL может привести к вызову нескольких нижестоящих служб — например, для отображения сети, учетной записи, в которой она развернута, и пользователя, создавшего ее.
AWS AppSync упрощает абстрактную аутентификацию с помощью AppSync Pipeline Resolvers, но
Будучи относительно новым продуктом, AWS AppSync имел несколько ограничений в реализации GraphQL, которые нам пришлось преодолеть. AppSync устанавливает строгий
Следующие шаги
Будущее нашего API GraphQL будет сосредоточено на повышении производительности за счет кэширования данных и расширении обновлений в реальном времени для всех компонентов Stax. Кэширование данных позволит клиентам управлять своими средами Stax и просматривать данные, даже когда нижестоящие сервисы недоступны.
Поскольку платформа Stax продолжает развиваться, мы продолжим добавлять новые функции в нашу консоль, чтобы вашей организации было как можно проще управлять всеми аспектами своей экосистемы AWS из одного места. Но поскольку мы используем бессерверный подход, нам не нужно выделять усилия на обслуживание серверов. Вместо этого мы можем сосредоточиться на создании более удивительных возможностей для наших клиентов, в то же время оставаясь безопасными и совместимыми, даже когда платформа становится все более сложной.