Друзья, в преддверии майских праздников мы решили не заваливать вас сложными техническими статьями, поэтому нашли довольно интересный, а главное, легкий в прочтении материал, переводом которого с радостью делимся с вами. Данный материал мы хотим приурочить к запуску курса «Web-разработчик на Python».

С оригиналом можно ознакомиться тут.



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

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

Критерии и проверки концепции

Запуск проекта мы начали с определения критериев API, которые в итоге сузили до четырех пунктов:

  • Обеспечение хорошего DX (developer experience), простого использования и реализации;
  • Культивация основательного и растущего комьюнити, такого, которое позволило бы агрегировать и использовать широко распространенные технологии;
  • Поведения сходное со шлюзом с точки зрения архитектуры программного обеспечения, направленное на упрощение преобразования нашей системной интеграции из монолита в SOA (сервис-ориентированную архитектуру);
  • Возможность реализовывать инструменты управления API, а именно управление интерфейсом API, документацию и доступ к данным.

Дальше мы выбрали несколько моделей API и проверили несколько концепций, чтобы понять их целесообразность:

  • Rest API с Swagger
  • GraphQL API с Graphene
  • API с Falcor



После тщательного тестирования мы выяснили, что GraphQL и его реализации Graphene наилучшим образом соответствовали нашим критериями в сравнении с другими моделями. Это позволило нашим front-end разработчикам легче использовать наш API, а заодно и упростить его использование в клиентских приложениях (например, React JS и Apollo Client). В нашей архитектуре GraphQL также оказался проще и эффективнее в качестве шлюза паттернов. В итоге мы окончательно решили двигаться дальше с GraphQL и Graphene.

Путь в продакшн

В апреле 2017 года, после интенсивной полугодовой разработки, мы вышли в продакшн с нашим API. К лету мы пересадили все продукты dailymotion (веб, мобильные и ТВ) на наш API GraphQL.



Когда мы выбрали GraphQL три года назад, он еще находился в бета-версии и не достиг той популярности, которую имеет на сегодняшний день. Мы были первыми крупными игроками на этой арене и это сделало нашу внутреннюю реконструкцию еще приятнее.

Рождение Tartiflette

В первые месяцы 2018 года, после более чем полугода использования Graphene, мы решили шагнуть дальше и написать свой собственный движок GraphQL. Это позволило нам реализовать некоторые требования, которые не выполнялись Graphene. Мы разработали критерии для нашего собственного движка. Он должен:

  • Обеспечивать лучший DX, ориентированный на мышление Python разработчиков;
  • Использовать SDL (Schema Definition Language);
  • Использовать asyncio в качестве самостоятельного исполняющего движка;

После почти года разработки и многих недель тестирования нашей инфраструктуры (в среднем обрабатывалось более 100 миллионов вызовов в день) мы с гордостью предлагаем сообществу GraphQL наш собственный движок с открытым исходным кодом Tartiflette.

ДНК Tartiflette

Tartiflette-это реализация GraphQL Server, построенная на Python 3.6+
Схема GraphQL описывается при помощи нового языка описания SDL (Schema Definition Language);
Производительность является ключевым элементом нашей работы и это отражено в Tartiflette;
Построен с учетом Zen of Python. Не усложнен чрезмерно.

Hello world на Tartiflette



import asyncio

from tartiflette import Engine, Resolver

@Resolver("Query.hello")
async def resolver_hello(parent, args, ctx, info):
    return "hello " + args["name"]


async def run():
    ttftt = Engine("""
    type Query {
        hello(name: String): String
    }
    """)

    result = await ttftt.execute(
        query='query { hello(name: "Chuck") }'
    )

    print(result)
    # {'data': {'hello': 'hello Chuck'}}

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())

О новом функционале вы можете узнать в руководстве на tartiflette.io.

Что будет дальше с Tartiflette?

Открытый исходный код Tartiflette – это только первый шаг. Вот несколько идей и планов на будущее для развития Tartiflette:

  • «Полировка» документации для пользователей и комьюнити;
  • Предоставление большего количества примеров и расширения вариантов использования, чтобы воодушевить вас на эксперименты с возможностями Tartiflette;
  • Повышение производительности, главным образом на уровне исполняющего движка.

А еще нам нужны вы!



Вы можете использовать наш проект практически для любых целей и помочь нам в развитии Tartiflette! Пожалуйста, проверяйте его на прочность, не стесняйтесь искать ошибки или противоречия в коде и поддерживайте обратную связь для улучшения продукта. Мы действительно считаем, что Tartiflette станет лучше при тесном сотрудничестве с сообществом.

Как внести свой вклад в проект?

Tartiflette на Github;
Читайте документацию на tartiflette.io;
Отправляйте отзывы и предложения в Slack;
Присоединяйтесь к сообществу в Twitter.

Комментарии (0)