比 Protocol Buffers 快无限倍,开源十年后 Cap'n Proto 1.0 终发布


Cap'n Proto 是一种速度极快的数据交换格式和 capability-based RPC 系统,于 2013 年 4 月开源发布。时至今日,Cap'n Proto 1.0 终于发布,这是一个长期支持版本。

Cap'n Proto 项目作者是 Kenton Varda —— Protocol Buffers version 2 的主要开发者。他表示,Cap'n Proto 是其多年来开发 Protobufs、听取用户反馈并汲取经验思考反思后的成果结晶。

目前他已离开谷歌,因此“Cap'n Proto 不隶属于谷歌,也从未隶属于谷歌”。基准测试结果表明,Cap'n Proto 比 Protocol Buffers 快无限倍。

自上一个版本 v0.10 以来,新版本的一些亮点内容包括:

  • 针对 Cap'n Proto RPC 性能的一系列优化。其中包括减少 RPC 实现和 KJ I/O 框架的内存分配量,增加从 RPC 协议中省略某些信息以减少流量的功能,以及更好地缓冲一起发送和接收的小信息以减少系统调用。
  • Breaking change: 在此之前,服务器可在调用完成后调用 context.allowCancellation(),选择允许取消 RPC。在 1.0 版中,选择取消 RPC 可通过模式注解(c++.capnp 中定义的 allowCancellation 注解)来实现;模式级注解可以一次对整个文件进行设置。此外,动态选择加入需要大量的簿记工作,在实际使用中会对性能产生明显影响;而改用注释则能提高性能。对于从未使用 context.allowCancellation() 的用户来说,升级到 1.0 版时无需做任何更改,默认情况下仍不允许取消。(如果受到影响,你将看到编译错误。如果没有编译错误,则无需担心)。
  • KJ 现在在有 kqueue() 的系统(MacOS 和 BSD 衍生版本)上使用它来处理异步 I/O。在 Linux 上,KJ 一直使用 epoll,但在其他类 Unix 平台上,KJ 一直使用较慢的 poll()-based 方法。
  • KJ 的 HTTP 客户端和服务器实现现在支持 CONNECT 方法。
  • 引入了一个新类 capnp::RevocableServer,以帮助在生命周期不受包装器控制的对象周围导出 RPC 包装器。
  • 以及一些更小的 bug 修复和改进。详情可参阅 PR 历史记录。

在 1.0 版本发布后,2.0 版本的工作也开始提上日程。根据规划,v2.0 旨在对 Cap'n Proto 的 C++ API 及其配套的 KJ C++ 工具包库做出一些改变;以及做一些全面的向后兼容改动以修复一些问题,并改善团队中开发人员的体验。目前的一些想法包括:

  • 需要一个支持 C++20 甚至 C++23 的编译器。Cap'n Proto 1.0 仅需要 C++14。

  • 需要一个支持 C++20 协程的编译器。

  • Cap'n Proto 的 RPC 应用程序接口、KJ 的 HTTP 应用程序接口和其他程序接口很可能会进行修改,使其更加的 coroutine-friendly。

  • kj::Maybe 将变得更符合人体工学。它将不再重载 nullptr 来表示值的缺失,将引入 kj::none 来代替。KJ_IF_MAYBE 将不再生成指针,而是一个引用(这是利用 C++17 特性实现的一种技巧)。

  • 将放弃对禁用异常情况下的编译的支持。

  • 将放弃对 no-RTTI 模式和其他会造成维护负担的特殊模式的支持。

  • 可能会修改 KJ 的引用计数方法,因为目前的设计已被证明对许多用户来说并不直观。

  • 将修复 kj::AsyncOutputStream 中一个长期存在的设计缺陷,目前 EOF 信号是通过销毁流来发出的。取而代之的是将添加一个返回 Promise 的显式 end() 方法。在不调用 end() 的情况下销毁数据流将发出错误的断开信号。(还想对 KJ 流 API 进行其他一些美观改进)。

  • 重新设计几个核心 I/O API,以便更好地适应 Linux 新的 io_uring 事件通知范式。

  • RPC 实现可能会改为默认允许取消。

值得注意的是,目前还没有计划对序列化格式或 RPC 协议进行任何向后不兼容的更改。所讨论的更改仅影响 C++ API。用其他语言编写的应用程序完全不受这一切的影响。

