`
fsplove520
  • 浏览: 27994 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多进程的游戏服务器设计

 
阅读更多
   目前,我们的游戏逻辑服务器大多是采用多线程单进程的方式设计的。因为我们的游戏是手游,或者页游,在指标要求上,这种架构基本能满足我们的要求,而不需要非得去设计一个很复杂的架构。

  最近稍微空闲点下来了,于是乎思考一个问题,如果设计一个复杂些的游戏服务器组去适应要求更高的游戏呢,经过多番网上和同事们的讨论和看技术大牛们的博客,总结和完善了如下设计方案:

游戏服务器组是按多进程的方式设计
  强调多进程,是想提另外一点,我们每个进程上是单线程的。所以,我们在设计中,系统的复杂点在于进程间如何交换数据;而不需要考虑线程间的数据锁问题。

   如果肆意的做进程间通讯,在进程数量不断增加后,会使系统混乱不可控。经过分析后,我决定做如下的限制:

   如果一个进程需要和多个服务器做双向通讯,那么这个进程不能处理复杂的逻辑,而只是过滤和转发数据用。即,这样的一个进程 S ,只会把进程 A 发过来的数据转发到 B ;或把进程 B 发过来的数据转发到 A 。或者从一端发过来的数据,经过简单的协议分析后,可以分发到不同的地方。例如,把客户端发过来的数据包中的聊天信息分离处理,交到聊天进程处理。

   有逻辑处理的进程上的数据流一定是单向的,它可以从多个数据源读取数据,但是处理后一定反馈到另外的地方,而不需要和数据源做逻辑上的交互。

每个进程尽可能的保持单个输入点,或是单个输出点。

所有费时的操作均发到独立的进程,以队列方式处理。

按功能和场景划分进程,单一服务和单一场景中不再分离出多个进程做负载均衡。

性能问题上,我是这样考虑的:

我们应该充分利用多核的优势,这会是日后的发展方向。让每个进程要么处理大流量小计算量的工作;要么处理小流量大计算量的工作。这样多个进程放在一台物理机器上可以更加充分的利用机器的资源。

单线程多进程的设计,个人认为更能发挥多核的优势。这是因为没有了锁,每个线程都可以以最大吞吐量工作。增加的负担只是进程间的数据复制,在网游这种复杂逻辑的系统中,一般不会比逻辑计算更早成为瓶颈。如果担心,单线程没有利用多核计算的优势,不妨考虑以下的例子:

计算 a/b+c/d+e/f ,如果我们在一个进程中开三条线程利用三个核同时计算 a/b c/d e/f 固然不错,但它增加了程序设计的复杂度。而换个思路,做成三个进程,第一个只算 a/b 把结果交给第二个进程去算 c/d 于之的和,再交个第三个进程算 e/f 。对于单次运算来算,虽然成本增加了。它需要做额外的进程间通讯复制中间结果。但,如果我们有大量连续的这样的计算要做,整体的吞吐量却增加了。因为在算某次的 a/b 的时候,前一次的 c/d 可能在另一个核中并行计算着。

具体的设计中,我们只需要把处理数据包的任务切细,适当增加处理流水线的长度,就可以提高整个系统的吞吐量了。由于逻辑操作是单线程的,所以另需要注意的一点是,所有费时的操作都应该转发到独立的进程中异步完成。比如下面会提到的数据存取服务。

对于具体的场景管理是这样做的:

玩家连接进来后,所有数据包会经过一个叫做位置服务的进程中。这个进程可以区分玩家所在的位置,然后把玩家数据分发到对应的场景服务进程中。这个位置服务同时还管理玩家间消息的广播。即,单个的场景(逻辑)服务并不关心每个数据包为哪几个玩家所见,而由这个服务将其复制分发。

当玩家切换场景,场景服务器将玩家的数据发送给数据服务,数据服务进程 cache 玩家数据,并将数据写入数据库。然后把玩家的新的场景编号发回位置服务进程,这样位置服务器可以将后续的玩家数据包正确的转发到新的场景服务进程中。

掉落物品和资源生产同样可以统一管理,所以的场景(逻辑)进程都将生产新物件的请求发给物品分配服务,由物品分配服务生产出新物件后通知位置服务器产生新物品。

这样一系列的做法,最终保证了,每个场景服务器都有一个唯一的数据源——位置服务进程。它跟持久化在数据库中的数据无关,跟时钟也无关。由此带来的调试便利是很显著的。

最近,面临诸多进程的设计时,最先面临的一个复杂点在于启动阶段。显然,每个进程都配有一套配置文件指出其它进程的地址并不是一个好主意。而为每个服务都分配一个子域名在开发期也不太合适。结果我们采取了一个简单的方案:单独开发了一个名字服务器。它的功能类似 DNS ,但是可以让每个进程自由的注册自己的位置,还可以定期汇报自己的当前状态。这样,我们可以方便的用程序查询到需要的服务。名字服务器的协议用的类似 POP3 的文本协议,这让我们可以人手工 telnet 上去查阅。我相信以后我们的维护人员会喜欢这样的设计的。
分享到:
评论

相关推荐

    多进程的游戏服务器设计.pdf

    ### 多进程游戏服务器设计详解 #### 一、概述 多进程游戏服务器设计是一种常见的架构模式,用于构建高性能、高可靠性的网络游戏后端系统。本文档详细介绍了多进程游戏服务器设计的基本理念、关键技术点以及实际...

    网络游戏服务器设计

    【网络游戏服务器设计】是IT领域中的一个重要话题,特别是在如今互联网技术高速发展的时代,网络游戏服务器的性能和稳定性直接影响到用户体验和游戏运营。本文主要探讨了一种基于EPOLL机制的LINUX网络游戏服务器实现...

    基于java游戏服务器框架,它是高可伸缩、分布式多进程的游戏服务器框架。.zip

    Java游戏服务器框架是一种用于开发高性能、高可伸缩性、分布式多进程的游戏后端系统的技术解决方案。这样的框架设计目标是确保游戏服务器能够处理大量并发玩家,同时提供稳定、低延迟的服务,以支持实时性强的在线...

    网络游戏服务器架构设计

    ### 网络游戏服务器架构设计相关知识点 #### 一、网络游戏服务器架构概述 网络游戏服务器架构是指为了支撑大规模在线游戏的稳定运行所采用的技术体系结构。一个合理的服务器架构不仅可以提高游戏性能,还能确保游戏...

    Python-示范如何让多组游戏服务器运行在同一个skynet进程内

    标题 "Python-示范如何让多组游戏服务器运行在同一个skynet进程内" 指向的是一个关于Python游戏开发的实践教程,特别是涉及到使用Skynet框架来高效地管理多个游戏服务器实例在同一进程中的运行。Skynet是一个轻量级...

    Go-基于golangjsonmongodb的单进程游戏服务器

    总的来说,这个项目展示了如何利用Go语言的并发优势和简洁的JSON-RPC协议设计一个高效的单进程游戏服务器,并利用MongoDB的灵活性存储和管理游戏数据。这样的架构对于初学者理解游戏服务器开发流程,以及对Go语言和...

    百万用户级游戏服务器架构设计.doc

    ### 百万用户级游戏服务器架构设计 #### 一、引言 随着互联网技术的不断发展,网络游戏已经成为人们娱乐生活中不可或缺的一部分。为了满足数以百万计的用户同时在线的需求,游戏服务器的设计面临着前所未有的挑战...

    设计并行化游戏引擎的框架

    在游戏开发领域,游戏引擎是核心...总之,设计并行化游戏引擎框架是一项挑战性的任务,需要对并行计算、多线程编程以及游戏引擎架构有深入理解。通过合理的设计和实现,可以显著提升游戏性能,提供更流畅的游戏体验。

    百万用户级游戏服务器架构设计 .pdf

    百万用户级游戏服务器架构设计 游戏服务器架构设计是游戏开发中最重要的一步,对于游戏服务器的设计和实现直接影响着游戏的性能和可扩展性。本文从最简单的游戏服务器架构开始讲起,结合主流的WOW等大型游戏服务器...

    三层结构的网络游戏服务器设计及其性能分析.pdf

    【总结】三层结构的网络游戏服务器设计通过多路复用和线程池技术优化了服务器的资源利用和处理能力,提高了服务性能,同时也保证了系统的稳定性和移植性。这一设计方法对于处理大规模并发连接的网络游戏服务器具有...

    游戏程序设计教程

    游戏程序设计是一门涵盖众多领域的综合学科,它融合了计算机科学、艺术创意和技术实现等多个方面。本教程“游戏程序设计教程”旨在为学习者提供一个详细而全面的指南,帮助他们掌握游戏开发的核心技能和概念。 首先...

    java版斗地主源码-px:精心设计的多进程游戏服务器

    node作为脚本语言性质,决定了它不适合做高cpu的业务,不同于java之类采用的是单线程,多进程的模式来处理海量请求。每个进程其实和传统web服务器一样都是镜像一般处理相同业务(登录,聊天,战斗,交易等等),这样...

    c++ 游戏服务器框架socket

    C++游戏服务器框架基于Socket的设计是游戏开发中的一个重要环节,它负责处理客户端的连接、通信以及数据包的解析与处理。Socket是网络编程的基础,它提供了进程间通过网络进行通信的能力。下面将详细阐述C++游戏...

    通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、多进程的分布式游戏服务器

    无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、... 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、多进程的分布式游戏服务器

    游戏服务器

    5. **并发处理**:游戏服务器需要处理大量并发请求,这需要采用多线程、多进程或事件驱动(如Reactor和Proactor模式)等并发模型。对于高并发场景,还可以使用线程池来管理线程资源,避免频繁创建和销毁线程带来的...

    多玩家游戏程序设计源代码[Todd+Barron].rar

    9. **游戏引擎**:使用游戏引擎可以加速开发,例如Unity、Unreal Engine提供了丰富的多玩家支持和工具。 10. **用户界面和网络UI**:良好的用户界面和网络状态显示有助于提升用户体验,例如连接状态、好友系统和...

    数字游戏场景设计

    Unity、Unreal Engine等游戏引擎则提供了实时渲染和交互功能,让设计师能实时预览并调整场景效果。此外,Photoshop等图像处理软件用于贴图和纹理制作,Substance Painter则擅长于材质和破坏效果的模拟。 在环境构建...

    Game Engine Architecture(游戏引擎架构).PDF

    《Game Engine Architecture》是一本关于3D游戏引擎设计的专业书籍,由资深游戏开发者Jason Gregory撰写。本书深入浅出地介绍了游戏引擎的设计原理与架构模式,为读者提供了一个系统性的视角来理解现代3D游戏引擎的...

Global site tag (gtag.js) - Google Analytics