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

问题描述 投票:1回答:1

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

msgpack tarantool
1个回答
3
投票

简短回答。

当前(在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可以轻松地将新字段添加到响应中,而不会破坏所有旧的连接器。假设它们已经准备好,可能会收到一些新的未知密钥,而他们只是跳过它们。

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

© www.soinside.com 2019 - 2024. All rights reserved.