正式的 2.0 版本短时间内不会推出发布,或许也要等上几年。

更多详情可查看官方公告


相關推薦

2024-05-30

Protocol Buffers 27.0 已经发布。Protocol Buffers(protobuf)是 Google 开源的语言无关、平台无关的可扩展机制,用于序列化结构化数据。 具体更新内容包括: Announcements Protobuf News 可能包括针对即将发生的更改的附加公告或

2023-11-06

Protocol Buffers 25.0 已经发布。Protocol Buffers(protobuf)是 Google 开源的语言无关、平台无关的可扩展机制,用于序列化结构化数据。 具体更新内容包括: Announcements Protobuf News 可能包括针对即将发生的更改的附加公告或

2023-09-10

TypeScript的速度比esbuild+Node快5倍!原因在于其使用了Apple开源的WebKit引擎,而不是Node常见的V8。 bun index.ts Bun内置对TypeScript和JSX的支持,省去了编译配置的麻烦。同时它也能兼容CommonJS和ESM模块,你可以在同一文件内混合使用im

2023-08-21

Protocol Buffers 24.1 已经发布。Protocol Buffers(protobuf)是 Google 开源的语言无关、平台无关的可扩展机制,用于序列化结构化数据。 具体更新内容包括: Announcements Protobuf News 可能包括针对即将发生的更改的附加公告或

2024-08-03

Protocol Buffers 27.3 已经发布。Protocol Buffers(protobuf)是 Google 开源的语言无关、平台无关的可扩展机制,用于序列化结构化数据。 具体更新内容包括: Announcements Protobuf News 可能包括针对即将发生的更改的附加公告或

2024-06-29

Protocol Buffers 27.2 已经发布。Protocol Buffers(protobuf)是 Google 开源的语言无关、平台无关的可扩展机制,用于序列化结构化数据。 具体更新内容包括: Announcements Protobuf News 可能包括针对即将发生的更改的附加公告或

2023-03-03

库,采用 Rust 编写。其开发团队近日宣布:经过近一年的开源研发工作,时序数据库 CeresDB 1.0 正式发布,达到生产可用标准。 CeresDB 1.0 官方中文文档:https://docs.ceresdb.io/cn/ CeresDB 1.0 核心特性介绍 存储引擎 支持列式混合

2021-12-22

2021 年 11 月 29 日 ,Dominic Szablewski 创建一种新的图像文件格式规范 “QOI”,QOI 的全称是 Quite OK Image Format,直译为“相当棒的图像格式”。QOI 可以用于将 RGB 和 RGBA 图像无损地压缩为与 PNG 类似的大小,相同的文件大小下,Q

2022-11-02

在 Next.js Conf 大会上发布了 Next.js 13,同时宣布了最新的开源项目:Turbopack。Turbopack 是面向 JavaScript 和 TypeScript 优化的增量打包工具和构建系统,采用 Rust 编写,声称是 Webpack 的继任者。 其实 Turbopack 正是出自 Webpack 作者 Tobias

2023-05-05

行并编写你自己的 Mojo 代码(链接),Mojo 未来也将保持开源。

2023-09-13

|2023 Google 开发者大会精彩演讲回顾 Aydyn Tairov 是一名开源作者,也是 Meta 前工程师,他此前将 GitHub 上火热的纯 C 语言实现的llama2.c项目移植到了 Python ——llama2.py。 上周 Mojo 编程语言正式开放下载,并且声称比 Python 快

2023-10-18

【源创会预告】1024 程序员节(的前两天),相约开源PHP办公室,我们一起聊 AI!>>> Ruff v0.1.0 已发布,此版本主要变化包括提升稳定性、引入新的预览模式、引入 fix safety 等级,以及执行正式的版本控制策略。 新的预览模

2023-08-17

g Structural Reparameterization》中提出的 FastViT 架构已正式开源。 论文地址:https://arxiv.org/pdf/2303.14189.pdf 代码仓库:https://github.com/apple/ml-fastvit FastViT 有机地结合了 CNN 和 Transformer 的优势,无论在精度或者运行效率上均有了稳

2022-10-26

Next.js 13 现已发布,一些亮点更新内容包括: app/ Directory (beta):更简单、更快、更少的客户端 JS。 Layouts React Server Components Streaming Turbopack (alpha):速度提高 700 倍的基于 Rust 的 Webpack 替代品。 新的 next/image&n