Cloudflare K2 是在开发者平台上推出的无服务器事件流原语,旨在解决事件驱动架构中的一个基本挑战:保持数据生产者和消费者之间的同步。根据 Cloudflare 的公告,传统 RPC 架构常常遇到生产者发送数据速度快于消费者处理速度,或消费者停机导致事件丢失的问题。K2 通过插入一个持久的缓冲服务来解决此问题,该服务可以吸收写入操作,同时允许独立的读者按照自己的节奏消费数据,从而有效地解耦管道的两端。该公司最初开发 K2 是为了作为 Basin Pipelines 的摄取层,而 Basin Pipelines 需要持久存储来防止消费者停机时的数据丢失。

K2 的内部实现使用 Cloudflare 的 R2 对象存储作为基础,构建了一个分区的持久日志。它不依赖传统的追加式日志,而是在边缘服务的内存中累积写入,待写入完整的段文件后再写入 R2。该系统利用 R2 的原子操作实现严格递增的偏移量并保持顺序,而无需额外的协调服务。这种方法将计算和存储层分离,使得两者可以独立扩展,并能够以低成本存储海量历史数据量,受益于 R2 的 11 个九的持久性。虽然 K2 的设计在可扩展性和持久性方面具有显著优势,但由于在提交到对象存储之前需要累积写入,会带来生产延迟的权衡。Cloudflare 指出,这在初始版本中大约在 99th 分位数处增加了约一秒的延迟。

展示使用持久对象和 R2 的持久事件流的图表
展示使用 Cloudflare 持久对象和 R2 的持久事件流系统的插图,这是一种与 K2 事件流方法相关的技术,有助于可视化文中讨论的持久事件流范式。github.com

虽然文章描述 K2 是一种直接构建在 R2 存储之上的无服务器事件流服务,但此图展示了使用持久对象和 R2 的类似概念,有助于可视化文章中讨论的持久事件流范式。

该服务定位在 Cloudflare 现有的异步原语之间:Queues 用于带有复杂每项逻辑(如重试、延迟和死信队列)的单个工作项跟踪,以及 Basin Pipelines 用于专注于将事件写入对象存储或 Iceberg 表的摄取服务。K2 经过优化,适用于大规模数据移动、长期保留以及扇出消费模式,在这种模式下,消息以批次形式生产和消费,能够实现高效处理,但以牺牲消息级别的重试为代价。用户可以通过 cf CLI、Wrangler、仪表盘或 API 创建流,然后通过 HTTP API 或 Worker 绑定生产事件,并为消费者应用程序创建订阅以从流中读取数据。

K2 目前已对拥有 Workers 付费订阅的账户开放公开测试,每个流的存储使用限制为 10GB,生产速率限制为 30 MB/s。测试期间使用免费,Cloudflare 预计最终定价为:数据生产每 GB 0.04 美元,数据消费每 GB 0.04 美元,数据保留每 GB 每月 0.02 美元。路线图包括更高的写入并行性、消息键及基于键的顺序保证、推送式 Worker 消费者、具有较低延迟的快捷层以及对 Apache Kafka 客户端的即插即用支持。