凌云的博客

行胜于言

Proto 限制[译]

分类:proto| 发布时间:2025-01-14 07:47:00

原文: Proto Limits

包括了 Proto 模式中支持的元素数量的限制。

本主题记录了 Proto 模式中支持的元素数量(字段、枚举值等)的限制。

这些限制是由许多工程师发现的,但并不全面,并且可能在某些方面存在错误或过时的情况。 欢迎您在工作中发现新的限制时,将其添加到本文档中,以帮助其他工程师。

字段数量

Message 中包含只有标量字段(比如:bool)

  • ~2100 个字段 (proto2)
  • ~3100 (proto3 不包含使用 optional 字段的情况)

空消息通过添加单个字段(例如布尔值)进行扩展

  • ~4100 个字段 (proto2)

proto3不支持扩展。

要测试此限制,请创建一个包含超过上限数量字段的 Proto 消息,然后使用 Java Proto 规则进行编译。 此限制是由 Java 虚拟机(JVM)规范所规定的。

To test this limitation, create a proto message with more than the upper bound number of fields and compile using a Java proto rule. The limit comes from JVM specs.

枚举中值的个数

在 Java 中,最低限制约为 1700 个值。 其他编程语言的限制可能不同。

消息的总大小

任何以序列化形式存在的 Proto 消息都必须小于 2GiB,因为这是所有实现都支持的最大大小。 建议对请求和响应的大小进行限制。

对 Proto 进行反序列化时的深度限制

  • Java: 100
  • C++: 100
  • Go: 10000 (有计划将其减少至 100)

如果你尝试反序列化的消息的深度超过了限制,那么反序列化将会失败。