一、node.js能做啥
http://www.infoq.com/cn/articles/what-is-nodejs
二、雜項問題
1. http的長連接是不是也是只能req/rep模式,能實現服務器端push嗎?
http的長連接即HTTP keep-alive(HTTP1.1里加入),這個原生的只是為了更少的建立和關閉tcp鏈接,可以減少網絡流量;因為已建立的tcp握手,減少后續請求的延時等。這個http長連接不支持全雙工通信。
http實現“服務器推”的技術,一是借助客戶端Flash XMLSocket或者Java Applet套接口來實現;另一種是comet技術。(還有一種遭罪的客戶端以一定間隔向服務器發出請求的輪詢就不提了)
comet有兩種:
(1)基于AJAX的長輪詢(long-polling技術)
(2)基于 Iframe 及 htmlfile 的流(streaming)方式
這兩種方式看描述已經離手游服務器差遠了,就不去招惹它們了吧。
2. 大規模網站的架構?怎么做到水平擴展的?
網站的需求跟游戲不一樣,網站都是http就夠了,req/rep即可,沒有交互等廣播同步之類的復雜狀態。
(pomelo里表示游戲的業務模型很難做到傳統網站那種無限水平擴展)
3. websocekt是什么?
html5開始提供的,為了使瀏覽器和服務器間進行全雙工通訊的長鏈接協議。websocket協議本質上是一個基于TCP的長連接協議。與傳統C/S長連接的區別在于,websocket鏈接開始時的握手協議,客戶端首先要向服務器發起一個HTTP騎牛,這個請求和通常的HTTP請求不同,包含了一個附加信息"Upgrade:WebSocket"表明申請協議升級,服務器回應后,即握手完成,websocket鏈接建立起來,雙方自由通信,直到一方關閉鏈接。
websocket相對于http的優點,除了全雙工通訊,還有服務器與客戶端交換的header信息很小。
websocket與傳統socket的區別,前者有幀協議,不需要上層做拼包了。
4. redis可以直接搞集群嗎?
數據量太大時,redis的持久化會影響性能,解決方案時用個slave專職做持久化。另外redis容災和傳統web應用的減壓,就開多個slave,用于分擔讀的壓力。
當庫到一定數量時,可以用分庫分表來水平擴展。
5. node.js能用c++擴展嗎?
v8和node都是c++寫的。
三、網易pomelo能干些啥
分布式服務器,方便擴展。另外實現了很多游戲常用模塊,如aoi等。
四、公司的node.js框架有哪些不能做的
1. websocket實現了嗎?
實現中。
2. 方便分布式擴展嗎?
貌似沒有pomelo那么方便。
五、總結
node.js做手游服務器的開發還是挺方便的,pomelo已經做很多事情……
N、參考
1. Comet:基于 HTTP 長連接的“服務器推”技術:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
2. WebSocket:http://zh.wikipedia.org/wiki/WebSocket
3. 使用 HTML5 WebSocket 構建實時 Web 應用:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/
4. pomelo:https://github.com/NetEase/pomelo
5. HTTP長連接:http://www.blogjava.net/xjacker/articles/334709.html
6. Redis復制與可擴展集群搭建:http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster