Pergunta

Estou juntando uma API REST e como eu sou inseguro como ele será ampliado ou o que a demanda por ele será, eu gostaria de ser capaz de usos limite de taxa do mesmo, bem como ser capaz de temporariamente pedidos de lixo quando a caixa está acima da capacidade ou se existe algum tipo de cenário slashdotted.

Eu também gostaria de ser capaz de graciosamente trazer o serviço para baixo temporariamente (dando resultados clientes que indicam o serviço principal é desligada para um pouco) quando / se eu preciso para escalar o serviço, adicionando mais capacidade.

Há algum melhores práticas para esse tipo de coisa? A implementação é Rails com mysql.

Foi útil?

Solução

Isso tudo é feito com webserver exterior, que ouve o mundo (eu recomendo nginx ou lighttpd).

Quanto limites de frequência, nginx é capaz de limite, ou seja, 50 req / minuto por cada IP, todo obter 503 páginas, que você pode personalizar.

Em relação esperado para baixo temporário, no mundo trilhos isso é feito através da página maintainance.html especial. Há algum tipo de automação que cria ou links simbólicos esse arquivo quando o Rails servidores de aplicação ir para baixo. Eu recomendo não contando com a presença do arquivo, mas com a disponibilidade real de servidor de aplicações.

Mas realmente você é capaz de iniciar os serviços / parada sem perder qualquer ligação em tudo. Ou seja, você pode executar instância separada do servidor de aplicações no soquete UNIX porta diferente / IP e ter balanceador (nginx / lighty / haproxy) uso essa nova instância também. Então você desligar instância antiga e todos os clientes são servidos com apenas novo. Sem ligação perdida. É claro que este cenário nem sempre é possível, depende do tipo de mudança que você introduziu na nova versão.

haproxy é uma solução apenas de balanceador. Pode extremamente equilibrar eficientemente solicitações para servidores de aplicativos em sua fazenda.

Para muito grande serviço que você acabar-se com algo como:

  • api.domain resolvendo balanceadores de round-robin n
  • cada proxies balanceador pedidos para M servidores web para servidores estáticos e aplicativos P para conteúdo dinâmico. Oh bem o seu API REST não têm arquivos estáticos, não é?

Para muito pequeno serviço (sob 2K RPS) tudo balanceamento é feito dentro de um a dois servidores web.

Outras dicas

Boas respostas já - se você não quiser implementar o limitador de si mesmo, também existem soluções como 3scale ( http: / /www.3scale.net ) que faz a limitação de taxa, etc. analítica para APIs. Ele funciona usando um plugin (ver aqui para o ruby ??api plug-in ) que ganchos na arquitetura 3scale. Você também pode usá-lo através de verniz e tem verniz agir como um proxy limitante da velocidade.

Eu recomendo implementar os limites da frequência fora de sua aplicação pois caso contrário o alto tráfego ainda terá o efeito de matar a sua aplicação. Uma boa solução é implementá-lo como parte de seu proxy apache, com algo como mod_evasive

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top