2009-06-18 7 views
4

Wir verfügen über eine Java EE-basierte Webanwendung, die auf einem Glassfish App-Server-Cluster ausgeführt wird. Bei dem eingehenden Datenverkehr handelt es sich hauptsächlich um REST-Anfragen für XML-basierte Darstellungen unserer Anwendungsressourcen, aber möglicherweise sind 5% des Datenverkehrs für JSON- oder XHTML/CSS-basierte Darstellungen.Welche Erfahrung haben Sie mit Nginx und Memcached, um eine Website zu optimieren?

Wir untersuchen nun Load-Balancing-Lösungen, um eingehenden Datenverkehr über die Glassfish-Instanzen im Cluster zu verteilen. Wir untersuchen auch, wie der Cluster mithilfe von memcached, einer speicherintern verteilten Hash-Map, deren Schlüssel die REST-Ressourcennamen (z. B. "/ user/bob", "/ group/jazzlovers") und deren Werte sind, ausgelagert werden kann die entsprechenden XML-Darstellungen.

Ein Ansatz, der vielversprechend klingt, ist, beide Vögel mit einer Klappe zu schlagen und den leichten, schnellen HTTP-Server/Reverse-Proxy zu verwenden. Nginx würde jede eingehende Anfrage behandeln, indem sie zuerst ihren URI in memcached nach oben schaut, um zu sehen, ob dort bereits eine nicht abgelaufene XML-Darstellung vorhanden ist. Wenn nicht, sendet nginx die Anfrage an eine der Glassfish-Instanzen. Das Modul nginx memcached ist in this short writeup beschrieben.

Wie ist Ihr Gesamteindruck mit nginx und memcached auf diese Weise verwendet, wie glücklich sind Sie mit ihnen? Welche Ressourcen fanden Sie am hilfreichsten, um etwas über sie zu erfahren? Wenn du sie ausprobiert hast und sie nicht für deine Zwecke geeignet waren, warum nicht, und was hast du stattdessen benutzt?

Hinweis: Hier ist ein related question.

Update: Ich fragte später the same question auf ServerFault.com. Die Antworten dort sind hauptsächlich Alternativen zu nginx (hilfreich, aber indirekt).

Antwort

9

Angenommen, Sie haben eine Bank von Anwendungsservern, die Daten an die Benutzer senden.

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; 
    } 

Was die oben nginx.conf Schnipsel tut, ist direkt der gesamte Verkehr von http://example.com/dynamic/ * DIREKT auf Memcached-Server. Wenn Memcache den Inhalt hat, sehen Ihre Upstream-Server KEINEN Datenverkehr.

Wenn der Cache-Treffer mit einem Fehler 404 oder 502 fehlschlägt (nicht im Cache oder Memcache nicht erreicht werden kann), wird Nginx die Anfrage an die Upstream-Server übergeben. Da in der Upstream-Definition drei Server vorhanden sind, erhalten Sie auch einen transparenten Load-Balancing-Proxy.

Jetzt ist die einzige Einschränkung, dass Sie sicherstellen müssen, dass Ihre Backend-Anwendungsserver die Daten in Memcache frisch halten. Ich benutze nginx + memcached + web.py, um einfache kleine Systeme zu erstellen, die Tausende von Anfragen pro Minute auf relativ bescheidener Hardware behandeln.

Der allgemeine Pseudocode für den Anwendungsserver, wie dies für web.py ist

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 

Die wichtigen Dinge in der obigen web.py/Pseudo-Code zu erinnern ist, dass der Inhalt von Memcached über nginx kommen kann nicht sein, überhaupt verändert. Nginx verwendet einfache Zeichenfolgen und nicht Unicode. Wenn Sie die Unicode-Ausgabe in memcached speichern, erhalten Sie zumindest am Anfang und am Ende des zwischengespeicherten Inhalts merkwürdige Zeichen.

Ich benutze nginx und memcached für eine Sport-Website, wo wir riesige Impulse des Verkehrs bekommen, die nur für ein paar Stunden dauern. Ich kam ohne Nginx und Memcached nicht klar. Die Serverlast während unseres letzten großen Sportereignisses im vierten Juli fiel von 70% auf 0,6% nach der Implementierung der oben genannten Änderungen. Ich kann es nicht genug empfehlen.

+0

Danke, das ist sehr hilfreich. –