HTML5资讯

当前位置: HTML5技术网 > HTML5资讯 > Node.js实现网游服务器高性能和可扩展

Node.js实现网游服务器高性能和可扩展


       随着Node.js的不断发展与壮大,应用范围也越来越广泛,从传统的企业应用,到互联网使用,再到云计算的发展,它的身影也是随处可见。当然,它的受欢迎程度能在短时间内得到这么快的发展,除却与其本身的事件模型及V8的性能优化等一系列特性有关之外,还和国内外很多互联网公司的攻城师的大量应用和参与到开源项目中有密切关系,如网易的游戏开发,淘宝的数据之美等等。随着HTML5应用和移动互联网平台的指数增长,越来越多的用户使用了移动平台的休闲服务,采用Node.js实现高性能和可扩展性的游戏服务将是一件有意义的工作。
       在互联网上,目前有一些采用Node.js实现的开源游戏服务框架,如 Mozilla的 Browser Quest,Google的 Grits,Chilly等。但是无一例外,这些框架不但与游戏逻辑联系紧密,而且几乎没有可扩展性和性能数据,同时也不提供任何游戏开发的管理工具,除了采用JavaScript编写外,很难体现出采用Node.js实现游戏开发的优越性。
       概念
       通常游戏分为角色扮演类和策略类及混合类等几种游戏类型。那么在网页游戏类型中,根据游戏的类型,开发者可能采用不同的架构实现方式,如策略类游戏可能更偏重于游戏的策略性和逻辑性,也就是考验游戏玩家的各种组合或搭配之类的游戏,对实时性的要求不会很高,在用户的可接受范围之内即可,因此也可以采用常用的Web应用开发模式来实现,而客户端采用轮询或长连接等方式来实现,这些应用模式也有很多的相关经验可以参考,因此能做到具有较好的可扩展性及伸缩性;此外,应用服务器和服务框架等也可以采用现存的技术实现,但是这只能满足对游戏实时性要求不高的场景服务,由于此类的应用方案非常成熟,在下文的讨论中,将不再详述。
       角色扮演类游戏根据策划的要求可以实现各种各样的功能,如聊天,打斗,自动刷怪等各种复杂的功能,但是开发者基本可以把这些功能抽象地划分为二大类,即服务端的网络传输与逻辑运算能力,这样游戏服务的开发和实现会稍微简单些。现在,网络的实时传输基本上是采用Socket服务器来实现的,逻辑运算这个就不需要再述了,因此,游戏服务器就可以粗略的归纳为Socket的服务器综合游戏业务逻辑的实现。
       与Web应用区别
       从上面游戏服务的概念简单介绍中可以得知,实时游戏服务器的开发与传统的Web开发还是具有一些不同点,这些不同点着重体现在以下几个方面:
       大部分的Web应用还是短连接的方式去实现,而游戏的实时性需要采用长连接的方式进行。
       Web应用的场景一般是读多写少的应用,热点数据基本可以缓存;游戏服务的数据经常发生变动,如移动中的路径,打怪掉血等,缓存基本很快就失效,属于写多读少的应用场景。
       广播特性,即Web应用行为上基本只需要用户与服务器交互,其他用户要实现共享他人信息的时候,会采用类似拉的方式如长轮询来实现数据交互,即使在没有数据更新的状态时也需要消耗一定的服务端资源,造成一定的浪费;游戏里面的交互方式需要实时进行,对影响三方的数据,必须采用广播的方法进行消息推送,即推的模式。
       目前的Web应用开发一般采用无状态性的方式来实现,因此可以实现较好的可扩展性,很多Web服务会采用绑定会话或集中会话等方式工作,当后面的某台服务器出现宕机时,服务也可以很快的切换;但是游戏服务器和用户之间的连接是有状态的,在断开时需要进行相关的通知和数据持久化,在重连时需要进行状态恢复等手段来维护游戏世界的运行。
       除以上几点不同之外,还有负载均衡的策略,服务驱动方式,系统判定,系统安全如外挂作弊等相关问题,文章中不再对他们进行对比说明。一般来讲,根据游戏的规模与需求,通常游戏服务器的实现的模式会使用如下的三种架构方式来实现。
       单进程服务架构
     图1 单进程服务架构
       图1是目前互联网上的很多游戏服务器使用的架构,比如商用的SmartFoxServer游戏服务器,开源的有Google的 Grits, Mozilla的 Browser Quest等框架。所有的程序在同一个进程里面运行,架构简单,开发人员上手快,开发和调试非常方便又快速,成本较低,后期的维护成本可能随着游戏项目的大小而不同,但是整体应该不会太高。很明显,游戏的世界是在同一个进程里运行,在单个场景都有不少在线用户的时候,如果采用单进程的 Node.js 实现的话,每个用户的操作可能会有一定的延迟,特别是在大量用户同时做大量操作与AI运算时,如服务端寻路和自动杀怪,延迟会更加严重;同时单进程对计算机资源使用有限。因此只适合游戏的原型制作或小型的游戏开发。另外,由于游戏的状态与复杂性,也无法较好的实现游戏的可扩展性,基本只能通过添加游戏服务器的方式来实现,即所谓的开新服,而这些用户之间是无法在同一个世界里通信会话和交互的。尽管Node.js支持原生的TCP服务,使用简单;但是目前大部分网络应用中,尤其是支持HTML5的应用,socket.io由于性能较好并且使用简单,成为大部分应用采用的网络库来实现高性能websocket服务。在移动互联网应用中,由于协议较复杂与通信数据等问题,需要一定的裁减。下面示例中,就是最简单的单进程服务的原型:
    var socketio = require(‘socket.io’);
    var io = socketio.listen(8080);
    io.sockets.on(‘connection',function(socket){
    socket.on('disconnect',function(){
    //user leave
    });
    socket.on('message',function(msg){
    if (getLoginStatus(socket)) {
    game[data.action].apply(null,[socket,msg]);
    } else {
    game['login'].apply(null,[socket,msg]);
    }
    });
    });

【Node.js实现网游服务器高性能和可扩展】相关文章

1. Node.js实现网游服务器高性能和可扩展

2. Visual Studio 的 Node.js 插件Node.js Tools 1.0发布

3. math.js :用于JavaScript和Node.js的数据扩展库

4. 帮助减少JS请求的node.js工具-DynoSrc

5. 兼顾性能和兼容体验:HTML5时代的浏览器全面测试

6. Kickoff - 创造可扩展的,响应式的网站

7. 打造简易可扩展的jQuery/CSS3 Tab菜单

8. 打造简易可扩展的jQuery/CSS3 Tab菜单

9. 基于 Sass 的强大,可扩展的 CSS 框架

10. io.js 1.5.1 发布,服务器端 JS 引擎

本文来源:https://www.51html5.com/a2916.html

点击展开全部

﹝Node.js实现网游服务器高性能和可扩展﹞相关内容

「Node.js实现网游服务器高性能和可扩展」相关专题

其它栏目

也许您还喜欢