4/04/2008

Rack - 小架子立大功

最近 Ruby Web Framework 界出現了很多新面孔:
Ramze, Sinatra,Waves, Halcyon ,還有 4/1 才發佈的下一代 framework ==> Ruby on Crack!!

這些 framework 各有各的特點,除了為原本被 Rails 一統天下的 web 開發增添了新的風貌,也說明了 Ruby 社群的活躍。而他們(除了太神奇的 Crack 之外)的背後的大功臣,就是今天的主題: Rack

Rack 到底是何方神聖呢?


每個 web framework 最後一定要接回去 web server 。方法有很多,有人喜歡老牌的 Fastcgi ,有人愛用雜種狗,有人要像 mac book air 一樣,有人說退潮最快。

新的 framework 一直冒,新的 web server 一直來,每個人都要重新寫把兩者接起來的 code 實在太累了, Rack 就是為了解決這個問題而出現的。(1)

Rack

Web 程式講白了很簡單,就是拿 request 然後回 response。Rack 就是把各種 web server 的 request 和各種 framewrok 的 response 用統一的介面來處理。那麼這個統一的介面是什麼呢?

一句話

lambda { |env| [200, {}, 'Hello World!' }

首先, Rack 會將 request 傳給要處理這個 request 的物件的 call 函式。這個例子中,處理 request 的物件就是 lambda。(當然你可以用一般的物件,只要它有 call 這個 method 就行了。)
例子中的 env 就是 request,它是一個 hash ,裡面包含了類似 CGI Environment 變數,像是 PATH_INFO,QUERY_STRING 等等的東西。

而 call 的回傳值,會被當成 response 傳回去給 web server。這個回傳值必需是包含三個元素的 Array: status, headers 和 body。

原本 N 個 framework 和 M 個 web server ,要寫出 NxM 個 Adapter。而有了 Rack 後,大家只要對 Rack 的介面做 Adapter ,複雜度馬上減少為 N+M 了!

如此一來,不用一直重新實做橋接的邏輯,可以把心思放在 framework 本身的設計上。有了 rack ,相信 ruby 的 web 開發會更為有趣。

下一篇再來實際寫些 code 吧。


這張圖的 idea 是從這裡來的...

4 則留言:

匿名 提到...

@@ Ruby on Crack是因應愚人節才寫的一篇

Yuren Ju 提到...

為何稱 Mongrel 雜種狗呢?

contagion 提到...

To knui:
所以才說是 4/1 發佈的「神奇」framewrok 啊

To yuren ju:
因為這個web server 是用 C 混著 Ruby 寫成的

http://tw.dictionary.yahoo.com/search?ei=UTF-8&fr=yfp&p=mongrel

anw 提到...

socket client/server 已被淘汰了. 現在都將升級到 WEB 的架構, 最近也在看 rack & thin, 用來替代上世紀 client/server 架構, 真是不錯.