Сегодня я выпустил DataLoader v2.0.0, спустя почти два года с момента последнего выпуска, более четырех лет с момента его первоначального выпуска и почти десять лет с момента первоначальной внутренней реализации в Facebook.

Вместе с ним пришли значительно улучшенные определения типов TypeScript и Flow, некоторые существенные улучшения в поведении планирования, которые приводят к лучшей производительности всей программы (а также возможность настраивать это поведение), а также более четкое юридическое оформление с лицензией MIT и нейтральным не -прибыльное владение авторскими правами.

Я хотел бы рассказать вам больше об этом выпуске, но сначала немного истории о том, откуда появилась эта библиотека.

Осенью 2015 года, вскоре после открытия исходного кода GraphQL, Дэн, Ник и я время от времени встречались с командами в других компаниях, чтобы отвечать на вопросы и давать советы о GraphQL и его работе в Facebook, а также обмениваться идеями об инфраструктуре продукта. Эти дискуссии были захватывающими и вдохновляющими, а зачастую и неожиданными. В Facebook GraphQL представлял собой тонкий слой поверх стопки абстракций, которые существовали гораздо дольше, большинство из которых были разработаны Ником и командой Product Infrastructure.

В команде GraphQL мы воспринимали эти абстракции как должное и предполагали, что почти каждая серьезная команда инженеров должна иметь что-то подобное. Это предположение было ошибочным. На этих внешних встречах мы часто оказывались в стороне и объясняли весь стек продуктов Facebook. Хотя целью было обсуждение GraphQL, в дискуссии часто преобладали детали того, как именно нам удалось создать быстрые страницы с большим количеством данных, не заканчивая спагетти кода.

В пятницу днем ​​в сентябре 2015 года мы с Дэном встретились с командой инженеров Pinterest. Мы слышали, что они начали создавать сложный планировщик запросов GraphQL, и были рады помочь. Хотя наше обсуждение GraphQL было отличным и хорошо информированным, мы были удивлены, обнаружив, что наиболее полезным было обсуждение Ent, неизменяемых объектов данных Facebook (Ник называет это «No-RM») и Loader, библиотека для создания энтов из источника данных с оптимизированными запросами.

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

Конечно, этот программный стек, кульминацией которого стал GraphQL, не был случайностью. Возможность эффективно загружать данные существовала в Facebook в течение многих лет (Ник даже говорил об этом в 2011 году, за год до GraphQL), и цель GraphQL заключалась в том, чтобы просто предоставить доступ к нашим существующим инструментам через веб-API. Именно тогда мы поняли, что на самом деле так важен Loader.

Loader был, по сути, динамическим планировщиком запросов GraphQL и секретным соусом для высокопроизводительного сервиса GraphQL от Facebook.

В этот самый момент мы свернули в следующую кофейню, которую прошли, открыли ноутбук и начали черновик JavaScript-версии Loader. Через пару часов у нас была полностью рабочая первая версия DataLoader. Мы были очень довольны тем, что это было около 100 строк простого кода, 250 строк, поскольку мы добавляли обильные комментарии, типы и встроенную документацию. Тот факт, что эта библиотека представляет собой один сжатый файл, вселил в нас уверенность, что мы действительно описываем общую концепцию, а не какое-то сложное программное обеспечение или алгоритм. Фактически, я смог объяснить историю, логику и весь исходный код примерно за полчаса. Буквально на следующей неделе мы представили DataLoader сообществу разработчиков ПО с открытым исходным кодом.

За прошедшие годы многое произошло, но DataLoader в основном остался прежним. Его не нужно было сильно менять, поскольку основная концепция остается такой же актуальной и ясной сегодня, как и в 2010 и 2015 годах. Сегодня DataLoader был перенесен почти на дюжину языков, помогает более чем 14 тысячам проектов с открытым исходным кодом и загружен более миллиона раз в месяц. Ранее в этом году мы создали некоммерческую организацию GraphQL Foundation, и DataLoader присоединился к нам.

