目錄
- 連接池
- 基于
- 一個簡單的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對象切分成多個獨立的命名空間