Netflix实用API设计:使用Protobuf FieldMask实现GraphQL类似字段屏蔽功能


在 Netflix,我们大量使用gRPC来实现后端到后端的通信。当我们处理请求时,知道调用者对哪些字段感兴趣以及忽略哪些字段通常是有益的。某些响应字段的计算成本可能很高,某些字段可能需要远程调用其他服务。远程通话从来都不是免费的;它们会带来额外的延迟,增加出错的可能性,并消耗网络带宽。
我们如何了解响应中不需要提供调用者的哪些字段,从而避免进行不必要的计算并删除调用?使用 GraphQL,这是通过使用字段选择器开箱即用的。
但是如果不使用GraohQL,如何办?在 JSON:API 标准中,类似的技术称为 Sparse Fieldsets,在设计 gRPC API 时,我们如何实现类似的功能?
在Netflix Studio Engineering 中使用的解决方案是 protobuf FieldMask
 
Protobuf FieldMask
Protocol Buffers,或简称为 protobuf,是一种数据序列化机制。默认情况下,gRPC 使用 protobuf 作为其 IDL(接口定义语言)和数据序列化协议。
FieldMask 是一个 protobuf 消息。当此消息出现在 RPC 请求中时,有关如何使用此消息有许多实用程序和约定。FieldMask 消息包含一个名为 的字段paths,该字段用于指定应由读取操作返回或由更新操作修改的字段。

message FieldMask {
  // The set of field mask paths.
  repeated string paths = 1;
}

Protobuf FieldMask 是一个简单但功能强大的概念。它可以帮助使 API 更健壮,服务实现更高效。
这篇博文介绍了 Netflix Studio Engineering 如何以及为何将其用于读取数据的 API。第 2 部分将阐明使用 FieldMask 进行更新和删除操作。
详细点击标题