Domanda

Abbiamo un'applicazione Web basata su Java EE in esecuzione su un cluster di server di app Glassfish . Il traffico in entrata sarà principalmente richieste RESTful per rappresentazioni basate su XML delle risorse delle nostre applicazioni, ma forse il 5% del traffico potrebbe essere per rappresentazioni basate su JSON o XHTML / CSS.

Stiamo attualmente studiando soluzioni di bilanciamento del carico per distribuire il traffico in entrata attraverso le istanze di Glassfish nel cluster. Stiamo anche esaminando come scaricare il cluster usando memcached, una mappa hash distribuita in memoria le cui chiavi sarebbero i nomi delle risorse REST (ad esempio, " / user / bob " ;, " / group / jazzlovers ") e di cui i valori sono le rappresentazioni XML corrispondenti.

Un approccio che sembra promettente è quello di uccidere entrambi gli uccelli con una fava e usare il leggero e veloce nginx server HTTP / proxy inverso. Nginx gestirà ogni richiesta in arrivo cercando prima il suo URI in memcached per vedere se c'è già una rappresentazione XML non scaduta. In caso contrario, nginx invia la richiesta a una delle istanze di Glassfish. Il modulo memcached nginx è descritto in questo breve commento .

Qual è la tua impressione generale su nginx e memcached utilizzata in questo modo, quanto sei felice con loro? Quali risorse hai trovato più utili per conoscerli? Se le hai provate e non si adattavano ai tuoi scopi, perché no, e cosa hai usato invece?

Nota: ecco una domanda correlata .

Aggiornamento: in seguito ho chiesto a la stessa domanda su ServerFault.com. Le risposte suggeriscono principalmente alternative a nginx (utile, ma indirettamente).

È stato utile?

Soluzione

Supponendo di avere una banca di server delle applicazioni a monte dei dati di consegna agli utenti.

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

Ciò che fa lo snippet nginx.conf sopra è indirizzare tutto il traffico da http://example.com/dynamic/ * DIRETTAMENTE al server memcached. Se memcache ha il contenuto, i tuoi server upstream non vedranno NESSUN traffico.

Se l'hit della cache fallisce con un errore 404 o 502 (non è possibile raggiungere cache o memcache), nginx passerà la richiesta ai server upstream. Poiché nella definizione upstream sono presenti tre server, si ottiene anche un proxy di bilanciamento del carico trasparente.

Ora l'unico avvertimento è che è necessario assicurarsi che i server delle applicazioni back-end mantengano aggiornati i dati in memcache. Uso nginx + memcached + web.py per creare piccoli sistemi semplici che gestiscono migliaia di richieste al minuto su hardware relativamente modesto.

Lo pseudo codice generale per il server delle applicazioni è così per 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

Le cose importanti da ricordare nel codice web.py / pseudo sopra riportato sono che il contenuto proveniente da memcached tramite nginx non può essere modificato affatto. nginx utilizza stringhe semplici e non unicode. Se memorizzi l'output unicode in memcached, otterrai almeno i caratteri strani all'inizio e alla fine del contenuto memorizzato nella cache.

Uso nginx e memcached per un sito Web dedicato allo sport in cui riceviamo enormi impulsi di traffico che durano solo poche ore. Non potrei cavarmela senza nginx e memcached. Il carico del server durante il nostro ultimo grande evento sportivo del 4 luglio è sceso dal 70% allo 0,6% dopo l'implementazione delle modifiche sopra. Non posso raccomandarlo abbastanza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top