Pregunta

Tenemos una aplicación web basada en Java EE que se ejecuta en un grupo de servidores de aplicaciones Glassfish . El tráfico entrante será principalmente solicitudes RESTful para representaciones basadas en XML de los recursos de nuestra aplicación, pero quizás el 5% del tráfico podría ser para representaciones basadas en JSON o XHTML / CSS.

Ahora estamos investigando soluciones de equilibrio de carga para distribuir el tráfico entrante entre las instancias de Glassfish en el clúster. También estamos investigando cómo descargar el clúster usando memcached, un mapa de hash distribuido en memoria cuyas claves serían los nombres de recursos REST (por ejemplo, & user; bob " ;, " / group / jazzlovers ") y cuyo los valores son las representaciones XML correspondientes.

Un enfoque que parece prometedor es matar a ambas aves de un tiro y usar el ligero y rápido nginx Servidor HTTP / proxy inverso. Nginx manejaría cada solicitud entrante buscando primero su URI en memcached para ver si ya existe una representación XML no vencida. Si no, nginx envía la solicitud a una de las instancias de Glassfish. El módulo nginx memcached se describe en esta breve reseña .

¿Cuál es su impresión general con nginx y memcached utilizados de esta manera, qué tan contento está con ellos? ¿Qué recursos encontró más útiles para aprender sobre ellos? Si los probó y no se adaptaban a sus propósitos, ¿por qué no y qué utilizó en su lugar?

Nota: aquí hay una pregunta relacionada .

Actualización: más tarde le hice a la misma pregunta en ServerFault.com. Las respuestas allí son principalmente sugerencias alternativas a nginx (útiles, pero indirectamente).

¿Fue útil?

Solución

Suponiendo que tiene un banco de servidores de aplicaciones de datos de entrega aguas arriba para los usuarios.

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

Lo que hace el fragmento nginx.conf anterior es dirigir todo el tráfico desde http://example.com/dynamic/ * DIRECTAMENTE al servidor memcached. Si memcache tiene el contenido, sus servidores ascendentes no verán NINGÚN tráfico.

Si el acierto de la memoria caché falla con un error 404 o 502 (no en la memoria caché o no se puede acceder a la memoria caché), nginx pasará la solicitud a los servidores ascendentes. Dado que hay tres servidores en la definición ascendente, también obtiene un proxy de equilibrio de carga transparente.

Ahora la única advertencia es que debe asegurarse de que sus servidores de aplicaciones de back-end mantengan actualizados los datos en Memcache. Uso nginx + memcached + web.py para crear pequeños sistemas simples que manejan miles de solicitudes por minuto en hardware relativamente modesto.

El pseudocódigo general para el servidor de aplicaciones es así para 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

Lo importante para recordar en el código web.py / pseudo anterior es que el contenido que proviene de memcached a través de nginx no se puede cambiar en absoluto. nginx está usando cadenas simples y no unicode. Si almacena la salida Unicode en Memcached, obtendrá al menos caracteres extraños al principio y al final de su contenido en caché.

Utilizo nginx y memcached para un sitio web relacionado con deportes donde recibimos enormes pulsos de tráfico que solo duran unas pocas horas. No podría sobrevivir sin nginx y memcached. La carga del servidor durante nuestro último gran evento deportivo del 4 de julio cayó del 70% al 0.6% después de implementar los cambios anteriores. No puedo recomendarlo lo suficiente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top