Современный мир цифровых технологий требует все более масштабных и эффективных решений для обработки огромных объемов данных. Компания Cloudflare, ведущий поставщик инфраструктурных сервисов для Интернета, столкнулась с необходимостью создания системы, способной справляться с потоком данных в десятки терабайт и миллиарды строк ежедневно. Ответом на эти вызовы стал фреймворк Jetflow — революционное решение для создания гибких и высокопроизводительных дата-пайплайнов, которое кардинально изменило подход к обработке данных в Cloudflare. Суть проблемы, с которой столкнулась Cloudflare, заключается в масштабах и сложности обработки информации. Их бизнес-интеллект команда управляет огромным дата-озером, ежедневно интегрируя данные из тысяч источников — начиная с внутренних баз данных, таких как Postgres и ClickHouse, и заканчивая внешними SaaS-приложениями, например Salesforce.
Ежедневная загрузка превышает 141 миллиард строк, причем некоторые таблицы содержат до нескольких миллиардов новых записей, что требует крайне эффективных алгоритмов обработки и трансформации данных. Существующие решения Extract Load Transform (ELT), применявшиеся ранее, не отвечали возросшим требованиям по скорости, расходу ресурсов и гибкости. Попытки использовать альтернативные популярные ELT-платформы не дали заметных преимуществ, что побудило команду Cloudflare создать собственный высокопроизводительный фреймворк, способный мастерски справляться с уникальными задачами компании. Jetflow стал результатом серьезного анализа потребностей и постановки четких требований к системе. В основе лежала задача перемещать и обрабатывать больше данных за меньшее время, используя при этом минимальное количество вычислительных ресурсов и оперативной памяти.
Ключевой аспект — потоковый режим загрузки данных, который позволяет работать практически в реальном времени и избегать больших пиковых нагрузок. Кроме того, решение должно было быть совместимо с уже существующей инфраструктурой, что предполагало возможность постепенного перехода без срывов рабочих процессов. Конечно, важна была и легкость конфигурации — стремление к минимизации объема ручного кода и максимуму автоматизации, чтобы специалисты разного уровня могли эффективно настраивать процесс инжестии данных. Одновременно с этим Jetflow выводит параметры кастомизации на новый уровень, позволяя гибко управлять ресурсами и параллелизмом для наиболее затратных операций, таких как создание Parquet-файлов. Особое внимание авторы уделили тестируемости и надежности.
В отличие от «черных ящиков» других систем, Jetflow предложил модульную архитектуру, разбивающую пайплайн на отдельные этапы, каждый из которых можно тестировать независимо. Такая сегментация значительно ускоряет разработку новых сценариев обработки, обеспечивает прозрачность и облегчает отладку. Архитектура Jetflow базируется на трех типах модулей: консюмеры, трансформеры и лоадеры. Консюмеры отвечают за извлечение данных из источников, трансформеры — за их преобразование и валидацию, а лоадеры — за сохранение результата в целевые системы хранения. Все эти компоненты связаны стандартным потоком данных, что обеспечивает совместимость и масштабируемость — добавление новых источников или целей не требует переписывания всей логики.
Для обеспечения повторяемости и идемпотентности обработки данных команда выделила три уровня разделения данных: RunInstance, Partition и Batch. Такая организация позволяет параллелить загрузку данных и при этом контролировать целостность и консистентность информации даже при повторных попытках обработки отдельных фрагментов, что важно для стабильности рабочих пайплайнов. Важным техническим достижением стала ориентация Jetflow на использование Arrow — формата колоночных данных в памяти. Это решение позволило практически избавиться от накладных расходов на сериализацию и десериализацию, а также значительно снизить нагрузку на сборщик мусора в языке программирования Go за счет уменьшения количества выделяемых объектов памяти. Еще одним переосмыслением стало изменение подхода к представлению данных от строкового к колоночному виду.
Поскольку конечный формат данных Parquet — колоночный, исключение нескольких этапов преобразования заметно повысило общую производительность системы, особенно при работе с такими источниками, как ClickHouse, где данные изначально поступают в колоночном формате. На примере ClickHouse команда Cloudflare продемонстрировала, что глубокая оптимизация драйверов для работы с конкретной базой данных приносит значительный выигрыш. Переход на использование низкоуровневой библиотеки ch-go, работающей напрямую с блоками данных ClickHouse, позволил ускорить обработку до миллионов строк в секунду даже на одном соединении, превосходя ожидания и стандартные драйверы. Для Postgres был разработан аналогичный подход, основанный на использовании драйвера jackc/pgx и прямом доступе к сырым байтам строк без промежуточных аллокаций. Такой подход снизил накладные расходы и повысил пропускную способность до почти 600 тысяч строк в секунду на одно соединение, что является выдающимся результатом для подобных систем.
Новые возможности Jetflow позволили Cloudflare существенно сократить время выполнения самых тяжелых задач — одна из самых больших загружаемых таблиц, которая ранее обрабатывалась почти два дня и требовала 300 ГБ оперативной памяти, теперь проходит менее чем за 6 часов с использованием всего 4 ГБ памяти. Это не только повышает эффективность, но и значительно снижает операционные расходы на инфраструктуру. Сегодня Jetflow является ядром системы инжестии данных Cloudflare, на него приходится обработка 77 миллиардов записей ежедневно, с постепенной миграцией оставшихся задач, что обещает довести этот показатель до 141 миллиарда. Такая система открывает новые горизонты для анализа и мониторинга, делая доступными данные, которые ранее было либо дорого, либо невозможно обрабатывать в нужном объеме и скорости. В планах команды — открытие исходного кода Jetflow, что позволит сообществу развивать и адаптировать технологию под собственные нужды.