DockerCompose 启动 open-match

背景介绍

open-match是Google和unity联合开源的支持实时多人匹配的框架,已有多家游戏厂商在生产环境使用,官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力,但是UOS目前不支持自建的Dedicated servers 集群,只能上传镜像,UOS会自动完成分配以及创建,灵活性就不是那么高了,按照open-match的官方教程,需要有k8s的环境。但是小公司就是不想要k8s,我就想单机部署,可以使用docker-compose。open-match本身的镜像build 提供了dockerfile文件。把项目clone到本地,然后在 tm中以此使用以下命令构建对用的image

tip:该方案只是启动了 core 部分要求的组件即

搭建步骤

Install with YAML | Open Match

后面的部分,需要自行探索了,现在也在学习中,欢迎交流讨论

先构建一个中间镜像base builder,然后一次构建对应的component即可,需要修改Dockerfile.cmd中的

FROM open-match-base-build as builder

为,目的是指定使用本地的version版本,否则会远程拉取镜像,网络问题会导致不成功,需要开梯子

FROM open-match-base-build:latest as builder
docker build -f .\Dockerfile.base-build -t open-match-base-build . 
docker build --build-arg IMAGE_TITLE=synchronizer -f .\Dockerfile.cmd -t open-match-synchronizer .

接着使用docker-compose.yaml 来控制启动过程,内如如下

version: '3'
services:open-match-backend:image: open-match-backend:latestcontainer_name: open-match-backendvolumes:- ./matchmaker_config_default.yaml:/app/matchmaker_config_default.yaml- ./matchmaker_config_override.yaml:/app/matchmaker_config_override.yamlports:- "50505:50505"  # gRPC- "51505:51505"  # HTTPenvironment:API_BACKEND_HOSTNAME: "open-match-backend"API_BACKEND_GRPC_PORT: "50505"API_BACKEND_HTTP_PORT: "51505"REDIS_HOSTNAME: "open-match-redis"REDIS_PORT: "6379"depends_on:- redisopen-match-frontend:image: open-match-frontend:latestcontainer_name: open-match-frontendports:- "50504:50504"  # gRPC- "51504:51504"  # HTTPvolumes:- ./matchmaker_config_default.yaml:/app/matchmaker_config_default.yaml- ./matchmaker_config_override.yaml:/app/matchmaker_config_override.yamlenvironment:API_FRONTEND_HOSTNAME: "open-match-frontend"API_FRONTEND_GRPC_PORT: "50504"API_FRONTEND_HTTP_PORT: "51504"REDIS_HOSTNAME: "open-match-redis"REDIS_PORT: "6379"depends_on:- redisopen-match-query:image: open-match-query:latestcontainer_name: open-match-queryports:- "50503:50503"  # gRPC- "51503:51503"  # HTTPenvironment:API_QUERY_HOSTNAME: "open-match-query"API_QUERY_GRPC_PORT: "50503"API_QUERY_HTTP_PORT: "51503"REDIS_HOSTNAME: "open-match-redis"REDIS_PORT: "6379"volumes:- ./matchmaker_config_default.yaml:/app/matchmaker_config_default.yaml- ./matchmaker_config_override.yaml:/app/matchmaker_config_override.yamldepends_on:- redisopen-match-synchronizer:image: open-match-synchronizer:latestcontainer_name: open-match-synchronizervolumes:- ./matchmaker_config_default.yaml:/app/matchmaker_config_default.yaml- ./matchmaker_config_override.yaml:/app/matchmaker_config_override.yamlports:- "50506:50506"  # gRPC- "51506:51506"  # HTTPenvironment:API_SYNCHRONIZER_HOSTNAME: "open-match-synchronizer"API_SYNCHRONIZER_GRPC_PORT: "50506"API_SYNCHRONIZER_HTTP_PORT: "51506"REDIS_HOSTNAME: "open-match-redis"REDIS_PORT: "6379"depends_on:- redisopen-match-swaggerui:image: open-match-swaggerui:latestcontainer_name: open-match-swaggeruiports:- "51500:51500"  # HTTP for Swagger UIvolumes:- ./matchmaker_config_default.yaml:/app/matchmaker_config_default.yaml- ./matchmaker_config_override.yaml:/app/matchmaker_config_override.yamlenvironment:API_SWAGGERUI_HOSTNAME: "open-match-swaggerui"API_SWAGGERUI_HTTP_PORT: "51500"depends_on:- open-match-backend- open-match-frontend- open-match-query- open-match-synchronizerredis:image: redis:alpinecontainer_name: open-match-redisports:- "6379:6379"volumes:- redis-data:/datavolumes:redis-data:

