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