【问题标题】:Why does the MessagePack error extension (0x03) have top-level MP_MAP?为什么 MessagePack 错误扩展 (0x03) 具有顶级 MP_MAP?
【发布时间】:2020-05-27 20:56:34
【问题描述】:

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

【问题讨论】:

    标签: msgpack tarantool


    【解决方案1】:

    简短回答。

    目前(在 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 出于同样的原因。将来可能会为错误对象添加更多键。

    【讨论】:

    • 感谢您的详细解答!
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2021-06-09
    • 2020-03-31
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2021-01-17
    相关资源
    最近更新 更多