github: GitHub - Languege/flexmatch: Go Language Implementation of Amazon FlexMatch Service
需求
根据提供的对战配置提供可定制化的匹配服务。
- 适用1个团队或者2个团队
- 可多人可组队
- 多v多优先匹配多v多
- 同一玩家不可同时开启多局对局
- 支持匹配超时
- 支持玩家主动接受匹配
- 支持玩家多属性匹配
初步的模型
实体或值对象定义
Session(会话): 玩家连接信息,包含网关、会话ID信息
MatchPlayer(玩家): 进行匹配的玩家信息,包含会话、玩家ID、参与匹配规则的属性信息
MatchmarkingTicket(匹配票据):参与对局匹配的票据,支持多人组队匹配,包含玩家列表、匹配模式信息
TicketQueue(票据队列):顺序处理票据的缓存队列,参与对局匹配的票据首先进入队列,票据状态为队列中,等待票据媒介取出票据处理
TicketMatchmarking:票据媒介,对应一个对战配置,职责如下:
- 从票据队列中取出票据,票据状态改为对局搜索中
- 若存在批前算法,根据提供的排序属性和规则进行批前排序,例如根据战力排序,默认根据票据加入时间升序(无需处理,自然排序)
- 若配置了批量距离规则,则根据提供的划分批次属性和最大距离(和批次的第一个票据的属性对比)划分批次,默认10票据为1个批次票据或5s内获取到的票据为1个批次票据,然后投递到批次票据处理器
BatchTicketProcessor(批次票据处理器): 负载实际的匹配过程,接收票据媒介投递的票据批次,分别遍历每个团结配置,取出批次中的第一个票据,筛选满足规则集的可能票据集,获取能够形成团队的剩余人数组合,遍历每种组合,若可能票据集存在满足组合票据则形成一个潜在的匹配对战,修改票据状态为匹配已被提出,等待玩家的接收
MatchmarkingTeamConfiguration(匹配团队配置):匹配团队定义,包含团队名、团队人数
ArrangementCombinations(排列组合值对象) : 满足某个数量人数的排列组合
Match(匹配): 匹配已形成,若无需用户请求,则直接转为成功状态
GameSessionConnecitonInfo(对局信息): 匹配由潜在状态转为成功状态后,向对局服务器请求分配对局信息,对局信息包含对局服务ID、对局ID(或房间ID)
MatchmarkingRule(匹配规则):定义匹配票据的批次划分、单个批次的排序规则以及票据之间的匹配规则
MatchmakingExpansionRule(匹配规则的属性区间扩张规则):对于票据之间的距离规则的距离数值进行扩展,支持按票据时间增加距离
MatchEvent(匹配事件): 票据或匹配对象每次状态变更都会产生1次匹配事件
流程分析
创建对局配置
开始匹配
取消/停止匹配
注:票据“匹配已被提出”状态前可能的状态有队列中、搜索中,队列中时,当媒介从队列取出票据时,若票据状态已经为已取消了,则将票据添加到延迟删除队列;若搜索中时,票据处于已取消,也将票据添加到延迟删除队列,并将票据从匹配批次中删除;多团队时,若已形成团队,但未形成对局,则解散团队,对剩余的票据重新进行搜索。
接受匹配(可选)
匹配状态轮询
当发生断线重连时,客户端可能未收到匹配事件,需要主动拉取匹配状态,玩家和票据ID的映射关系,交于游戏服务器维护
对局结束(非匹配服务流程)
用户在单排或组队前,用户状态需处于normal状态,用票据ID来维护用户匹配状态,匹配成功后票据包含对局信息,也可用票据维护用户的游戏状态,那么票据何时删除,需要在对局结束时告知匹配服务器对局已结束,然后匹配服务器删除对局包含的票据ID,当然票据可以包含最大TTL来保底,避免对局通知未及时处理或者丢失。
聚合根分析
票据聚合根
媒介聚合根
票据处理器聚合根
对局聚合根
事件队列聚合根
领域服务
FlexMatch匹配服务
FlexMatchGame对局服务