Pregunta

Estoy preparando una API REST y, como no estoy seguro de cómo se escalará o cuál será su demanda, me gustaría poder calificar usos limitados de la misma así como poder temporalmente rechazar solicitudes cuando la casilla está por encima de su capacidad o si hay algún tipo de escenario reducido.

También me gustaría poder desactivar el servicio temporalmente (mientras doy a los clientes resultados que indican que el servicio principal está desconectado un poco) cuando / si necesito escalar el servicio agregando más capacidad.

¿Hay alguna mejor práctica para este tipo de cosas? La implementación es Rails con mysql.

¿Fue útil?

Solución

Todo esto se hace con un servidor web externo, que escucha al mundo (recomiendo nginx o lighttpd).

Con respecto a los límites de velocidad, nginx puede limitar, es decir, 50 req / minuto por cada IP, en todas las páginas obtiene 503, que puede personalizar.

Con respecto a la baja temporal esperada, en el mundo de los rieles, esto se hace a través de la página especial maintenanceance.html. Hay algún tipo de automatización que crea o establece enlaces simbólicos con ese archivo cuando los servidores de aplicaciones rails se caen. Recomiendo no depender de la presencia de archivos, sino de la disponibilidad real del servidor de aplicaciones.

Pero realmente puede iniciar / detener servicios sin perder ninguna conexión. Es decir. puede ejecutar una instancia separada del servidor de aplicaciones en un puerto de UNIX / IP diferente y hacer que el equilibrador (nginx / lighty / haproxy) use esa nueva instancia también. Luego, cierra la instancia anterior y todos los clientes reciben solo una nueva. No hay conexión perdida. Por supuesto, este escenario no siempre es posible, depende del tipo de cambio que haya introducido en la nueva versión.

haproxy es una solución de solo balanceador. Puede equilibrar de manera extremadamente eficiente las solicitudes a los servidores de aplicaciones en su granja.

Para un servicio bastante grande, terminas con algo como:

  • api.domain resolviendo para balanceadores de round-robin N
  • cada equilibrador envía solicitudes a servidores web M para servidores estáticos y servidores de aplicaciones P para contenido dinámico. Bueno, tu API REST no tiene archivos estáticos, ¿verdad?

Para un servicio bastante pequeño (menos de 2K rps) todo el equilibrio se realiza dentro de uno o dos servidores web.

Otros consejos

Buenas respuestas ya: si no desea implementar el limitador usted mismo, también hay soluciones como 3scale ( http: / /www.3scale.net ) que limita la velocidad, análisis, etc. para las API. Funciona con un complemento (consulte aquí el ruby ??api plugin ) que se enlaza con la arquitectura de 3scale. También puede usarlo mediante barniz y hacer que el barniz actúe como un proxy de limitación de velocidad.

Recomiendo implementar los límites de velocidad fuera de su aplicación, ya que de lo contrario el alto tráfico aún tendrá el efecto de matar su aplicación. Una buena solución es implementarlo como parte de su proxy apache, con algo como mod_evasive

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