为什么 MessagePack 错误扩展 (0x03) 具有顶级 MP_MAP?

Why does the MessagePack error extension (0x03) have top-level MP_MAP?

在 Tarantool 2.4.1 中,引入了一个新的 MessagePack extension 来序列化错误。在扩展主体的最顶层有一个只有一个元素的映射,一个错误堆栈(一个由错误映射组成的数组)。我想知道这个顶级地图是否可以包含多个元素,如果不能,为什么需要它?为什么不把错误堆栈作为扩展体?

简答。

目前(在 2.4.1 中)它只包含一个字段,IPROTO_ERROR_STACK (0)。但将来可能会向该地图添加更多字段。选择带有单个键的 MP_MAP 格式是为了更好的扩展性。所有连接器都应该能够解析 IPROTO_ERROR_STACK 键,并跳过任何其他键。因此,即使在未来的 Tarantool 版本中将新字段添加到地图中,旧的连接器仍然能够解析响应。

长答案。

在 Tarantool 中,大多数二进制协议 (IProto) 的响应都具有 MessagePack 映射的形式:MP_MAP。即使这个映射中只有 1 或 2 个字段,它仍然是 MP_MAP,而不是 MP_ARRAY,当然也不仅仅是一个非格式化字节数组。

一些这样的回应存在多年。出现了许多 Tarantool 连接器,它们能够 send/receive 并解析来自 IProto 协议中 Tarantool 的响应。

经过多年利用所有创建的软件来处理响应,当有必要更改这些响应中的某些内容时,MP_MAP 就派上用场了。使用 MP_MAP 可以很容易地将新字段添加到响应中,而不会破坏所有旧连接器。假设他们已经准备好接收一些新的未知密钥,他们只是跳过它们。

这就是为什么 MP_MAP 在 Tarantool 中被大量用作顶级响应类型的原因。它易于扩展且不会破坏旧代码。 Error MessagePack 格式,IPROTO_ERROR_STACK,同理也是MP_MAP。将来可能会向错误对象添加更多键。