跳到主要内容

MessagePack 协议

MessagePack 协议比 JSON 更紧凑,推荐用于高流量二进制场景。每条消息是一个 MessagePack 数组,前缀为 VarInt 长度(见 aiosignalr.framing.binary 的 二进制分帧辅助函数)。

选择

connection = HubConnection(protocol="messagepack")

MessagePack 需要支持二进制的传输(WebSocket 或 Long Polling —— 不是 Server-Sent Events)。

消息数组

第一个数组元素是消息类型:

type消息数组形状
1Invocation[1, headers, invocationId?, target, args[], streamIds[]]
2StreamItem[2, headers, invocationId, item]
3Completion[3, headers, invocationId, resultKind, result?]
4StreamInvocation[4, headers, invocationId, target, args[], streamIds[]]
5CancelInvocation[5, headers, invocationId]
6Ping[6]
7Close[7, error?, allowReconnect]
8Ack[8, sequenceId]
9Sequence[9, sequenceId]

Completion 结果类型

含义
1错误([3, headers, invocationId, 1, errorMessage]
2Void(无结果)
3非 void 结果([3, headers, invocationId, 3, result]

分帧

每条消息前缀为 VarInt 形式的字节长度:

from aiosignalr.framing import encode_binary_message

frame = encode_binary_message(msgpack.packb([6])) # Ping

在 WebSocket 上以二进制帧发出;解析器增量组装完整帧。

示例

调用(invocationId "1"Add):

[1, {}, "1", "Add", [40, 2], []]

StreamItem:

[2, {}, "1", 0]

Ack:

[8, 7]

解析器行为

  • 未知消息类型被忽略。
  • 第一个元素必须是消息类型;非法负载抛 ProtocolError
  • MessagePack 数组以 raw=False 解包,字符串键返回 Python str

性能说明

MessagePack 完全去掉 JSON 文本开销。适合:

  • 消息量大(遥测、游戏、金融行情流)。
  • 负载包含二进制安全的值。
  • 带宽受限。

参见