Frage

Wir haben eine auf Java EE-basierte Webanwendung, die auf einem ausgeführt wird Glasfische App Server Cluster. Der eingehende Verkehr wird hauptsächlich erholsame Anfragen nach XML-basierten Darstellungen unserer Anwendungsressourcen sein, aber möglicherweise 5% des Verkehrs für JSON- oder XHTML/CSS-basierte Darstellungen.

Wir untersuchen jetzt Lastausgleichslösungen, um eingehenden Verkehr über die Glassfish-Instanzen im Cluster zu verteilen. Wir suchen auch, wie Sie den Cluster mit Memcached abladen können, eine in Memory verteilte Hash-Karte, deren Schlüssel die REST-Ressourcennamen sind (z. B. "/user/bob", "/Group/Jazzlovers") und deren Werte sind Die entsprechenden XML -Darstellungen.

Ein Ansatz, der vielversprechend klingt, ist, beide Vögel mit einem Stein zu töten und das leichte, schnell zu verwenden nginx HTTP Server/Reverse Proxy. Nginx würde jede eingehende Anfrage bewältigen, indem er zuerst seinen URI in Memcached nachsieht, um festzustellen, ob es bereits eine nicht abgelaufene XML -Darstellung gibt. Wenn nicht, sendet Nginx die Anfrage an einen der Glassfish -Instanzen. Das Nginx -Memcached -Modul wird in beschrieben Diese kurze Beschreibung.

Was ist Ihr allgemeine Eindruck, wenn Nginx und Memcached auf diese Weise verwendet werden. Wie glücklich sind Sie mit ihnen? Welche Ressourcen fanden Sie am hilfreichsten, um über sie zu lernen? Wenn Sie sie ausprobiert haben und sie nicht zu Ihren Absichten passen, warum nicht und was haben Sie stattdessen verwendet?

Hinweis: Hier ist ein Verwandte Frage.

Update: Ich fragte später die selbe Frage auf serverfault.com. Die Antworten deuten hauptsächlich Alternativen zu Nginx (hilfreich, aber indirekt).

War es hilfreich?

Lösung

Angenommen, Sie haben eine Bank von Anwendungsservern vorgelagerte Zustelldaten an die Benutzer.

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 der oben genannte nginx.conf -Snippet tut http://example.com/dynamic/* Direkt zum Memcached Server. Wenn Memcache den Inhalt hat, werden Ihre Upstream -Server keinen Datenverkehr sehen.

Wenn der Cache -Treffer mit einem Fehler von 404 oder 502 fehlschlägt (nicht in Cache oder Memcache nicht erreicht werden kann), übergibt Nginx die Anforderung an die vorgelagerten Server. Da es in der Upstream -Definition drei Server gibt, erhalten Sie auch einen transparenten Lastausgleichsproxy.

Jetzt ist die einzige Einschränkung, dass Sie sicherstellen müssen, dass Ihre Backend -Anwendungsserver die Daten in Memcache frisch halten. Ich verwende Nginx + memcached + web.py, um einfache kleine Systeme zu erstellen, die Tausende von Anforderungen pro Minute für relativ bescheidene Hardware bearbeiten.

Der allgemeine Pseudocode für den Anwendungsserver ist für web.py so wie dieses

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 wichtigsten Dinge, die Sie im obigen Web.Py / Pseudo -Code erinnern sollten, ist, dass der Inhalt von Memcached über Nginx überhaupt nicht geändert werden kann. Nginx verwendet einfache Zeichenfolgen und nicht Unicode. Wenn Sie die Unicode -Ausgabe in Memcached speichern, erhalten Sie zu Beginn und am Ende Ihres zwischengespeicherten Inhalts zumindest seltsame Zeichen.

Ich benutze Nginx und memcached für eine sportbezogene Website, auf der wir riesige Verkehrsimpulse erhalten, die nur ein paar Stunden dauern. Ohne Nginx und Memcached konnte ich nicht auskommen. Die Serverlast während unseres letzten Big Fourth of July Sports Event sank von 70% auf 0,6%, nachdem die oben genannten Änderungen implementiert wurden. Ich kann es nicht genug empfehlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top