写点什么

Lyft 推广协作式 Protocol Buffers 设计的最佳实践

作者:Rafal Gancarz

  • 2024-10-14
    北京
  • 本文字数:1087 字

    阅读完需:约 4 分钟

Lyft 推广协作式 Protocol Buffers 设计的最佳实践

Lyft 分享了使用 Protocol Buffers 进行系统间集成的经验,主要关注于协作式的协议设计,以便于在团队和系统间共享定义。该公司倡导的方法是提高知识共享、一致性和开发流程质量,而不是原始的效率优化。


Lyft 已经采用 Protocol Buffers 很久了,在 2020 年,该公司介绍了从 HTTP+JSON 迁移至该方案的原因,列举了 ProtoBuf 作为接口定义语言(Interface Definition Language,IDL)的可描述性、适用于大多数语言的开源代码生成器、优化的二进制格式以及向后兼容 JSON API 的能力。


在三种语言技术栈(Python、Swift 和 Kotlin)中使用 Protocol Buffers 多年后,工程师们在协议定义设计方面积累了丰富的经验,尤其是跨团队和系统工作时,往往会遇到不熟悉 Protobuf 的同事。Lyft 的软件工程师 Roman Kotenko 提出了协议设计的关键原则:


清晰性:设计良好的协议在定义消息时,要明确哪些字段必须要设置。这样可以防止在实现过程中漏掉某些信息。换句话说,好的协议不会给实现者留下任何模糊不清的地方。

可扩展性:协议结构的构建必须要考虑到未来的愿景和潜在的发展路线图。这样,一些可预见的新增内容和破坏性变更就可以提前考虑到。


除此之外,Kotenko 还在文章中给出了一些最佳实践,Lyft 认为这些最佳实践对于采用 Protocol Buffers 作为广泛使用的分布式系统的接口定义语言(IDL)至关重要。


作者强调了使用 Protocol Buffers 的消息校验功能的收益。protovalidate 项目是一个基于用户定义的校验规则在运行时校验消息的推荐方式。它是 protoc-gen-validate 插件的后续版本(由 Lyft 创建,依然在 Lyft 内使用),由谷歌的 通用表达式语言(Common Expression Language,CEL) 提供支撑。该方案支持多种校验规则,可用于不同类型的消息和字段,如 unions(oneof)、enums、collections(repeated)、maps 和 scalars,包括封装类型。


Lyft 团队创建了一种方式,用来统一在协议定义中跨多个实体的常量值。Kotenko 展示了如何为实现该目而使用的自定义方案,但是他也警告采用该方案的注意事项,包括对协议定义用户的完全控制要求(例如,在内部使用协议的情况)。



Protocol Buffers 消息定义的样例(图片来源:Lyft 的工程博客)


其他的最佳实践也反映在了官方文档中,比如,在通用的用例中使用众人熟知的数据类型,包括未知的枚举值,以及利用 Protobuf 3.15 引入的新“optional”标签明确标记可选字段。


最后,作者指出,查看特定语言的教程对于了解所需的设置和所有微妙的细节(比如,类型映射和代码生成特性)至关重要,因为不同语言的某些行为是不同的。


查看英文原文:

https://www.infoq.com/news/2024/09/lyft-protocol-buffers-design/

2024-10-14 09:0310357

评论

发布
暂无评论
发现更多内容

IBM SPSS Statistics 默认工具栏缺失怎么办?

Rose

etcd-workbench一款免费好用的ETCD客户端,支持SSH Tunnel、版本对比

北风

Docker etcd tools etcd-client

3D模型轻量化

3D建模设计

3D轻量化 三维模型轻量化

恭喜 Databend 上榜 2023 开源创新榜「优秀开源项目 」

Databend

【Redis深度专题】「核心技术提升」从源码角度探究Redis服务的内存使用、清理以及逐出等底层实现原理

洛神灬殇

redis 底层原理 清理缓存 原理机制 功能实现 2024年第二篇文章

【分布式技术专题】「分析Web服务器架构」Tomcat服务器的运行架构和LVS负载均衡的运行机制(修订版)

洛神灬殇

tomcat 分布式 分布式技术 架构原理 2024年第三篇文章

支持M1/M2,Axure RP 9授权密钥激活可用 附 Axure RP 9激活教程

Rose

Axure RP 9汉化 原型设计软件 Axure RP 9破解版 Axure RP 9授权

【Redis技术专区】「原理分析」探讨Redis6.0为何需要启用多线程

洛神灬殇

redis 多线程 原理分析 并发机制 2024年第一篇文章

避免重复扣款:分布式支付系统的幂等性原理与实践

隐墨星辰

幂等性 支付系统设计与实现 全局幂等 防止重复扣款

3D 建模中的 GLTF、USDZ 和 GLB 3D 文件格式

3D建模设计

3D模型 GLTF glb USDZ

如何提高3D渲染速度

3D建模设计

3D渲染 3D加载 3D模型加载速度 3D模型渲染效率

通过聚道云软件连接器实现金蝶软件与客如云软件的无缝对接

聚道云软件连接器

案例分享

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(幸运池玩法)

石头财经

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

BlockChain先知

一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)

股市老人

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(Staking 玩法)

石头财经

One Switch 让你的 Mac 也能拥有控制中心

Rose

One Switch下载 苹果Mac 必备 系统功能快速开关工具

【Mac/win】Topaz Gigapixel AI v6.3.3 绿色便携版 自带激活补丁

Rose

图片放大工具 Topaz Gigapixel AI便携版 Topaz Gigapixel AI教程

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致?(Staking 玩法)

西柚子

聚道云软件连接器助力某动漫行业公司实现财务自动化

聚道云软件连接器

案例分享

好用的软件卸载工具:TrashMe激活最新版

mac大玩家j

Mac软件 卸载工具 软件卸载

GLTF编辑器设置3D纺织纹理贴图

3D建模设计

3D渲染 3D材质编辑 3D材质纹理贴图

一文读懂 $mash 通证 “Fair Launch” 规则(幸运池玩法解读篇)

西柚子

文字处理软件推荐 Mellel 6 激活中文版

胖墩儿不胖y

Mac软件 文字处理软件

纹理贴图如何为游戏角色增添质感

3D建模设计

3D渲染 3D材质纹理贴图 3D材质编辑器

5G-A,一根蓄满能量的弹簧

脑极体

5G

C 语言指针完全指南:创建、解除引用、指针与数组关系解析

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

一款便捷操作移动设备的PC工具

iofomo

android 开发工具 测试工具 PC ios 开发

macOS 14 Sonoma(最新MacOS系统) pkg完整安装包 14.2正式版

Rose

Lyft 推广协作式 Protocol Buffers 设计的最佳实践_业务架构_InfoQ精选文章