Bug:家族任务漏加积分
背景
立项项目《家族玩法重塑》。
家族任务需要通过 EVT 来实现,例如 “玩家与族友组队参赛并获得前 8 名”、“玩家与族友组队参赛并获得2000金币”。
为实现上述目标,EVT 所需信息分别来自组委会和比赛,考虑到组委会和比赛的研发量和后期拓展能力,以上逻辑在 EVT 中是通过两个原子事件(见下表)实现的,这两个原子事件分别来自比赛和组委会。
| sid | 描述 | 发送方 | 包含信息 |
|---|---|---|---|
| 10000802 | 开始1场组队模式锦标赛(包含队友ID) | 比赛 | 队友pid |
| 80000000 | 用户从比赛结果颁奖中获得MGW信息 | 组委会 | 各种奖励信息 |
以任务“玩家与族友组队参加比赛并获得前三名”为例,介绍 evt 的实现逻辑:
- 双人组队开始 -> 10000802 -> esp -> 俩人是不是同一个家族 -> 辅助积分 64202696(标识这个用户是双人组队进入的游戏) +1
- 结果颁奖 -> 80000000 -> esp -> 是不是前三名 && 64202696>0 -> 63804212 +1
bug 现象
最近两周有 11 个用户反馈:完成了任务内容,但是任务界面没有显示完成。
bug 原因
用户提前退赛导致的。
用户上一场的结果颁奖(80000000)会晚于下一场的组队开始(10000802)发送给EVT,导致积分处理时序出错。
涉及积分和esp配置
积分列表、esp 配置见白伟的钉钉共享文件《家族业务积分》
共涉及 esp 配置 30 个,积分 30 个。
积分均 “不区分mpid”。
解决方案1:使用比赛唯一标识符
1)详情
用 MatchID(mid)代替 mpid 作为区分比赛的唯一标识符。
mid 针对用户参加的每一场比赛(锦标赛/团赛)都是唯一的,当 辅助积分 使用 mid 代替 mpid 作为 “hasindex” 的参数传入时,每场比赛的 10000802 和 80000000 均能唯一对应。此时,无需考虑因为用户提前退赛导致前后两场比赛原子事件顺序错误的问题。
需确认:任务积分为【日周期】类型,怎样保证周期切换时的任务?
2)修改范围
- 申请 15 个新的辅助积分:
- modeltype 为 cycle(与任务积分保持一致)。保证辅助积分的自动清理。
- 配置 “区分mpid” 。
- 修改所有涉及到的 30 个 esp 配置:
- 修改积分 id 。
- 锦标赛:查改辅助积分时传入的 MPID 改为 mid 。
- 班车赛:查改辅助积分时传入 MPID。
- 需要进行两天的双胞、修改配置(见下一节)
已与比赛确认:
锦标赛:用户参加的每场 mid 都是唯一的。
比赛维护会不会导致 mid 前后不一致的问题?
3)线上影响
生效时刻:上述修改会在 esp 配置 发布外网 的一瞬间生效。
为兼容当前线上数据,分为两个阶段在 esp 中替换积分 id:
-
兼容旧辅助积分:esp 中先查询旧积分,再查新积分,只要有一个积分 > 0,即认为组队参赛。
此阶段跑一天就够了,因为所有的任务积分/辅助积分都是日周期积分。
-
完全上线:esp 中只查新辅助积分,该积分 > 0,即认为组队参赛。
需确认:
是否需要 QA 测试?怎样测试?(我和叶强会先内网进行测试)
解决方案2:使用一个原子事件
此方案无法进行线上数据的切换,不能解决当前 bug。
但强烈建议 以后类似的需求采用此解决方案。
1)详情
新建一个原子事件包含所有的信息(组队信息、奖励信息),由比赛发送给 EVT,处理所有家族任务(15个)。
该原子事件需要包含的信息:
队友的 pid、名次 rank、金币数、大师分、秋卡数、竞技点
2)修改范围
- 比赛:开发一个新的原子事件,在双人组队结束时发送。
- EVT:
- ESP:新建 15 个 esp 配置,由新原子事件触发,esp 逻辑即为老的两条 esp 的逻辑整合。
- NOS:15 个老辅助积分下线。
- 【占位】
3)线上影响
新老 esp 修改同一个目标任务积分,怎样线上数据切换?