Node.js 手游服务器调研
Node.js能做啥
1 | http://www.infoq.com/cn/articles/what-is-nodejs |
杂项问题
HTTP 的长连接是不是也是只能 Req/Rep 模式,能实现服务器端 push 吗?
HTTP 的长连接即 HTTP keep-alive(HTTP1.1里加入),这个原生的只是为了更少的建立和关闭 TCP 链接,可以减少网络流量;因为已建立的 TCP 握手,减少后续请求的延时等。这个 HTTP 长连接不支持全双工通信。
HTTP 实现“服务器推”的技术,一是借助客户端 Flash XMLSocket 或者 Java Applet 套接口来实现;另一种是 Comet 技术。(还有一种遭罪的客户端以一定间隔向服务器发出请求的轮询就不提了)
Comet 有两种:
- 基于 AJAX 的长轮询(long-polling技术)
- 基于 Iframe 及 htmlfile 的流(streaming)方式
这两种方式看描述已经离手游服务器差远了,就不去招惹它们了吧。
大规模网站的架构?怎么做到水平扩展的?
网站的需求跟游戏不一样,网站都是 HTTP 就够了,Req/Rep 即可,没有交互等广播同步之类的复杂状态。
网易 Pomelo 里表示游戏的业务模型很难做到传统网站那种无限水平扩展。
WebSocket 是什么?
HTML5 开始提供的,为了使浏览器和服务器间进行全双工通讯的长链接协议。WebSocket 协议本质上是一个基于 TCP 的长连接协议。与传统 C/S 长连接的区别在于,WebSocket 链接开始时的握手协议,客户端首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一个附加信息 Upgrade:WebSocket
表明申请协议升级,服务器回应后,即握手完成, WebSocket 链接建立起来,双方自由通信,直到一方关闭链接。
WebSocket 相对于 HTTP 的优点,除了全双工通讯,还有服务器与客户端交换的 header 信息很小。
WebSocket 与传统 socket 的区别,前者有帧协议,不需要上层做拼包了。
Redis 可以直接搞集群吗?
数据量太大时,Redis 的持久化会影响性能,解决方案时用个 slave 专职做持久化。另外 Redis 容灾和传统 Web 应用的减压,就开多个 slave,用于分担读的压力。
当库到一定数量时,可以用分库分表来水平扩展。
Node.js 能用 C++扩展吗?
Chrome V8 和 Node.js 都是 C++ 写的。
网易 Pomelo 能干些啥
分布式服务器,方便扩展。另外实现了很多游戏常用模块,如 AOI 等。
公司的 Node.js 框架有哪些不能做的
- WebSocket 实现了吗?
实现中。
- 方便分布式扩展吗?
貌似没有 Pomelo 那么方便。
总结
Node.js 做手游服务器的开发还是挺方便的,Pomelo 已经做很多事情……
参考
- Comet:基于 HTTP 长连接的“服务器推”技术:
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
- WebSocket:
http://zh.wikipedia.org/wiki/WebSocket
- 使用 HTML5 WebSocket 构建实时 Web 应用:
http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/
- Pomelo:
https://github.com/NetEase/pomelo
- HTTP 长连接:
http://www.blogjava.net/xjacker/articles/334709.html
- Redis 复制与可扩展集群搭建:
http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster