摘要:內容管理系統(CMS)在各大商業站點和門戶站點中扮演著重要的角色,是內容有效組織和快速發布極為重要的基礎平臺。目前主流的內容發布系統都使用靜態頁面進行內容發布,在我們的實際使用過程中我們深切的感受到靜態內容發布存在著很多弊端,本文討論全搜索目前正在使用的基于動態可緩存內容發布系統的考慮和實現。
一、什么是內容管理系統?
內容發布系統也即CMS,英文全稱為:Content?management?system,用于對企業業務數據進行組織、管理和發布,這里的內容不僅僅指文字內容,還包括圖片、聲音、視頻、Flash等富媒體資源,CMS的應用極大的提高了站點的建設效率并降低了維護成本。目前市面上的CMS種類繁多,開源的內容管理系統主要有:
PHP:
國內PHPCMS,VeryCMS,DeDeCMS,EmpireCMS,HBCMS
國外:Mambo,Joomla!,XOOPS,Drupal
更多見:http://www.php-open.com/9.htm
Java見http://www.open-open.com/39.htm
ASP主要考察使用過風訊,對其它ASPCMS感興趣的可以查看這篇文章
http://hi.baidu.com/liberty88/blog/item/56e147fbd8271a176c22eb0e.html
商業CMS主要有:方正翔宇CMS,北方網CMS和TRS?WAS,其中方正翔宇CMS在媒體行業應用非常廣泛,TRS在政府部門應用非常廣泛,北方網CMS在一些媒體網站中也有些應用。
就目前的總體情況來看,開源類CMS和商業類CMS還存在很大的差距,商業CMS在工作流,權限控制,內容的編采發以及系統的性能,擴展和可維護性上已經非常成熟和完善;對比開源CMS,則在這些方面存在很大的差距。由于個人覺得國外的CMS不太符合國人的使用習慣和國情,所以對他們研究的比較少也不太清楚他們在國內的應用情況,就國內的CMS而言目前也還沒有看到較大規模應用的案例(如果有請告訴我),我透露幾個目前已知的商業CMS內容發布系統的應用情況關鍵性能指標,最大數據量千萬級,同時最高終端用戶數500,發布時間1-2秒,每日更新1萬-2萬篇內容,相關內容自動更新。總之,開源CMS要走的路還長。
二、什么是動態可緩存的內容管理系統?
動態可緩存的內容管理系統是指前臺頁面動態解析執行并且動態解析執行的頁面可被客戶端和代理服務器進行緩存從而達到和生成靜態頁面同樣的執行性能和效果的管理系統。
三、為什么使用動態可緩存的內容管理系統?
第一節面提供的內容發布系統包括商業類CMS基本都是以生成靜態頁面的方式進行內容發布,我們早期的系統也全部使用靜態靜態頁面進行內容發布,在我們的實際使用過程中,生成靜態頁面的方式給我們帶來了很多麻煩,主要有下面幾個問題:
1、在設計、開發上,使用靜態頁面進行發布,系統需要很多額外的設計和開發,以靜態頁面的方式進行發布,涉及到生成規則,更新規則,發布規則等方方面面的事務,特別是當系統對內容的發布和更新有苛刻的性能要求時,這些規則更是需要進行仔細的設計和權衡。使用靜態頁進行發布主要是考慮到系統的執行性能,我當然同意靜態頁的執行性能是很高的,但是多數系統卻遠遠大不到預想的訪問量而引入了高度的系統復雜,也并非是系統一開始就有巨大的訪問量,我也不認同動態執行頁面就無法承受大訪問量的說法,其實我看到的大多數CMS中都沒有對靜態頁的處理規則進行很好的設計,比如:經常是在后臺撤銷了內容發現原始html沒有刪除,內容依然可以訪問或者一篇內容更新時,相關引用的內容無法做到關聯更新;靜態發布方式并不是那樣容易的,相反我覺得動態發布更容易開發和維護。
2、在系統維護上,生成的靜態頁面會占用很大的磁盤空間,我們所有的靜態頁面加起來應該有100-200個G了。這樣龐大的數據量備份,恢復都是很麻煩的,無形之中給系統的運維工作增加了很大的難度,但實際上CMS有個顯著的特點就是發布多,修改少,越早的數據越少被訪問,應該說這100,200個G的數據中有99%以上的數據是有效期過后很少或再也沒被訪問過的,所以磁盤幾乎是白白的被浪費了。
所以,在我們的實際使用過程中我們更傾向于動態內容執行+多重cache的方式,新的系統中我們是這樣做的,最后完成的系統非常簡單并在Squid的幫助下達到靜態頁面的執行性能。
四、如何實現動態可緩存的內容管理系統?
(可緩存的內容管理系統用戶訪問流程)
實現過程:
1.?所有前臺頁面使用URL?rewrite重寫成.html進行訪問,方便搜索引擎收錄。
2.?WEB程序執行時,向Squid服務器發送Expires頭,用于控制squid服務器的緩存時間。Expires用戶設置Squid服務器和客戶端的緩存時間。如:
PHP
php代碼
header("Expires:" . gmdate("D, d M Y H:i:s", time() + 120). "GMT"); //緩存120秒
Java
?
java.text.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT"));
format.setCalendar(cal);
java.util.Date expires = format.parse(format.format(new Date(System.currentTimeMillis() + 120 * 1000)));
response.setHeader('Expires: ' + expires);
?
?3.?配置Squid服務器指向源服務器,并配置ignore-reloa來忽略no-cache和reload請求以提升Squid的命中率。
4.?將最新最熱的數據緩存到Memcached服務器,減少數據庫的查詢。
至此整個過程已經完成,早期系統的訪問量一般比較小,這時候可直接將WEB服務器對外提供服務,由于CMS所管理內容發布快,修改少的特性,最新最熱的內容都將在Memcached中命中;當訪問量增加到一定程度的時候就可以在前端加上squid服務器,這樣就實現了和靜態頁面一樣的效果,同時也兼備了系統的可維護性和靈活性。我們的全搜索首頁,母嬰頻道,娛樂頻道使用這種方法實現獲得了很好的效果。
五、擴展
使用squid作為前端時,過期時間的設置就變得非常重要,如果設置得太長用戶就很容易看到過期內容,如果設置得太短又降低了命中率不能有效發揮前端緩存的優勢。那過期時間應該設置為多長比較合適呢?通常情況下首頁的更新頻道很高,內容頁更新的頻率較低,所以首頁的過期時間應該設置得短一些,內容頁可以設置的長一些。
新浪?????????
新浪首頁60秒過期,內容頁120秒過期
搜狐??
搜狐首頁70秒過期,內容頁120秒過期
163
163首頁80秒過期,內容頁120秒過期
經過測試成都全搜索的系統里首頁設置60秒過期,內容頁設置120秒過期,這樣的設置經過長時間的運行沒有收到任何編輯和用戶的不良使用反饋,這樣的設置使得每隔60秒鐘首頁去原始服務器執行一次;每隔120秒對內容頁去原始服務器執行一次。由于后端使用memcached作為緩存,即使是突發流量也可以輕松自如的應對。
學習資料:
http://delicious.com/wuyong/cache
?? - 點擊:15次