- 運行 Javascript
雖然讓 Javascript 運行于服務(wù)器端不是 NodeJS 的獨特之處,但卻是其一強大功能。不得不承認,瀏覽器環(huán)境限制了我們選擇編程語(yǔ)言的自由。任何服務(wù)器與日益復雜的瀏覽器客戶(hù)端應用程序間共享代碼的愿望只能通過(guò) Javascript 來(lái)實(shí)現。雖然還存在其他一些支持 Javascript 在服務(wù)器端 運行的平臺,但因為上述特性,Node發(fā)展迅猛,成為事實(shí)上的平臺。
- 阿里云 OCS SDK for NodeJS
阿里云 OCS 服務(wù)采用的是基于 SASL 認證的 Memcached 二進(jìn)制傳輸協(xié)議。實(shí)現該協(xié)議的 NodeJS 開(kāi)源模塊很少,有一些模塊如 memjs 雖然實(shí)現了 SASL 認證和 Memcached 二進(jìn)制傳輸協(xié)議,但是不支持命令隊列即在一個(gè)命令返回數據之前無(wú)法執行新的命令,這在實(shí)際項目開(kāi)發(fā)中是無(wú)法接受的。因此,阿里云 OCS SDK for NodeJS 基于 memjs 增加了命令隊列,異常處理,自動(dòng)重新連接等功能,使 NodejS 開(kāi)發(fā)者快速接入阿里云 OCS 服務(wù)成為可能。
該開(kāi)源項目代碼托管在 https://github.com/aliyun-UED/node_memcached ,歡迎有興趣的同學(xué)貢獻代碼。
另外,一定會(huì )有人問(wèn)到 Redis 的問(wèn)題。Redis 是一種常用的開(kāi)源內存鍵值存儲系統,可支持有序集合和列表等數據結構。Redis 在 NodeJS 社區中比較常見(jiàn),而且也有很多成熟的模塊支持。在阿里云 OCS 服務(wù)后續集成 Redis 后開(kāi)發(fā)者可以自行選擇 Memcached 或者 Redis 作為存儲系統,我們屆時(shí)也會(huì )將 Redis SDK 集成到阿里云 SDK for NodeJS 中。不過(guò)對于開(kāi)發(fā)者來(lái)說(shuō)在代碼開(kāi)發(fā)方式上,Memcached 與 Redis 非常相似,只不過(guò)所需要調用的接口不同而已。
使用阿里云 OCS SDK 開(kāi)發(fā) web 應用
在文章開(kāi)始我們介紹了 OCS SDK 的最基本用法,比如我們想記錄 web 應用的總訪(fǎng)問(wèn)量,可以在 OCS 中使用一個(gè) key 代表這個(gè)總訪(fǎng)問(wèn)量,每當產(chǎn)生用戶(hù)訪(fǎng)問(wèn)的時(shí)候,可以從 OCS 中讀取 key 的值 value,將 value + 1 后再保存到 key。在這個(gè)場(chǎng)景中使用 OCS 在合適不過(guò)了,因為我們可能有多個(gè) ECS 實(shí)例作為 web server,它們可以向同一個(gè) OCS 做讀寫(xiě)操作;另外也不用擔心 ECS 實(shí)例掛掉后總訪(fǎng)問(wèn)量這個(gè)數據消失的問(wèn)題;最后, OCS 的高性能也保證了我們的業(yè)務(wù)需求。
除此之外,使用 OCS 最合適的地方就是 session 存儲了。在 web 服務(wù)器上的 session 可以存儲在
- 內存
- 磁盤(pán)文件系統
- 數據庫
Memcached 等緩存系統
從性能,可用性角度考慮,存儲在 Memcached 是最好的選擇。那么在 NodeJS 中該如何實(shí)現呢。
一般來(lái)說(shuō),開(kāi)發(fā) NodeJS web 應用需要選擇一個(gè)合適的 web 框架,我們以目前最流行的 web 框架 Express 舉例。
Express 框架內建了對 session 處理的支持,它默認的 session 存儲機制是內存存儲,而將其他 session 存儲機制作為可擴展選項。如下代碼所示:
// 創(chuàng )建一個(gè) express 實(shí)例
var app = require(“express”);
// 內存存儲 session
var session = require(‘express-session’)
// 使用 express 的 session 處理,并使用內存存儲機制
app.use(session({ secret: ‘keyboard cat’, cookie: { maxAge: 60000 }}))
// 處理 HTTP 請求,req 代表請求對象,res 代表返回對象
app.use(function(req, res) {
// sess 即為該請求所對應的用戶(hù)的 session,不用擔心,express 已經(jīng)幫你分析請求所帶的 cookie
// 并將該 cookie 所對應的 session 從存儲中找到并提供給你
var sess = req.session
// 下面是對 session 對象的處理
if (sess.views) {
sess.views++
res.setHeader(‘Content-Type’, ‘text/html’)
res.write(‘<p>views: ‘ + sess.views + ‘</p>’)
res.write(‘<p>expires in: ‘ + (sess.cookie.maxAge / 1000) + ‘s</p>’)
res.end()
} else {
// 更新后的 session 會(huì )在請求處理結束后自動(dòng)寫(xiě)回到 session 的存儲中
sess.views = 1
res.end(‘welcome to the session demo. refresh!’)
}
})
從上面的代碼中可見(jiàn),我們只需要實(shí)現 session 的存儲機制,便能夠和 express 完美的結合了。