打开/关闭搜索
搜索
打开/关闭菜单
506
573
74
3933
寻星
导航
首页
最近更改
随机页面
特殊页面
上传文件
快速入门
新手入门
编辑方针
MediaWiki帮助
隐私政策
版权信息
打开/关闭外观设置菜单
无法加载偏好设置。请检查您的网络连接并重试。
重试
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。
user-interface-preferences
个人工具
讨论
贡献
创建账号
登录
编辑“︁
Cap'n Proto
”︁(章节)
✨寻星知识库——携手与您,寻觅群星。
分享此页面
查看
阅读
编辑
编辑源代码
查看历史
associated-pages
页面
讨论
更多操作
温馨提醒:
您没有登录账户。如果您做出任意编辑,寻星会记录您的IP地址,并且此IP地址将会公开可见以便管理和供其他用户参考。如果您不希望公开匿名用户IP地址,请您
登录
或
创建
一个账户,这样寻星就会在贡献记录中公开您的用户名而不是IP地址。使用账户同样也可以让您在寻星获取更多权限,有助于您进行深入贡献。
反垃圾检查。
不要
加入这个!
== 技术概览 == === IDL模式 === 与多数RPC框架(如早期的[[Sun RPC]]、[[DCE/RPC|OSF DCE RPC]]及其面向对象衍生品[[CORBA]]和[[DCOM]])类似,Cap'n Proto使用[[接口描述语言]](IDL)生成多种编程语言的RPC库,自动处理网络请求、数据类型转换等底层细节。其接口模式采用[[C语言]]风格语法,支持基础数据类型(布尔值、整数、浮点数等)、复合类型(结构体、列表、枚举)以及泛型和动态类型。该框架还支持多重继承等面向对象特性,但因此被批评增加了复杂性。<syntaxhighlight lang="capnp"> @0xa558ef006c0c123; # 手动或自动分配给文件和复合类型的唯一标识符 struct Date @0x5c5a558ef006c0c1 { year @0 :Int16; # @n 标记了字段被添加的顺序 month @1 :UInt8; day @2 :UInt8; } struct Contact @0xf032a54bcb3667e0 { name @0 :Text; birthday @2 :Date; # 字段可以添加到定义中的任何位置,但其编号必须反映它们被添加的顺序 phones @1 :List(PhoneNumber); struct PhoneNumber { # 没有静态 ID 的复合类型不能被重命名,因为自动生成的 ID 是确定性的 number @0 :Text; type @1 :PhoneType = mobile; # 默认值 enum PhoneType { mobile @0; landline @1; } } } </syntaxhighlight>Cap'n Proto 消息采用[[二进制]]编码,而非[[JSON]]或[[XML]]等文本格式。其设计目标是使存储/网络协议适合作为内存中的格式,从而避免将数据读入/写出内存时的转换步骤。<ref name=":0" group="注">与[[Apache Arrow]]不同,Cap'n Proto的内存值[https://news.ycombinator.com/item?id=14248780 不适合共享可变数据]</ref>例如,数字的表示([[字节序]])采用主流CPU架构的表示方式。当内存中的数据格式与网络传输协议格式相匹配时,Cap'n Proto 在创建或读取消息时就可以[[零拷贝|避免复制和编码数据]],而是直接[[指针 (计算机编程)|指向]]内存中值的位置。Cap'n Proto 还支持数据的随机访问,这意味着无需读取整个消息即可读取任何字段。 与其他二进制序列化协议(如 [[Fast Infoset|XMI]])不同,Cap'n Proto 认为在 RPC 层面进行细粒度的[[数据确认|数据验证]]是一种[[wikt:anti-feature|反模式]],会限制协议的[[模式演化|演进]]能力。这一观点源于在谷歌的经验,在那里即使只是将字段从''必填''改为''可选''也会导致复杂的运维故障。<ref name=":1" group="注">必填字段标记在[https://developers.google.com/protocol-buffers/docs/proto3 Protocol Buffers 3]中已移除</ref>Cap'n Proto 模式被设计为尽可能灵活,并将数据验证推至应用层完成,允许任意重命名字段、添加新字段以及使具体类型泛型化。然而,Cap'n Proto 在首次[[变异子与访问子|访问]]值时确实会验证指针边界并对单个值进行类型检查。 强制执行复杂的模式约束还会带来显著的开销,<ref group="注">''假设数据已经分配''(例如在网络缓冲区中、从磁盘读取),访问复杂度变为 [[大O符号|O(1)]]。额外的序列化/反序列化步骤(如检查值所需)会将性能限制在 O(n)。</ref> 抵消了重用内存数据结构的优势,并阻碍了对数据的随机访问。 Cap'n Proto 协议理论上适合通过不可变共享内存实现非常快速的[[进程间通信]](IPC),但截至 2020 年 10 月,尚无实现支持通过共享内存传递数据。尽管如此,Cap'n Proto 通常仍被认为比[[Protocol Buffers]]及类似的 RPC 库更快。 === 网络特性 === Cap'n Proto RPC具备网络感知能力:支持连接中断处理和[[Future与promise|承诺流水线]](将函数输出直接作为另一函数的输入),这为客户端省去了每次连续调用服务器所需的往返通信,而无需为每个可能的调用图提供专用 API。Cap'n Proto 当前支持基于TLS的传输,未来计划集成[[Noise Protocol Framework]]。作为传输层无关协议,其主线实现支持WebSockets、HTTP、TCP和UDP。 === 能力安全 === Cap'n Proto RPC 标准 拥有一个丰富的能力安全模型,该模型基于[[E语言|E]] [[E语言|编程语言]]所使用的 CapTP 协议。截至 2020 年 10 月,其参考实现仅支持第 2 级。
摘要:
温馨提示:
您在寻星上发布的所有贡献内容,
默认在知识共享署名-相同方式共享 3.0 中国大陆(CC BY-SA 3.0 CN)许可协议下发布
,如果您希望采用其他许可协议或许可约定,请务必在页面中指出。请参阅在
寻星:著作权
列出的相关内容。
未经许可,请勿提交受版权保护的作品!
发布侵权内容可能会让您失去在寻星的贡献权限。
取消
编辑帮助
(在新窗口中打开)
寻星知识库使用 Cookie 技术提升您的浏览体验,这需要在您的浏览器存储部分信息。禁用 Cookie 将导致部分功能无法正常使用。 寻星团队将严格遵守隐私政策,并尽可能保护您的信息安全。 继续浏览寻星知识库,视为您同意启用 Cookie 并生成、存储相关数据。
好的
编辑“︁
Cap'n Proto
”︁(章节)
✨寻星知识库——携手与您,寻觅群星。