目录
- 连接池
- 基于
- 一个简单的Socker.io服务器
连接池
生产环境通常由多种资源组成: web服务器,缓存服务器和数据库服务器.
数据库服务器通常部署在web服务器之外的独立机器上,这使得面向公众的网站不必重新配置和修改复杂的数据库群就可以垂直增长了.
基于
为每一个请求创建一个甚至多个连接会对高流量的网站造成不必要的额额外负担,也会导致性能下降
解决方案
在内部缓存池里维护数据库连接,当某一个连接不再需要时,她会被放回连接池里,这样就能立刻为下一个进入的请求服务
通用的连接池- generic-pool
连接池模式违反了Node的"一个模块,一个功能"的理念
该模块尽可能的防止因为创建新的数据库连接为而带来的 开销消息队列协议
发布-订阅模型
用户注册流程中,数据库调用可以等到用户受到欢迎之后在进行操作,统计数据可以从程序的主逻辑独立出去处理,这样的情况下,你可以选择生成一条消息,来通知程序的其他部分有新用户注册了,这样的程序也可能完全运行在另外一个服务器上
请求-回复模型
请求信息,回馈
消息队列允许程序员发布时间然后继续其他操作,通过进程间通信频道,提高了并发处理的频率,并实现了更高的扩展性
RabbitMQ
消息代理,支持高级消息队列(AMQP)
外部模块
Socket.IO
小巧的扩展库.通过Socket.IO在浏览器客户端与Node服务器之间采用高效的底层socket机制来回发送消息
浏览器和服务器之间共享代码
var http = require('http'), io = require('socket.io')var server = http.createServer()server.on('request', function(req, res){res.writeHead(200,{'Content-Type':'text/plain'})res.end('hello world')})server.listen(80)var socket = io.listen(server)socket.on('connection', function(client){console.log('client conencted')})
- 依赖http模块
- 其实Socket.io不关心Http服务器做什么,她只是把自带的事件监听器包装在发送到服务器的所有请求上
- Socket.io是持久性连接,不需要像http服务器处理req,res对象,与使用net类似,需要使用传入的client对象来与每一个浏览器进行通信
- 新建一个网页文件,写入JS代码
var socket = io.connect('http:/localhost:8080');socket.on('message', function(data){console.log(data);})
一个简单的Socker.io服务器
var http = require('http'),io = require('socket.io'),fs = require('fs')var sockFile = fs.readFileSync('./socket_io.html')server = http.createServer()server.on('request', function(req, res){res.writeHead(200,{'Content-Type':'text/plain'})res.end(sockFile)})server.listen(8080)var socket = io.listen(server)socket.on('connection', function(client){console.log('client conencted')client.send('welcone client' + client.seesionId)})
- node服务器会返回一份html文件
同步读取会堵塞Node的事件循环,知道文件读取完毕
命名空间
socket.of()函数把socket对象切分成多个独立的命名空间