深入浅出NodeJS
恐龙王国事业部 孙政华
特性简介
• single-threaded
• event-driven
• chrome's V8 JavaScript Engine
• non-blocking I/O model
single-threaded
• Apache is multi-threaded
– thread per request(Apache MPM worker)
– process(Apache MPM prefork)
更多的并发连接,带来更多的线程和内存开销
• Nginx & NodeJS is single-threaded
– but event-based(使其不会阻塞)
– but V8 is multi-threaded(worker threads)
没有了创建额外线程/进程的开销
*Apache 2.4正式支持了Event MPM
event-driven
– 单线程不能并行执行代码,但事件驱动和异
步,使其不会阻塞
– libeio:基于事件的完全异步的I/O库,他用多
线程来实现IO访问再回调nodejs主线程。
– libev:全功能、高性能循环事件处理框架,和
libevent很像,但没有libevent的局限性和
bugs。
V8 JavaScript Engine
• V8不是线程安全的,所有的V8操作必须从
单个V8线程中执行,这意味着你不可以从
其他线程创建objects, integers, strings, etc.如
果创建的话,可能会种族灭绝哦(内存及
NodeJS会崩溃)。所以NodeJS的机制是在
worker thread(eio线程)中执行阻塞的任
务,任务执行完回调主JS线程。
• Valgrind是一个提供程序调试及性能分析的
工具集,可以查找内存泄露哦。
垃圾回收机制
• 使用了V8的GC:V8回收再利用不再被进程使用的对象内存,
以保证快速的分配对象,较短的垃圾回收停顿,和没有内存碎
片。这意味着V8会:
– 在一个垃圾回收周期堵塞/停止程序的执行
– 在大多数垃圾回收周期只回收对象堆的一部分,这能最小化
因堵塞/停止程序而产生的冲突
– 总是必须精确知道所有对象在内催中的指针,这可以避免错
误识别对象指针,否则会内存泄露。
– 在V8中,对象堆被分成两个段:新空间(创建新对象),
旧空间(在每个垃圾回收周期,将对象放入)。如果对象在
某个垃圾回收周期中被移动了,V8会更新该对象的所有指
针。
– nodejs 可以使用–max-old-space-size设置旧内存空间
non-blocking I/O model
• 与PHP的不同
npm
• npm是一个NodeJS的包管理器,可以使用它
安装及发布基于NodeJS的程序。
• 安装npm:curl http://npmjs.org/install.sh |
sh
• 安装包:npm install xxxxxx
• 发布包:npm init / adduser / publish
一些有用的包
• memcache
• redis
• policyfile
• socket.io
• express
• jade
• eventproxy
• nodemon
• ......
代码示例
全局对象
• global:全局命名空间对象
• process:进程对象(argv,exit,
uncaughtException)
• require:用来加载模块
• module:只是一个对当前对象的引用。特
别说明:module.exports和exports是一
样一样地。
更多:http://nodejs.org/docs/latest/api
一些问题
• 10个场景(地图),每个场景大概300-
500个玩家,玩家随时随地会在地图里面走
动,还可能买新装备穿在身上或者更换装
备,怎么处理呢?
• 需要获取用户信息,装备信息,背包信
息,怎样比较好的获得呢?(注意获取动
作都是异步的)eventproxy,async
谢谢大家

深入浅出NodeJS