协议压缩-支付领奖弹板未关闭
日期: 2026-01-21 状态: 已解决(临时方案)
问题现象
支付后领奖弹板未正常关闭,无报错信息。
核心特征
s2c_sync_game_features 和 c2s_consume_purchase 协议顺序错乱:
s2c_sync_game_features晚于c2s_consume_purchase发送
根本原因
技术背景
| 协议 | 消息顺序保证 |
|---|---|
| WebSocket(基于 TCP) | 天然保证消息有序 |
| MQTT(发布/订阅模型) | 不保证消息顺序 |
原因分析
- 历史设计依赖有序性:客户端最初基于 WebSocket 开发,默认"天然保证消息有序"
- RPC 协议切换:pomelo 升级时 RPC 库从 WS 切换到 MQTT,打破了顺序逻辑
- Topic 路由问题:MQTT 消息通过「主题(Topic)」路由,
s2c_sync_game_features和s2c_consume_purchase可能被发布到不同 Topic
解决方案
当前方案(已采用)
将 RPC 协议降级为 WebSocket,恢复消息有序性。
备选方案(未实施)
如需保留 MQTT:
- 将
s2c_sync_game_features和s2c_consume_purchase发布到同一个 Topic - 在 pomelo-rpc 的 MQTT mailbox 配置中启用「单连接发布」
未实施原因:无法确定还有多少类似的顺序依赖场景需要处理,风险不可控。
相关协议
s2c_sync_game_features- 游戏功能同步推送c2s_consume_purchase- 消费购买请求/响应
参考资料
- 飞书记录:
https://ghoststudio.feishu.cn/wiki/ZJAHwjrhhintMDkCrWCc41dGngg