MessagePack 协议
MessagePack 协议比 JSON 更紧凑,推荐用于高流量二进制场景。每条消息是一个
MessagePack 数组,前缀为 VarInt 长度(见 aiosignalr.framing.binary 的
二进制分帧辅助函数)。
选择
connection = HubConnection(protocol="messagepack")
MessagePack 需要支持二进制的传输(WebSocket 或 Long Polling —— 不是 Server-Sent Events)。
消息数组
第一个数组元素是消息类型:
type | 消息 | 数组形状 |
|---|---|---|
| 1 | Invocation | [1, headers, invocationId?, target, args[], streamIds[]] |
| 2 | StreamItem | [2, headers, invocationId, item] |
| 3 | Completion | [3, headers, invocationId, resultKind, result?] |
| 4 | StreamInvocation | [4, headers, invocationId, target, args[], streamIds[]] |
| 5 | CancelInvocation | [5, headers, invocationId] |
| 6 | Ping | [6] |
| 7 | Close | [7, error?, allowReconnect] |
| 8 | Ack | [8, sequenceId] |
| 9 | Sequence | [9, sequenceId] |
Completion 结果类型
| 值 | 含义 |
|---|---|
| 1 | 错误([3, headers, invocationId, 1, errorMessage]) |
| 2 | Void(无结果) |
| 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解包,字符串键返回 Pythonstr。
性能说明
MessagePack 完全去掉 JSON 文本开销。适合:
- 消息量大(遥测、游戏、金融行情流)。
- 负载包含二进制安全的值。
- 带宽受限。