Archives

帖子来自 smarttony RSS

smarttony

游戏服务器的架构设计

作者: smarttony (2 篇文章) 日期: 十二月 16, 2011 在 10:39 上午
评论 (0)

  游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。 负载均衡是一个很复杂的课题,这里暂不谈bigworld和atlas的这类服务器的设计,更多的是基于功能和场景划分服务器结构。 首先说一下思路,服务器划分基于以下原则: 1:分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器 2:在同一服务器架构下的不同游戏,应尽可能的复用某些服务器(进程级别的复用) 3:以多线程并发的编程方式适应多核处理器。 4:宁可在服务器之间多复制数据,也要保持清晰的数据流向 5:主要按照场景划分进程,若需按功能划分,必须保持整个逻辑足够的简单,并满足以上1,2点 服务器结构图: 各个服务器的简要说明: Gateway:应用网关,主要用于保持和client的连接,该服务器需要2种IO,对client采用高并发连接,低吞吐量的网络模型,如IOCP等,对服务器采用高吞吐量连接,如阻塞或异步IO。 网关主要有以下用途: 1:分担了网络IO资源 2:同时,也分担了网络消息包的加解密,压缩解压等cpu密集的操作。 3:隔离了client和内部服务器组,对client来说,它只需要知道网关的相关信息即可(ip和port)。 4:client由于一直和网关保持常连接,所以切换场景服务器等操作对client来说是透明的。 5:维护玩家登录状态 World Server 是一个控制中心,它负责把各种计算资源分布到各个服务器 它具有以下职责: 1:管理和维护多个Scene Server 2:管理和维护多个功能服务器,主要是同步数据到功能服务器 3:复杂转发其他服务器和Gateway之间的数据 4:实现其他需要跨场景的功能,如组队,聊天,帮派等 Phys Server 主要用于玩家移动,碰撞等检测 所有玩家的移动类操作都在该服务器上做检查,所以该服务器本身具备所有地图的地形等相关信息。具体检查过程是这样的:首先,Worldserver收到一个移动信息,WorldServer收到后向Phys Server请求检查,Phys Server检查成功后再返回给world Server,然后world server传递给相应的Scene ...

继续 ›

分类: 博客征文专栏, 服务器, 游戏

架构设计之性能设计经验

作者: smarttony (2 篇文章) 日期: 九月 15, 2010 在 3:42 下午
评论 (1)

性能(performance)设计非常重要,对于服务器端实时交易系统来说系统性能的重要性不言而喻,对客户端软件来说性能好的软件也会获得良好的用户体验,从而给用户留下高质量软件的良好印象。因此在进行架构设计中性能设计非常重要。 但架构设计实际是一个平衡设计,在可用性、可扩展性、可维护性、可靠性、高性能等之间做个妥协选择。这些非功能性的需求再加上复杂的功能性需求,同时还要考虑到项目管理上tight schedule, low cost, perfect effect的三角难题约束,有时需求还不是很明确,vision不是很清楚,这种情况下系统架构设计真是一门艺术。 单就性能设计来说,在架构设计初期就一定要把系统性能考虑在内,否则等开发完成以后测试发现性能不好就比较难办,通常要花费较长的时间来诊断性能瓶颈,找到提升的办法,甚至要改变架构,伤筋动骨,往往造成项目延期。所以性能设计首先要有明确的性能目标,根据用户和软件本身的性能要求来设计,合适的就是最好的。其次,要有适当的度量标准和量化的性能指标。最后,要有相应的设计策略,具体的测试方法。 根据我的经验,影响系统性能主要瓶颈在I/O,包括数据库,socket,网络通信,文件等,例如频繁查询数据库并返回大量结果集,频繁操作大文件等,这些昂贵的操作会占用大量的CPU时间。拿系统响应和服务一个事务来说,有几个Round trip,要通过哪几层I/O,如何合理的分配这些I/O的调用,降低不必要的I/O,都是进行系统性能设计要考虑的。而有些性能问题在初期并不会表现出来,但当拿到实际上线环境下,存在多用户并发、大数据量的情况下就会暴露出严重的问题。所以性能设计时一定要考虑到I/O,同步,并发,资源争用,以及大数据量等因素。通常,I/O操作、网络响应、差的算法、数据库、以及其他的低效的资源使用都会导致低劣的性能。 具体可用的设计策略有: - 缓存以及缓存层(caching layer) 在数据层和应用层之间增加数据缓存层,提供全局数据服务。可以大大减少数据库往返次数。与读取数据库和读取大文件(如XML文件)比,读取内存的速度无疑要快的多。所以对经常要访问的数据进行缓存是非常好的实践方法。因为现在系统往往内存很大,可以充分利用大内存,而共享内存更能实现数据并发访问。 - 多线程(multi-threading) 现在基本上大部分软件实现多线程或多进程,多线程对单CPU系统还只是顺序利用CPU时间和改善用户体验,多CPU系统才是真正的并行。要注意的是多线程不要争抢访问同一资源而导致部分串行操作,要做到真正的并行操作多线程并不容易。另外,在多线程间同步一个庞大的资源,过多创建线程又没有实现线程池也会导致系统性能下降。 - ...

继续 ›

分类: 其他, 博客征文专栏