對于絕大多數(shù)發(fā)展中等的web 2.0網(wǎng)站來說,LAMP結構已經(jīng)不能滿足現(xiàn)在的需要了,新的架構組合是GLAMMP,G=Gearman(分布式遠程過程處理),M=Memcached(高性能的分布式的內(nèi)存對象緩存系統(tǒng))。
簡單的說Gearman是PHP實現(xiàn)異步處理利器,當然不僅僅是PHP實現(xiàn)異步處理的手段。
Gearman簡介
Gearman是 Brad Fitzpatrick 的一個作品,用 Perl 寫的任務調度程序,提供一個服務器端和多種語言的客戶端接口,包括 C/Perl/Python/Ruby 等,在 client library 本身就支持一定程度的高可靠度。
Gearman系統(tǒng)用來把工作委派給其他機器,分布式的調用更適合做某項工作的機器,并發(fā)的做某項工作,在多個調用間做負載均衡,或用來在調用其它語言的函數(shù)。
Gearman的高級特性
在一個 Web 應用程序內(nèi)可能有許多地方都會用到Gearman??梢詫氪罅繑?shù)據(jù)、發(fā)送許多電子郵件、編碼視頻文件、挖據(jù)數(shù)據(jù)并構建一個中央日志設施 —所有這些均不會影響站點的體驗和響應性??梢圆⑿械靥幚頂?shù)據(jù)。而且,由于 Gearman協(xié)議是獨立于語言和平臺的,所以您可以在解決方案中混合編程語言。比如,可以用 PHP 編寫一個 producer,用 C、Ruby或其他任何支持 Gearman 庫的語言編寫 worker。
一個連接客戶機和 worker 的 Gearman 網(wǎng)絡實際上可以使用任何您能想象得到的結構。很多配置能夠運行多個代理并將 worker分配到許多機器上。負載均衡是隱式的:每個可操作的可用 worker(可能是每個 worker 主機具有多個worker)從隊列中拉出作業(yè)。一個作業(yè)能夠同步或異步運行并具有優(yōu)先級。
Gearman 的最新版本已經(jīng)將系統(tǒng)特性擴展到了包含持久的作業(yè)隊列和用一個新協(xié)議來通過 HTTP 提交工作請求。對于前者,Gearman工作隊列保存在內(nèi)存并在一個關系型數(shù)據(jù)庫內(nèi)存有備份。這樣一來,如果 Gearman守護程序故障,它就可以在重啟后重新創(chuàng)建這個工作隊列。另一個最新的改良通過一個 memcached 集群增加隊列持久性。memcached存儲也依賴于內(nèi)存,但被分散于幾個機器以避免單點故障。
Gearman 是一個剛剛起步卻很有實力的工作分發(fā)系統(tǒng)。據(jù) Gearman 的作者 Eric Day 介紹,Yahoo! 在 60或更多的服務器上使用 Gearman 每天處理 600 萬個作業(yè)。新聞聚合器 Digg 也已構建了一個相同規(guī)模的 Gearman網(wǎng)絡,每天可處理 400,000 個作業(yè)。Gearman 的一個出色例子可以在 Narada 這個開源搜索引擎(參見 參考資料)中找到。
Gearman 的未來版本將收集并報告統(tǒng)計數(shù)據(jù)、提供高級監(jiān)視和緩存作業(yè)結果等。為了跟蹤這個 Gearman 項目,可以訂閱它的 Google 組,或訪問 Freenode 上它的 IRC 頻道 #gearman。
Gearman都能用來干什么?
Gearman 可以用在各個方面,最簡單就是在不同語言之間架起一座橋梁。比如你可能希望你的php程序調用一個c函數(shù),那么用gearman就可以實現(xiàn)了,當然了實際你可以通過寫一個php擴展來實現(xiàn)同樣的工作,但是比如你要php調用java,perl,或者python那么,Gearman就非常棒了。
Gearman另一個應用方面是負載分擔,你可以將worker放在不同的服務器(或者一些列服務器)上,比如你的php程序需要圖片轉換,但是不希望本地服務器有太多的這樣圖片轉換的進程,那么你可以建立一系列服務器,在上面加載worker處理圖片轉換。這樣你的web服務器將不受圖片轉換的影響,同時你得到了負載均衡的功能,因為jobserver會在請求到來的時候,將這個請求發(fā)給空閑的worker.同樣對于多核的服務器,你可以在同一機器上創(chuàng)建同樣數(shù)目的worker.你可能擔心,job server處于一個中心,那么這會是一個單點的瓶頸,如果死了,會怎么樣?對于這樣的情況,你可以運行多個jobserver。這樣如果一個job server down了,client和worker會自動遷移到另一臺job server上。