1) 登录错误
”first message must be login”
发送有效的login作为您的第一帧。
login_failed
- 缺少/无效的
apiKey - 没有允许或请求的频道
- 博彩公司不被允许
too_many_connections (4003)
- 达到您的密钥组的最大连接数(最大:5)
- 分片或减少并发连接
- 联系支持以提高限制
2) 已连接但未收到任何内容
- 未订阅预期的频道?检查
login_ok.channels - 过滤器太窄?例如空的
sportIds或无效的bookmakers - 博彩公司门控过滤器:
- 如果上游消息没有匹配的博彩公司键,它会被过滤掉
3) 二进制解码问题
使用receiveType: "binary"时:
- 数据帧:MessagePack
- 控制帧:JSON
3b) zstd解码问题
使用receiveType: "zstd"或"zstd-dict"时(参见压缩):
- 解压失败/输出乱码 —— 在
"zstd-dict"模式下您没有使用正确的字典解压。从每个二进制帧读取dictId并使用匹配的字典;dictId = 0表示无字典。在"zstd"模式下每一帧都是无字典的——直接解压即可。 - 帧看起来是纯JSON而不是zstd —— 网关对您做了降级。检查
login_ok.receiveType:如果是"json",说明该网关尚未启用zstd(正在逐步发布),您必须按文本JSON解码。 - 缺少字典(仅
"zstd-dict")——dict控制帧在login_ok之后、数据帧之前到达。在处理二进制帧之前按dictId存储它们。每次连接都会重新发送,无需预先缓存。
4) 恢复期间的snapshot_required
意味着服务器无法安全重放。可能的原因:
server_restartedresume_window_exceededclient_backpressure
如果您的lastSeenId太旧,即使短暂的断开连接也可能超过缓冲区。
恢复:
- 通过REST重新获取快照
- 重置您的
lastSeenId - 继续流式传输
5) 负载下断开连接(背压)
症状:- 关闭代码
4002 - 跳过的
odds更新
- 使用
receiveType: "zstd"(或"zstd-dict")—— 线路上更小的帧意味着更小的背压 - 将解析推送到异步队列
- 按
sportIds、bookmakers过滤
6) entryId中的间隙
entryId是一个游标——不是交付账本。预期存在间隙,原因包括:
- 上游跳过
- 网关合并
- 未重放的重新连接
7) 服务器要求您重新连接
您收到一个控制帧:- 收到此消息后立即重新连接;不要等待套接字关闭。
- 预期下次恢复时会收到原因为
server_restarted的snapshot_required(新副本 = 新的serverEpoch)。通过REST重新获取快照并继续。 - 参见恢复和重放。
8) 关闭代码说明
4000范围的代码由网关主动发送,并始终附带原因字符串。其他代码均来自传输层或您自己的客户端库。
1011 / 1006 —— 瞬时的基础设施关闭
网关从不发送这些代码。它们出现在您与网关之间的连接被中断时——最常见于发布或节点重启期间,紧随§7的reconnect控制帧之后(在staging环境上会更频繁,因为它部署频繁)。
- 将两者都视为瞬时问题:使用短暂退避重新连接并重新订阅。
- 主动处理§7的
reconnect帧,通常在关闭到来之前您就已经完成切换。 - 持续的1011/1006循环(每次重连都失败)则是另一类问题——请先检查您的网络路径,然后联系支持。
1009 —— 帧对您的客户端来说太大
网关不限制出站帧大小;未压缩的odds帧可能超过1 MiB。请提高您的库的限制(例如python-websockets中的max_size),或切换到receiveType: "zstd" / "zstd-dict"——压缩后的帧大小只是原来的几分之一。