2009-06-18 54 views
4

我們在Glassfish應用程序服務器羣集上運行基於Java EE的Web應用程序。傳入流量主要是RESTful請求,用於基於XML的應用程序資源表示,但可能有5%的流量用於基於JSON或XHTML/CSS的表示。您有使用nginx和memcached優化網站的經驗嗎?

我們現在正在研究負載均衡解決方案,以便在集羣中的Glassfish實例之間分配傳入流量。我們還在研究如何使用memcached卸載集羣,這是一個內存中的分佈式散列映射,其鍵爲REST資源名稱(例如,「/ user/bob」,「/ group/jazzlovers」),其值爲相應的XML表示。

聽起來很有前途的一種方法是一舉兩得,並使用輕量級,快速的HTTP服務器/反向代理服務器。 Nginx會通過首先在memcached中查找它的URI來處理每個傳入的請求,以查看是否存在尚未到期的XML表示。否則,nginx將請求發送到其中一個Glassfish實例。 nginx memcached模塊在this short writeup中描述。

你對nginx和memcached的整體印象如何使用這種方式,你對他們有多開心?你認爲哪些資源對於瞭解它們最有幫助?如果你嘗試過它們,但它們不適合你的目的,爲什麼不,你用什麼來代替?

注意:這是一個related question

更新:我後來在ServerFault.com上詢問the same question。那裏的答案主要是建議替代nginx(有幫助,但是間接)。

回答

9

假設您有一組應用程序服務器向用戶上傳交付數據。

upstream webservices { 
    server 10.0.0.1:80; 
    server 10.0.0.2:80; 
    server 10.0.0.3:80; 
} 
server { 
    ... default nginx stuff ... 
    location /dynamic_content { 
      memcached_pass localhost:11211; 
      default_type text/html; 
      error_page  404 502 = @dynamic_content_cache_miss; 
      set $memcached_key $uri; 
    } 
    location @dynamic_content_cache_miss { 
      proxy_pass http://webservices; 
    } 

什麼上述nginx.conf片斷的作用是直接的所有流量從http://example.com/dynamic/ *直接memcached服務器。如果memcache具有內容,則上游服務器將看不到任何流量。

如果高速緩存命中失敗並出現404或502錯誤(不能在高速緩存或無法訪問的memcache中),則nginx會將請求傳遞給上游服務器。由於上游定義中有三臺服務器,因此您還可以獲得透明的負載平衡代理。

現在唯一需要注意的是,您必須確保後端應用程序服務器將數據保存在memcache中。我使用nginx + memcached + web.py創建簡單的小系統,在相對適中的硬件上每分鐘處理數千個請求。

應用程序服務器的一般僞代碼是這樣的web.py

class some_page: 
    def GET(self): 
     output = 'Do normal page generation stuff' 
     web_url = web.url().encode('ASCII') 
     cache.set(web_url, str(output), seconds_to_cache_content) 
     return output 

在上面web.py需要記住的重要的東西/僞代碼是從內容通過nginx的memcached的不能來了改變了。 nginx使用簡單的字符串而不是unicode。如果將unicode輸出存儲在memcached中,則會在緩存內容的開始和結尾處看到至少奇怪的字符。

我使用nginx和memcached作爲一個體育相關網站,在那裏我們獲得只有幾個小時的巨大交通脈衝。沒有nginx和memcached,我無法得到。在執行上述更改後,我們上一次七月四號體育賽事的服務器負載從70%下降到0.6%。我無法推薦它。

+0

謝謝,這是非常有幫助的。 – 2009-07-07 21:59:48