【发布时间】:2020-05-27 20:56:34
【问题描述】:
在 Tarantool 2.4.1 中,引入了新的 MessagePack extension 来序列化错误。在扩展主体的最顶层有一个只有一个元素的映射,一个错误堆栈(一个由错误映射组成的数组)。我想知道这个顶级地图是否可以包含多个元素,如果不能,为什么需要它?为什么不只是将错误堆栈作为扩展主体?
【问题讨论】:
在 Tarantool 2.4.1 中,引入了新的 MessagePack extension 来序列化错误。在扩展主体的最顶层有一个只有一个元素的映射,一个错误堆栈(一个由错误映射组成的数组)。我想知道这个顶级地图是否可以包含多个元素,如果不能,为什么需要它?为什么不只是将错误堆栈作为扩展主体?
【问题讨论】:
目前(在 2.4.1 中)它只包含一个字段,IPROTO_ERROR_STACK (0)。但是将来可能会在此地图中添加更多字段。选择具有单个密钥的 MP_MAP 格式是为了获得更好的可扩展性。所有连接器都应该能够解析 IPROTO_ERROR_STACK 键,并跳过任何其他键。因此,即使在未来的 Tarantool 版本中,新的字段被添加到地图中,旧的连接器仍然能够解析响应。
在 Tarantool 中,大多数二进制协议 (IPoto) 的响应都具有 MessagePack 映射的形式:MP_MAP。即使这个map中只有1或2个字段,它仍然是MP_MAP,而不是MP_ARRAY,当然也不只是无格式的字节数组。
一些这样的反应已经存在很多年了。 Tarantool 出现了很多连接器,它们能够在 IProto 协议中发送/接收和解析来自 Tarantool 的响应。
并且,在使用所有创建的软件来处理响应进行了多年的利用之后,当有必要更改这些响应中的某些内容时,MP_MAP 就派上用场了。使用 MP_MAP 很容易将新字段添加到响应中,而不会破坏所有旧连接器。假设他们准备好可能会收到一些新的未知密钥,他们只是跳过它们。
这就是为什么在 Tarantool 中大量使用 MP_MAP 作为顶级响应类型的原因。它易于扩展且不会破坏旧代码。带有 IPROTO_ERROR_STACK 的错误消息包格式是 MP_MAP 出于同样的原因。将来可能会为错误对象添加更多键。
【讨论】: