O ajuste fino da carga de trabalho do seu servidor Web 4D é agora canja. A partir do 4D 21 R5, o seu servidor Web já não fica exposto a sobrecargas involuntárias, quer se trate de um volume excessivo de dados solicitados, de um número demasiado elevado de pedidos recebidos ou de uma explosão de sessões de visitantes.
Continue a ler para descobrir tudo o que precisa para criar um sistema de limitação de taxa totalmente personalizado para o seu servidor de aplicações Web.
Numa publicação anterior do blogue sobre o 4D 21 R4, apresentámos uma forma de limitar o número de conjuntos de entidades numa sessão REST, o capítulo inicial de uma história muito mais vasta. Hoje, essa história atinge um marco importante (embora não definitivo).
Com o 4D 21 R5, o seu 4D Web Server pode ser ajustado com precisão para manter o tráfego de entrada e de saída sob controlo, graças às quotas.
Esta nova funcionalidade não altera o comportamento predefinido do seu servidor web: por predefinição, não são aplicadas quotas. Dependendo das suas necessidades, pode recorrer a uma gama abrangente de quotas: utilize apenas uma, utilize-as todas; a granularidade depende inteiramente de si.
HDI_WebServer_RateLimitingQuotas
Adicionar inteligência de aplicações à proteção web clássica
Esta funcionalidade complementa, em vez de substituir, proxies reversos, WAFs, firewalls… e outros serviços. Estas tecnologias protegem o perímetro da rede e filtram o tráfego hostil, enquanto a 4D proporciona a regulação da carga de trabalho ao nível da aplicação no interior do servidor web.
O seu valor acrescentado reside no conhecimento das sessões 4D e do contexto da aplicação: os programadores podem definir quotas globais e ao nível da sessão para pedidos, volumes de dados, sessões e conjuntos de entidades. Isto permite controlar a utilização mal formada ou excessiva, o tráfego MCP e os fluxos de trabalho específicos do negócio diretamente dentro da aplicação.
Quotas ao nível do servidor e da sessão
Antes de entrarmos em pormenores: para um controlo mais preciso, a maioria das quotas pode ser definida em dois níveis:
- Nível do servidor: limita a atividade de todo o servidor
- Nível de sessão: aplica-se individualmente a cada sessão recém-criada
Pode recorrer apenas às quotas ao nível do servidor, apenas às quotas ao nível da sessão ou combinar ambas.
Vantagem: as quotas ao nível da sessão colocam todos os utilizadores em pé de igualdade, impedindo que um único utilizador monopolize os recursos do seu servidor web.
O que as quotas podem regular
As quotas permitem-lhe controlar:
- Tráfego de entrada: número de bytes recebidos, número de pedidos aceites
- Tráfego de saída: número de bytes enviados
- Sessões: o número máximo de sessões ativas
- Sessões de convidados: o número máximo de sessões ainda não autenticadas através de setPrivileges().
- Conjuntos de entidades: o número máximo de conjuntos de entidades permitido por predefinição para cada sessão REST recém-criada
O princípio fundamental: assim que uma quota for excedida, o servidor responde com um HTTP 429 – Too Many Requests.
Vantagem: todos os aspetos que poderiam sobrecarregar o seu servidor web estão abrangidos: não apenas os bytes de entrada e saída, mas também as solicitações. Pode limitar as sessões de convidados inativas, bem como o número de sessões de utilizadores simultâneas.
As quotas regulam a utilização do seu servidor web de forma suave, indicando aos utilizadores que o servidor não está em baixo nem avariou, mas sim a fazer o seu trabalho, moderando a carga para se manter fiável e disponível.
Por detrás dos bastidores: dois tipos de quotas
As quotas apresentam-se em duas variantes:
- Quotas de limitação de taxa
- Quotas simultâneas
Quotas de limitação de taxa
Estas abrangem:
- Número de bytes recebidos
- Número de pedidos aceites
- Número de bytes enviados
Baseiam-se num sistema de janelas de tempo, tanto ao nível do minuto como da hora, pelo que pode definir o número máximo de bytes (ou pedidos) que o seu servidor web e/ou as suas sessões podem processar numa janela de um minuto ou de uma hora.
Assim que uma quota for excedida dentro de uma janela de tempo, o servidor devolve um código de erro HTTP 429 até que a janela seguinte se abra.
Estas quotas podem ser configuradas tanto a nível global do servidor como a nível da sessão.
Vantagem: a combinação de janelas de um minuto e de uma hora proporciona-lhe um controlo muito preciso, suavizando os picos minuto a minuto, ao mesmo tempo que se mantém um limite máximo por hora.
Aplique a mesma lógica ao nível da sessão e regulará a atividade de cada utilizador individualmente, impedindo que qualquer um deles consuma toda a sua largura de banda.
Quotas simultâneas
Estas abrangem:
- Número máximo de sessões
- Número máximo de sessões de convidados
- Número máximo de conjuntos de entidades permitidos por predefinição para cada sessão REST recém-criada
Trata-se de contadores absolutos: assim que uma quota é excedida, o servidor devolve um erro HTTP 429 até que o contador diminua. Por exemplo, assim que uma sessão é encerrada, libertando espaço para uma nova.
Vantagem: isto complementa bem as quotas de limitação de taxa, regulando também o número de utilizadores, e não apenas o seu tráfego.
Configurar quotas
O WEB Server objeto expõe uma propriedade `quotas `, um objeto que é, mais precisamente, uma instância da 4D.QuotaManager classe.
Existem três formas de configurar as quotas: escolha a que melhor se adequar à sua arquitetura:
1- Atualize o objeto ` quotas ` em tempo real, assim que o servidor web já estiver a funcionar:
var $quotas : 4D.QuotaManager
$quotas:=WEB Server().quotas
$quotas.inBytesPerMin:=10000000
2- Passe um objeto quotas ao iniciar o servidor web:
var $quotas:={}
$quotas.inBytesPerMin:=20000000
WEB Server().start({quotas: $quotas})
3- Utilize um ficheiro de configuração HTTPQuotas.json, lido automaticamente no arranque:
{
"inBytesPerMin": 10000
}
Vantagem: flexibilidade total. Seja qual for a sua implementação, uma destas opções será adequada.
Um exemplo concreto
var $quotas:={}
// Maximum number of input bytes accepted in a one-minute time window on the web server
$quotas.inBytesPerMin:=20000000
// Maximum number of sent bytes in a one-minute time window in a session
$quotas.outBytesPerMinPerSession:=10000000
// Maximum number of allowed sessions on the web server
$quotas.nbSessions:=50
// Maximum number of not authenticated sessions on the web server
$quotas.nbGuestSessions:=10
// Maximum number of accepted requests in a one-minute time window on the web server
$quotas.nbRequestsPerMin:=500
// Maximum number of accepted requests in a one-hour time window on the web server
$quotas.nbRequestsPerHour:=20000
WEB Server().start({quotas: $quotas})
Eis o que verá no depurador:

Nota:
o nbRequestPerHour não é simplesmente nbRequestPerMin × 60 (o que daria 30 000). Foi deliberadamente definido num valor inferior, em 20 000. Desta forma, mesmo uma carga de trabalho que atinja o limite máximo da quota por minuto durante vários minutos isolados não consegue manter esse ritmo durante quase uma hora, proporcionando-lhe um verdadeiro limite máximo por hora, em vez de apenas uma quota por minuto reformulada.
Enquanto os utilizadores trabalham com a aplicação, sempre que uma quota é excedida, o servidor devolve um erro HTTP 429 – Too Many Requests.
Quando relevante, o cabeçalho de resposta «Retry-After» indica ao cliente exatamente quantos segundos deve esperar antes de tentar novamente:

Experimente você mesmo com o HDI detalhado, explore todos os pormenores na documentação e sinta-se à vontade para partilhar a sua experiência no fórum.
Esqueça a lentidão causada por servidores sobrecarregados. Aproveite hoje mesmo o melhor desempenho do seu servidor web.
De momento, não é possível deixar comentários nesta publicação.