12/29 TOSSUG 的活動 - Amir Salihefendic: Comet with node.js (下述簡介轉載自此文)
node.js [1] 是個架在 Google V8 Javascript 引擎之上的事件驅動式的輸入輸出模組(evented I/O)[2]。V8 是最快的 Javascript 虛擬機之一,node.js 用最佳的方法利用了 V8。
講者將會介紹 node.js 和實作 Comet 型態 [3] 的 chat 的實例。
- node.js
- evented I/O: 用 event 和 callback 而不用 multi-thread 實作 server 的方式,twisted 是知名的一個這樣實作出來的 web server。
- comet: 一種讓 web server 可以把資料 push 到瀏覽器的做法,見 Comet_(programming)
現場演講影片
- 感謝 FourDollars 的分享 - Amir Salihefendic: Comet with node.js (當天演講的錄影)
投影片重點摘要 整理
直接看 投影片(Comet with node.js and V8) 做的筆記, 影片還沒看, 有錯請糾正我. Orz..
- Apache / Nginx 比較
- nginx: non-blocking (能夠承受較多的使用者, 記憶體使用較少, by event)
- apache: threaded (隨著人數越多, loading 就越重)
- comet 比較適合 non-blocking 的 server.
- Ajax is so yesterday
- Comet can be create real time web-applications
- Comet 原理、方法
- Ajax: Browser 去跟 Server 問, 再回應修改.
- Comet(long poll):
一段時間自動去跟 Server 問, 再回應修改 (我認為這還是 Ajax, 只是 Ajax 加上固定時間去問 Server, Plurk 目前採用此方法)
clydewu 的解釋比較清楚: Long polling (下述取自此篇)Long polling 是一種傳統查詢(poll)技術的變形 and 允許模擬從伺服器到用戶端的資訊推送(information
push)。有了long polling,客戶端從伺服器要求資訊相似於一般的查詢。但是,如果伺服器沒有任何可用的資訊給客戶端,
伺服器會保留這個需求(request)並等待一些資訊可用 instead of 送出一個空的回應。一但資訊變成available
(或是在適當的timeout後),
一個完整的回應被送至客戶端。客戶端將會一般的立即重新要求資訊從伺服器,所以伺服器將幾乎總是有一個可用的等待需求而可以用來交付資料來回應事件。
Long Polling 本身不是推送技術,但是可以被使用在真正的推送還不可能的環境。php實作long polling的example:
用usleep()給他等沒錯 XD - Comet(streaming): 由 Server push 資料到 Browser.
- Comet server 需要非常多的 open connections (因為 browser 開啟後, 就一直連著不中斷, 就像是 Web 的 Socket)
- WebSockets 在 HTML5 有定義, 目前於 Google Chrome 有實作出來.
- 其它 Comet server
- JBoss Netty (Java)
- erlycomet (Erlang)
- Tornado (FriendFeed's Python non-blocking server)
- 講者推薦的還是 node.js