全服匹配服实现思路
1. Redis 防止单键
假设有多个 key 参与匹配,比如等级( level )、战力( fightpoint )、段位( grade )
那么可以每类 key 分为 N 个,比如
key_level_1 到 key_level_N
key_fightpoint_1 到 key_fightpoint_N
key_grade_1 到 key_grade_N
要匹配的玩家随机 1 - N , 如 X ,然后插入到 key_level_X 、 key_fightpoint_X 、 key_grade_X
匹配时,乱序 key_xxx_1 到 key_xxx_N ,然后依次得到足够人数停止;或者取遍 N 人数不足
(深入, 匹配服主节点动态维护 N 值)
2. 匹配服无状态多开
按单服实现匹配,然后做改进,解决多开匹配服某个时间匹配数据冲突问题
比如,某个时刻,匹配服 A 与 匹配服 B 都匹配到玩家 C 的匹配数据冲突问题
匹配冲突解决可以直接实现在匹配服上,也可以独立成匹配仲裁服(可多开),思路如下:
-
依次对本次匹配的所有玩家 ID 做 INRC ,对返回值是 1 的,表示匹配到该玩家
-
依次对本次匹配的所有玩家 ID 做 INRC ,对返回值是大于 1 ,则有冲突,该玩家不可匹配
-
最后对这些玩家 ID 键做过期设置,比如随机 5 - 10 秒的某值
冲突率
实作中,应增加统计冲突率,了解多开匹配冲突的概率;以方便合理的作数值