文档:
Open MatchDocumentation | Open Match (open-match.dev)
代码:
googleforgames/open-match:Flexible, extensible, and scalable video game matchmaking. (github.com)
指导
概念
- Ticket
配对实体,代表参与匹配的玩家。
- Assignment
游戏服务器到Ticket的映射,可以是分配的游戏服地址,也可以是虚拟竞赛ID。
- Match
配对后Ticket的集合以及一些元素据。
定制组件
- Match Function(MMF)
核心匹配逻辑,需要开发者根据需求定制,并作为服务公开给OpenMatch。OpenMatch调用它来生成Match列表。它以Ticket列表为输入,并返回任意数量的Match。
- Director
向OpenMatch请求生成Match,然后生成Assignment并向OpenMatch请求绑定到Match。
- Game Frontend
为玩家向OpenMatch请求生成Ticket,并帮其申请匹配。
匹配序列图
Game Frontend
- 创建票据并向OpenMatch申请匹配
- 等待分配Assignment
Director
- 请求OpenMatch从指定池的Ticket生成Match
- 为返回的Match中的Ticket指定Assignment
服务架构
核心服务
- Frontend
提供接口供Game Frontend调用,用来创建、删除Ticket等,Ticket绑定Assignment后返回给Game Frontend.
- Backend
提供接口供Director调用,用来创建Matches,绑定Assignment到Match的所有Ticket,绑定成功后Fronent即可返回。
- Query
允许从Ticket池中查询符合条件的Ticket(当前可参与匹配的Ticket)
定制组件
- Match Function(MMF)
核心匹配逻辑,需要开发者根据需求定制,并作为服务公开给OpenMatch。OpenMatch调用它来生成Match列表。它以Ticket列表为输入,并返回任意数量的Match。
- Evaluator
允许OpenMatch并发执行匹配,并保证不会有重叠的Ticket出现在生成的Match中。
去重
因为匹配请求池中的Ticket可能重叠,且需要并发执行匹配函数,所以我们需要对结果进行去重,以此来保证结果不会出现Ticket在不同Match中。
Evaluator
为了允许使用重叠的票证生成提案,但仍为Director提供唯一性的匹配,我们需要解决提案的冲突。为了实现这一点,Open Match有一个Evaluator组件,它接受所有并发的匹配提案,评估它们是否存在冲突,并将不重叠的结果返回给Open Match。如果存在多个重叠匹配,Evaluator将评估它们的质量,提升最高质量的匹配为结果,并丢弃其他匹配。Evaluator的主要职责是确保返回的结果匹配中没有重叠的票证。
Synchronizer(单点)
多个并发执行的MatchFunction为了MatchProfile同时从Open Match获取票证。因此,多个MatchFunction可以看到相同的活动票证池(导致冲突)。虽然Evaluator处理消除重叠结果的冲突,但存在竞争条件。当Evaluator评估匹配提案时,如果允许执行MatchFunction,则MatchFunction可能会获取已升级为结果的票证。因此,在评估现有结果时,需要停止执行MatchFunction。这叫做同步。
Synchronzier的关键作用是保证并发MatchFunction生成的提案一起评估。此外Synchronzier需要在评估结果时停止执行MatchFunction。Open Match无法控制MatchFunction的执行时间,但是必须确保其结果与其它并行执行的MatchFunction结果一起评估,如果错过了评估时间将被丢弃。Open Match的Synchronizer为单点组件,且具有以下状态:
- Idle State
当没有正在执行的匹配功能时,同步器处于Idle State。
- Registration
Backend为每个FetchMatch请求调用MatchFunction之前向Synchronzier注册,Synchronzier在首次FetchMatch注册时进入Registration窗口(窗口时间可配置),在此窗口期注册的所有MatchFunction将一起评估。
- ProposalCollection
Registration窗口结束后,Synchronizer会提供一段时间来供注册函数返回,这称为ProposalCollection窗口。这样,即使是最后一次注册的FetchMatch请求也有机会在评估之前生成提案。
- Evaluation
在此期间,所有注册的MatchFunction生成的所有提案都将发送给Evaluator进行评估。同步主要通过两种行为实现:
- 尝试在ProposalCollection或Evaluation窗口注册的任何新MatchFunction都将被阻止,直到评估完成并再次打开注册。
- 在ProposalCollection窗口后返回的来自MatchFunction执行的提案被丢弃(错过了评估窗口)。
代码流程序列图
说明:
- 发起点总共有两个:Game Frontend和Director,Game Frontend用于玩家请求参与匹配,Director用于促发生成匹配结果
- GetAssignment只有在UpdateAssignments后才能返回