Сегодняшний выпуск DataLoader v2.0.0 является первым после того, как он стал частью GraphQL Foundation, и самым значительным с момента первого выпуска более четырех лет назад. В этом выпуске есть три важных улучшения: юридические, типы и планирование.

Изначально DataLoader был выпущен под печально известной лицензией Facebook BSD + Patents. Эта лицензия вызвала проблемы у юридических групп в некоторых компаниях как при использовании библиотеки, так и при внесении в нее взносов. После перехода на GraphQL Foundation DataLoader был повторно лицензирован как MIT, и все авторские права были переданы нейтральной некоммерческой организации. Этот выпуск включает в себя эти правовые изменения, которые, мы надеемся, должны сделать DataLoader еще более легким в использовании и использовании для всех компаний.

JavaScript - это быстро развивающийся язык и экосистема. DataLoader по-прежнему отлично работает в старых версиях Node и в старых браузерах. Однако среды разработки вышли за рамки нашего исходного кода. Эта версия включает значительные улучшения в определения типов TypeScript и Flow, которые должны сделать использование DataLoader простым и безопасным в современных типизированных базах кода JavaScript. Как всегда, изменения в определениях типов могут приводить к появлению отчетов о новых проблемах, и это одна из причин, по которой это основной выпуск.

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

DataLoader пакетно и кэширует данные. Раньше это были два независимых варианта поведения: запрос либо попадал в кеш и возвращался раньше, либо пакетировался вместе с аналогичными запросами. В сегодняшнем выпуске они знают друг друга для еще лучшей оптимизации. Когда запрос может привести к другому зависимому запросу (например, сначала загружаются все ваши друзья, а затем любимая группа каждого друга), кэшированные результаты, возвращающиеся раньше, тогда пакетные результаты могут привести к двум отдельным запросам для групп. Теперь кэшированные результаты возвращаются одновременно с пакетными результатами, поэтому последующие запросы всегда предсказуемы, независимо от того, что кэшировано. На самом деле это не новое нововведение, а исправление, чтобы соответствовать исходному поведению Loader.

Грязный секрет DataLoader в том, что по большей части он довольно скучный. Интересно то, как планируются партии. Воспользовавшись особенностями цикла выполнения Node, пакеты могут собираться автоматически без дополнительной задержки. Однако после того, как этот бит был перенесен на другие языки, его было трудно или невозможно воспроизвести, и его часто заменяли либо чем-то более простым, например, отправкой вручную, либо глубокой интеграцией в настраиваемый механизм выполнения GraphQL. Это интересные нововведения, которые тоже заслуживают почв для экспериментов в этой библиотеке. Теперь вы можете предоставить настраиваемый планировщик пакетов, чтобы обеспечить то или иное поведение при планировании пакетов. Я надеюсь, что это приведет к интересным экспериментам и инновациям с сервисами GraphQL.

Однако подавляющее большинство DataLoader будет выглядеть так же, как и в течение многих лет. API остается почти таким же, и почти каждое существующее использование DataLoader не требует особой помощи при обновлении до этой последней версии. Фактически, в DataLoader так много единообразия, что это дает еще больше уверенности в том, что это вечнозеленая концепция и надежная абстракция.

Более подробный анализ DataLoader v2.0.0 можно найти в примечаниях к выпуску.

У DataLoader светлое будущее. Несмотря на медленные тонкие изменения, он остается критически полезным для десятков тысяч проектов. GraphQL Foundation обеспечивает лучший проектный, юридический и технический надзор. А новые оптимизации и гибкость должны привести к интересным экспериментам и более надежным сервисам GraphQL.

Спасибо всем, кто использовал DataLoader на протяжении многих лет, сообществу участников, которые помогли улучшить DataLoader и перенести его на многие другие языки. Вы все помогли распространить эту идею повсюду.