matchmaker_config_default.yaml 的内容和 matchmaker_config_override.yaml的内容是一致的,目的就是override可以覆盖default中的值(猜的),这部分内容从k8s的yaml文件中copy过来,内容如下
 

logging:level: debugformat: textrpc: false
# Open Match applies the exponential backoff strategy for its retryable gRPC calls.
# The settings below are the default backoff configuration used in Open Match.
# See https://github.com/cenkalti/backoff/blob/v3/exponential.go for detailed explanations
backoff:# The initial retry interval (in milliseconds)initialInterval: 100ms# maxInterval caps the maximum time elapsed for a retry intervalmaxInterval: 500ms# The next retry interval is multiplied by this multipliermultiplier: 1.5# Randomize the retry intervalrandFactor: 0.5# maxElapsedTime caps the retry time (in milliseconds)maxElapsedTime: 3000msapi:backend:hostname: "open-match-backend"grpcport: "50505"httpport: "51505"frontend:hostname: "open-match-frontend"grpcport: "50504"httpport: "51504"query:hostname: "open-match-query"grpcport: "50503"httpport: "51503"synchronizer:hostname: "open-match-synchronizer"grpcport: "50506"httpport: "51506"swaggerui:hostname: "open-match-swaggerui"httpport: "51500"# Configurations for api.test and api.scale are used for testing.test:hostname: "open-match-test"grpcport: "50509"httpport: "51509"scale:httpport: "51509"redis:# Open Match's default Redis setupshostname: open-match-redis# source value: open-match-core.redis.port = 6379port: 6379usePassword: falsepasswordPath: /redis-passwordpool:maxIdle: 200maxActive: 0idleTimeout: 0healthCheckTimeout: 300mstelemetry:reportingPeriod: "1m"traceSamplingFraction: "0.01"zpages:enable: "true"prometheus:enable: "false"endpoint: "/metrics"serviceDiscovery: "true"stackdriverMetrics:enable: "false"gcpProjectId: "replace_with_your_project_id"prefix: "open_match"

然后就可以启动了

运行demo

如果要运行open-match的 demo-first-match,还要一个组件

evaluator

该组件的目的是对所有的matches进行评估,并返回得分,open-match会保留评分最高的组合,比如我们以 战力相差的相近为评估规则,假定 abc,三个玩家的战力分值分配时 10 20 25,则abc三人同时匹配在1v1的条件选,应当尽可能的选择20 25这个相近的评分,评分组件evaluator这个需要开始自行实行,通过synchronizer进行调用,open-match 提供了一个default实现 即default-evaluator,使用以下命令进行构建即可

docker build --build-arg IMAGE_TITLE=default-evaluator -f .\Dockerfile.cmd -t open-match-default-evaluator .

如果开发环境存在需要平凡需求的情况,直接ide环境启动即可,但是需要在 matchmaker_config_default.yaml中指明 evaluator的位置信息

api:evaluator:hostname: "open-match-default-evaluator"httpport: "5499"grpcport: "5498"

接着需要修改几个demo的hostname地址,一个是frontend的hostname,位置在

open-match/examples/demo/components/clients/clients.go:84

