Cloudflare запустила K2: бессерверные потоки событий поверх R2

Cloudflare запустила K2: бессерверные потоки событий поверх R2

Cloudflare объявила о запуске K2 в публичной бете. Это примитив для потоковой передачи событий на платформе для разработчиков (Developer Platform): производитель отправляет события в поток K2, а тот хранит их как упорядоченный журнал. Потребители читают события независимо и в своём темпе. Cloudflare называет сервис полностью бессерверным, масштабируемым на огромные объёмы данных и поддерживающим долгое хранение, поэтому даже длительный простой потребителя не приводит к потере данных.

Проблему, которую решает K2, компания описывает так: в классической архитектуре с вызовом удалённых процедур (RPC) производители и потребители должны совпадать и по масштабу, и по времени. Если производитель шлёт больше, чем потребитель успевает обработать, или потребитель недоступен, события теряются. С несколькими независимыми потребителями (например, интернет-магазин передаёт события о платежах и в аналитику, и в систему поиска мошенничества) всё ещё сложнее. Решение, поставить посередине сервис, который принимает записи и позволяет читателям забирать их независимо.

К2 изначально создавали как долговечный буфер на периферии сети (edge), слое приёма для Basin Pipelines. Pipelines построен на движке потоковой обработки с моделью чтения «по запросу», поэтому события нужно где-то хранить до обработки, причём надёжно: компания обязуется не терять события, принятые в поток Pipelines. Обычно в такой роли используют Apache Kafka, но Cloudflare пишет, что её архитектура (периферия сети в более чем 335 городах, небольшие и недолговечные «куски» машин, сеть через публичный интернет) часто не позволяет запускать традиционное ПО для распределённых систем вроде Kafka.

Поэтому K2 реализует партиционированный долговечный журнал поверх объектного хранилища R2. По словам Cloudflare, такие хранилища сочетают очень высокую долговечность (11 девяток) со строго согласованными API. Репликацию и консенсус отдали слою хранения, благодаря чему сам K2 проще, дешевле и быстрее; кроме того, вычисления и хранение масштабируются независимо, а большие объёмы истории хранятся недорого. Сложность в том, что R2, как и другие объектные хранилища, не поддерживает дозапись (append), стандартную операцию журнала. Поэтому K2 накапливает записи в памяти службы на периферии, ждёт короткое время и записывает всё одним файлом-сегментом. Порядок и строго возрастающие смещения (offsets) обеспечиваются атомарными операциями R2 без отдельной службы координации.

Обратная сторона, повышенная задержка записи: запись в объектное хранилище медленнее локального диска, да ещё нужно дождаться накопления пакета. В первом релизе K2 это даёт около 1 секунды задержки записи на 99-м процентиле (p99). Подробный технический разбор устройства Cloudflare пообещала опубликовать позже.

Относительно других продуктов компании: Queues рассчитаны на отслеживание отдельных дорогих или долгих задач (например, обработки изображений) и поддерживают повторы, отложенную доставку и очереди недоставленных сообщений на уровне отдельного элемента. K2, напротив, создан для перемещения больших объёмов данных, долгого хранения и рассылки многим потребителям; сообщения пишутся и читаются пакетами, что даёт эффективную обработку ценой отсутствия повторов на уровне отдельных сообщений и более высокой задержки записи, чем у Queues. Basin Pipelines, бессерверный сервис приёма JSON-событий с преобразованием и записью в R2 или Basin Catalog. Cloudflare советует Pipelines, если итог, запись событий в объектное хранилище или таблицы Iceberg, а K2, для собственной обработки или записи в другие места.

На практике поток создают через cf, Wrangler, панель управления или API. В примере команда cf k2 streams create --name app_events --http-enabled создаёт поток; запись идёт через HTTP API или привязку к Worker. K2 хранит данные как байты, формат выбирает разработчик. Затем создаётся подписка, делящая работу между потребителями. Потребитель вызывает consume и получает на 5 минут аренду (lease) на пакет событий; пакет можно подтвердить (ack), отклонить для повторной доставки (nack) или продлить аренду. Можно делить данные между потребителями одной подписки либо дать каждому потребителю отдельную подписку (модель pub/sub, где каждый видит все сообщения), либо смешивать подходы.

