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



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

简短的回答。

目前(在 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出现了许多连接器,它们能够在IProto协议中发送/接收和解析来自Tarantool的响应。

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

这就是为什么MP_MAP在Tarantool中大量用作顶级响应类型的原因。它很容易扩展并且不会破坏旧代码。错误消息包格式,带有IPROTO_ERROR_STACK,由相同的原因MP_MAP。将来可能会向错误对象添加更多键。

最新更新