//修改前
conn, err := grpc.Dial("open-match-frontend.open-match.svc.cluster.local:50504", grpc.WithInsecure())//修改后
conn, err := grpc.Dial("localhost:50504", grpc.WithInsecure())

另外一个是 backend的hostname

open-match/examples/demo/components/director/director.go:71

//修改前
conn, err := grpc.Dial("open-match-backend.open-match.svc.cluster.local:50505", grpc.WithInsecure())//修改后
conn, err := grpc.Dial("localhost:50505", grpc.WithInsecure())

然后还需要部署一个组件mmf,负责判断给定的组合是否符合要求,可以直接启动 cmd/scale-mmf,或者build镜像,一样的需要修改query的hostname,位置信息如下

open-match/examples/scale/mmf/mmf.go:42

//修改前
conn, err := grpc.Dial("open-match-query.open-match.svc.cluster.local:50503", utilTesting.NewGRPCDialOptions(logger)...)//修改后
conn, err := grpc.Dial("localhost:50503", utilTesting.NewGRPCDialOptions(logger)...)

mmf的服务地址,是由director在fetchMatches指定的,相关的代码位置在

open-match/examples/demo/components/director/director.go:82

不同版本可能会有所变化,当前提及的代码内容来源于open-match的最新master代码,2024年10月9日 

req := &pb.FetchMatchesRequest{Config: &pb.FunctionConfig{Host: "om-function.open-match-demo.svc.cluster.local",Port: 50502,Type: pb.FunctionConfig_GRPC,},Profile: &pb.MatchProfile{Name: "1v1",Pools: []*pb.Pool{{Name: "Everyone",},},},}

所以我们需要改掉这里Host所指定的值,修改为mmf的实际地址即可,最后更新docker-compose.yaml并执行 docker-compose -f docker-compose.yaml up,在cmd/demo-first-match/main.go 文件中运行main函数即可成功运行demo程序

demo程序的执行成功后会返回一个虚拟的链接地址,该链接地址由director组件返回,可以理解为在director中返回具体的dedicated server的ip地址,demo中是随机产生的代码位置在

examples/demo/components/director/director.go:132 

如果不正确可以搜索2222作为线索定位

	for _, match := range matches {ids := []string{}for _, t := range match.Tickets {ids = append(ids, t.Id)}req := &pb.AssignTicketsRequest{Assignments: []*pb.AssignmentGroup{{TicketIds: ids,Assignment: &pb.Assignment{Connection: fmt.Sprintf("%d.%d.%d.%d:2222", rand.Intn(256), rand.Intn(256), rand.Intn(256), rand.Intn(256)),},},},}resp, err := be.AssignTickets(ds.Ctx, req)if err != nil {panic(err)}_ = resp}

匹配成功后返回的链接地址

open-match对mmf,evaluator,director 提供了多种游戏场景的默认实现,可以在亦有模板的基础上结合业务进行开发,具体内容可以查看examples/scale/README.md

感觉联机几千人同时在线这种方式应该够够吧,先这样,散会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559040.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ai论文写作软件哪个好?分享5款ai论文题目生成器

在当前的学术研究和写作领域,AI论文写作软件已经成为提高效率和质量的重要工具。根据多个来源的评测和推荐,以下是五款值得推荐的AI论文写作软件,其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数, 而每个函数又是一组语句。 C 有好几种语句,例如:声明语句创建变量, 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…

HCIA——one

推荐电影:《模仿游戏》《黑客帝国》《头号玩家》 图灵机每秒五千次计算,当今计算机4080ti算力每秒21万亿次的计算。 OSI七层模型 应用层:人机交互,将抽象语言转换成编码 表示层:将编码转换成二进制 介质访问控制层…

Chatgpt 原理解构

一、背景知识 1. 自然语言处理的发展历程 自然语言处理在不同时期呈现出不同的特点和发展态势。萌芽期,艾伦・图灵在 1936 年提出 “图灵机” 概念,为计算机诞生奠定基础,1950 年他提出著名的 “图灵测试”,预见了计算机处理自然…

