使用领域驱动设计实现go版本通用化匹配服务

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对局服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值