Skip to content

协议压缩-支付领奖弹板未关闭

日期: 2026-01-21 状态: 已解决(临时方案)


问题现象

支付后领奖弹板未正常关闭,无报错信息。

核心特征

s2c_sync_game_featuresc2s_consume_purchase 协议顺序错乱:

  • s2c_sync_game_features 晚于 c2s_consume_purchase 发送

根本原因

技术背景

协议消息顺序保证
WebSocket(基于 TCP)天然保证消息有序
MQTT(发布/订阅模型)不保证消息顺序

原因分析

  1. 历史设计依赖有序性:客户端最初基于 WebSocket 开发,默认"天然保证消息有序"
  2. RPC 协议切换:pomelo 升级时 RPC 库从 WS 切换到 MQTT,打破了顺序逻辑
  3. Topic 路由问题:MQTT 消息通过「主题(Topic)」路由,s2c_sync_game_featuress2c_consume_purchase 可能被发布到不同 Topic

解决方案

当前方案(已采用)

将 RPC 协议降级为 WebSocket,恢复消息有序性。

备选方案(未实施)

如需保留 MQTT:

  1. s2c_sync_game_featuress2c_consume_purchase 发布到同一个 Topic
  2. 在 pomelo-rpc 的 MQTT mailbox 配置中启用「单连接发布」

未实施原因:无法确定还有多少类似的顺序依赖场景需要处理,风险不可控。

相关协议

  • s2c_sync_game_features - 游戏功能同步推送
  • c2s_consume_purchase - 消费购买请求/响应

参考资料

  • 飞书记录:https://ghoststudio.feishu.cn/wiki/ZJAHwjrhhintMDkCrWCc41dGngg

Released under the MIT License.