К2 доступен в публичной бете для аккаунтов с подпиской Workers Paid в пределах лимитов: не более 10 ГБ хранилища и 30 МБ/с записи на поток; повышение лимитов, через Discord или форму. Во время беты использование не тарифицируется. В планах: более высокий параллелизм записи (потоки до многих ГБ/с), ключи сообщений с гарантиями порядка по ключу, потребители на основе push в Workers, уровень Express с меньшими задержками и drop-in поддержка клиентов Apache Kafka. Сроков, кроме «в ближайшие месяцы», нет.

Ключевые факты

  • Cloudflare запустила K2 в публичной бете: бессерверный долговечный журнал событий на Developer Platform, который хранит данные поверх объектного хранилища R2 и подходит для долгого хранения и рассылки многим потребителям.
  • Цена архитектуры, задержка записи: в первом релизе около 1 секунды на 99-м процентиле (p99); сообщения пишутся и читаются пакетами, без повторов на уровне отдельных сообщений.
  • Порядок и строго возрастающие смещения обеспечиваются атомарными операциями R2 без отдельной службы координации; потребитель получает аренду на пакет на 5 минут и может подтвердить, отклонить или продлить её.
  • Лимиты беты для аккаунтов Workers Paid: 10 ГБ хранилища и 30 МБ/с записи на поток; во время беты K2 не тарифицируется.
  • В планах, потоки до многих ГБ/с, ключи сообщений, push-потребители, уровень Express с меньшими задержками и поддержка клиентов Apache Kafka.

Почему это важно

Cloudflare добавляет в свою платформу для разработчиков примитив, который обычно закрывают Apache Kafka: долговечный упорядоченный журнал событий с независимыми читателями. Компания объясняет, что её архитектура на периферии сети часто не позволяет запускать Kafka, поэтому журнал построен поверх R2, а репликацию и консенсус отдали хранилищу. Это показывает альтернативный подход: не разворачивать кластер, а строить журнал на объектном хранилище, жертвуя задержкой записи ради простоты, дешевизны и объёмов хранения.

Кому это важно

Разработчикам, которые уже работают с Workers и R2 и которым нужно развязать производителей и потребителей событий: аналитика, обнаружение мошенничества, сбор пользовательских событий. Также командам, которым нужно хранить историю потока долго и раздавать её нескольким независимым потребителям. Тем, кому важна минимальная задержка записи, K2 в первом релизе подойдёт хуже.

Как это применить

Создайте поток через cf, Wrangler, панель управления или API, отправляйте события по HTTP API или через привязку Worker, затем заведите подписку и забирайте пакеты вызовом consume с подтверждением, отклонением или продлением аренды. Для записи в объектное хранилище или таблицы Iceberg Cloudflare советует Pipelines, для собственной обработки и других мест назначения, K2, а для отслеживания отдельных задач с повторами и отложенной доставкой, Queues. Бета доступна на подписке Workers Paid в пределах 10 ГБ и 30 МБ/с на поток; пока бета идёт, плата не взимается. Цены после беты в тексте анонса не указаны.

Можно ли доверять

Это анонс самой Cloudflare в её блоге, поэтому все характеристики, собственные утверждения компании. Независимых замеров нет; сравнений с Kafka по пропускной способности или стоимости в анонсе не приводится, примеров клиентов и внешних отзывов тоже. Цифра задержки (около 1 секунды) относится к 99-му процентилю записи; о медианной задержке, чтении и сквозной задержке в тексте не сказано. Подробное техническое описание обещано отдельно.

Риски и подводные камни

Сервис в бете, с жёсткими лимитами (10 ГБ и 30 МБ/с на поток), а условия тарификации после беты пока неизвестны. Задержка записи выше, чем у локального диска и у Queues, а пакетная модель означает отсутствие повторов на уровне отдельных сообщений. Заявленные возможности, ключи сообщений, push-потребители, уровень Express и поддержка клиентов Kafka, пока только в планах, без сроков (сказано лишь «в ближайшие месяцы»).