国内经典多模态大模型工作1——Qwen-VL系列(Qwen-VL、Qwen2-VL解读)

Qwen-VL 论文标题:《Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond》 论文链接:https://arxiv.org/pdf/2308.12966.pdf 项目:https://github.com/QwenLM/Qwen-VL/tree/master 模…

DAMA数据管理知识体系(第13章 数据质量)

课本内容 13.1 引言 语境图 图13-1 语境关系图:数据质量业务驱动因素 1)提高组织数据价值和数据利用的机会。2)降低低质量数据导致的风险和成本。3)提高组织效率和生产力。4)保护和提高组织的声誉。 提机会、降成本、增…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式,它利用三维建模和虚拟现实技术,将汽车以更真实、更立体的形式呈现在消费者面前。 一、3D看车的实现方式 1、三维建模: 通过三维建模技术,按照1:1的比例还原汽车外观,包括车身线条、细…

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这…

大数据新视界 --大数据大厂之 GraphQL 在大数据查询中的创新应用:优化数据获取效率

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

《Programming from the Ground Up》阅读笔记:p181-p216

《Programming from the Ground Up》学习第10天,p181-p216总结,总计34页。 一、技术总结 第10章主要讲计算机是如何计算的,如十进制、二进制、八进制、十六进制以及浮点数和负数的表示。属于比较基础的内容,如果有一定基础&…

(Linux和数据库)1.Linux操作系统和常用命令

了解Linux操作系统介绍 除了办公和玩游戏之外不用Linux,其他地方都要使用Linux(it相关) iOS的本质是unix(unix是付费版本的操作系统) unix和Linux之间很相似 Linux文件系统和目录 bin目录--放工具使用的 操作Linux远程…

2023 CCPC哈尔滨 报告

比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数:3 题 三题都是队友写的。所以来补一下 B L J。 B题: B. Memory Little G used to be a participant …

计算机毕业设计 内蒙古旅游景点数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Http 协议和 RPC 协议有什么区别?

Http 协议和 RPC 协议有什么区别? 三个层面来述说: 从功能特性来说: HTTP是一个属于应用层的超文本传输协议,是万维网数据通信的基础,主要服务在网页端和服务端的数据传输上。 RPC是一个远程过程调用协议&#xff0…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求,需要在电脑上安装Unity3D并配置VisualStudio,所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网,下载Unity Hub,它可以帮助我们管理我们的Unity项目和版本&#…

c++11~c++20 thread_local

线程局部存储是指对象内存在线程开始后分配,线程结束时回收且每个线程有该对象自己的实例,简单地说,线程局部存储的对象都是独立各个线程的。实际上这并不是一个新鲜个概念,虽然C一直没因在语言层面支持它,但是很早之前…

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优 在进行压力测试时,遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…

【斯坦福CS144】Lab4

一、实验目的 完成一个网络接口实现。 二、实验内容 完成一个网络接口实现,其大部分工作是:为每个下一跳IP地址查找(和缓存)以太网地址。而这种协议被称为地址解析协议ARP。 三、实验过程 在minnow目录下输入git merge origin/check4-startercode获…

DAMA数据管理知识体系(第15章 数据管理成熟度评估)

课本内容 15.1 引言 概要 能力成熟度评估(Capability Maturity Assessment,CMA)是一种基于能力成熟度模型(Capability Maturity Model,CMM)框架的能力提升方案,描述了数据管理能力初始状态发展到…

简易登录注册;测试类;postman测试;

项目是如何创建的,最简易的登陆注册功能是怎么实现的,数据库不能明文存放密码,密码经过了怎么样的处理存入数据库 前端使用nodejs18 后端项目需要等待maven加载完相关依赖,后端使用java17 1后端 1.1 创建项目所需要的数据库 内…