Notas de estudo 1 - Análise de realização de limitação de corrente

No cenário de alta simultaneidade do comércio eletrônico, costumamos usar alguns métodos comuns para lidar com picos de tráfego, como limitação de corrente, fusão e rebaixamento

O que é limitação de corrente? A limitação atual é limitar o número de solicitações simultâneas que chegam ao sistema para garantir que o sistema possa responder normalmente a algumas solicitações do usuário e, para o tráfego que excede o limite, a disponibilidade do sistema geral é garantida pela negação de serviço.

De acordo com o escopo da limitação de corrente, ela pode ser dividida em limitação de corrente autônoma e limitação de corrente distribuída ; de acordo com o método de limitação de corrente, pode ser dividida em contador, janela deslizante, limite de balde com vazamento e limite de corrente de balde de token . explicará isso em detalhes abaixo.

Métodos de limitação de corrente comumente usados

contador

O contador é o algoritmo de limitação de corrente mais simples. Seu princípio é: dentro de um período de tempo, contar as solicitações e compará-las com o limite para determinar se a limitação de corrente é necessária. Uma vez atingido o ponto crítico de tempo, o contador é zerado.

É como se você fosse pegar um carro. Quantos assentos estão estipulados no carro, e você não poderá entrar no carro se estiver cheio. Caso contrário, você ficará sobrecarregado. Se for pego pelo trânsito tio da polícia, você será multado.Se nosso sistema não for uma multa., pode ter entrado em colapso diretamente.

Lógica de execução do programa:

  • Você pode definir uma contagem variável no programa. Quando chegar uma solicitação, adicionarei 1 a esse número e registrarei o tempo da solicitação.
  • Quando chegar a próxima solicitação, julgue se o valor da contagem excede a frequência definida e se o horário da solicitação atual e o horário da primeira solicitação estão dentro de 1 minuto.
  • Se estiver dentro de 1 minuto e exceder a frequência definida, isso prova que há muitas solicitações e as solicitações subsequentes serão rejeitadas.
  • Se o intervalo entre esta solicitação e a primeira solicitação for maior que o período de contagem e o valor da contagem ainda estiver dentro do intervalo de limite atual, a contagem será redefinida.

Mas, para ser honesto, essa contagem se refere a um bloqueio. Em um cenário de alta simultaneidade, esse método pode não ser prático. Sugiro remover o bloqueio e, em seguida, processar a lógica de l.count++ por meio de contagem atômica, para garantir que quando l.count aumenta não será executado por múltiplas threads ao mesmo tempo, ou seja, a limitação de corrente é realizada por meio de contagem atômica.

janela deslizante

A janela deslizante é um defeito de ponto crítico para contadores.A chamada janela deslizante (Sliding window) é uma tecnologia de controle de fluxo, e esta palavra aparece no protocolo TCP. A janela deslizante divide a fatia de tempo fixa e se move com o passar do tempo. Um número fixo de grades que podem ser movidas é contado e o limite é julgado.

Na verdade, o contador é uma janela deslizante, mas há apenas uma grade, portanto, se você quiser tornar o limite atual mais preciso, basta dividir mais grades. Para ser mais preciso, não sabemos como muitas grades devem ser definidas O número afeta a precisão do algoritmo de janela deslizante e ainda existe o conceito de fatias de tempo, que não pode resolver fundamentalmente o problema do ponto crítico.

balde furado

O algoritmo do balde com vazamento (Bucket com vazamento), o princípio é um balde com vazamento de capacidade fixa, que flui para fora das gotas de água a uma taxa fixa.

Todo mundo que já usou a torneira sabe que quando a torneira é aberta e fechada, a água vai escorrer e pingar no balde, e o balde com vazamento refere-se a um vazamento sob o balde que permite que a água escorra. ligado muito grande, a taxa de fluxo de água será muito grande, o que pode causar O balde cheio de água e depois transbordou.

Um balde de capacidade fixa que tem água entrando e saindo. Para a água que flui, não podemos prever quanta água irá fluir, nem podemos prever a velocidade do fluxo de água. Mas para a água que sai, este balde pode fixar a taxa de saída de água (velocidade de processamento), de modo a obter o efeito de modelagem e controle de fluxo.

O algoritmo do balde com vazamento tem as seguintes características:

  • O balde com vazamento tem uma capacidade fixa e a taxa de saída é uma constante fixa (solicitação de saída)
  • Se o balde estiver vazio, nenhuma gota precisa escorrer
  • As gotas podem fluir para o balde a qualquer taxa (solicitações de entrada)
  • Se a gota de entrada exceder a capacidade do balde, a gota de entrada transborda (novas solicitações são rejeitadas)

O balde com vazamento limita a vazão de saída constante (ou seja, a vazão de saída é um valor constante fixo), de modo que a vazão máxima é a vazão de saída de água e não pode ocorrer vazão de estouro.

balde de fichas

O algoritmo token bucket (Token Bucket) é o algoritmo mais comumente usado na modelagem de tráfego de rede (Traffic Shaping) e limitação de taxa (Rate Limiting). Normalmente, o algoritmo token bucket é usado para controlar a quantidade de dados enviados para a rede e para permitir o envio de rajadas de dados.

Temos um balde fixo no qual os tokens são armazenados. O balde está vazio no início e o sistema adiciona tokens ao balde em um tempo fixo (taxa), até que o número de tokens no balde esteja cheio e as solicitações redundantes sejam descartadas. Quando uma solicitação chegar, remova um token do balde, rejeite a solicitação ou bloqueie se o balde estiver vazio.

O token bucket tem as seguintes características:

  • Os tokens são colocados no token bucket a uma taxa fixa
  • Um máximo de B tokens são armazenados no balde. Quando o balde está cheio, os tokens recém-adicionados são descartados ou rejeitados
  • Se houver menos de N tokens no balde, o token não será excluído e a solicitação será limitada (descartada ou bloqueada em espera)

O balde de token limita a taxa média de entrada (pedidos de rajada são permitidos, desde que haja tokens, eles podem ser processados ​​e 3 tokens, 4 tokens são suportados por vez...), e um certo grau de tráfego de rajada é permitido, por isso também é um algoritmo de limitação de corrente muito comumente usado.

Limitação de corrente distribuída Redis + Lua

A versão autônoma da limitação de corrente pode proteger apenas seu próprio nó, mas não pode proteger vários serviços dos quais os aplicativos dependem e não pode controlar com precisão o limite de solicitação de todo o serviço ao expandir ou reduzir os nós.

A limitação de corrente distribuída, tomando o cluster como a dimensão, pode controlar facilmente o limite de solicitação desse cluster, protegendo assim vários recursos de serviço dos quais o downstream depende.

A coisa mais importante sobre a limitação de corrente distribuída é tornar o serviço de limitação de corrente atômico . Podemos usar os contadores Redis e a atomicidade da execução Lua para executar a limitação de corrente distribuída.

Também podemos limitar o fluxo de containers, como Tomcat, Nginx e outros meios de limitação de fluxo.

O Tomcat pode definir o número máximo de threads (maxThreads). Quando a simultaneidade exceder o número máximo de threads, ele entrará na fila para execução; enquanto o Nginx fornece dois métodos de limitação de corrente: um é controlar a taxa e o outro é controlar o número de conexões simultâneas.

No atual cenário de limitação atual, também podemos controlar o número de solicitações enviadas por um único IP, cidade, canal, id de dispositivo, id de usuário, etc. dentro de um determinado período de tempo; se for uma plataforma aberta, um acesso independente regra de taxa precisa ser definida para cada appkey.

Comparação de limite atual

Abaixo iremos resumir as vantagens e desvantagens das estratégias de thread comumente usadas para seleção futura.

contador:

  • Vantagens: contagem de período fixo, implementação simples, aplicável a cenários menos precisos;
  • Desvantagens: O limite não é bem tratado, resultando na incapacidade de controlar com precisão o limite de corrente.

janela deslizante:

  • Vantagens: divide o período de tempo fixo em blocos, o tempo é mais complicado que o "contador", adequado para cenários um pouco mais precisos;
  • Desvantagens: A implementação é um pouco complicada e ainda não consegue resolver completamente o problema de limite do "contador".

Balde furado:

  • Vantagens: pode controlar muito bem a frequência de consumo;
  • Desvantagens: A implementação é um pouco complicada e você não pode consumir mais por unidade de tempo e parece inflexível.

Balde de tokens:

  • Vantagens: Pode resolver o problema de que o "balde furado" não pode ser consumido de forma flexível, e pode evitar o consumo excessivo.É fortemente recomendado;
  • Desvantagens: A implementação é um pouco complicada e outras deficiências não foram pensadas.

Limitação de corrente distribuída Redis + Lua:

  • Vantagens: suporta a limitação de corrente distribuída, protege eficazmente os recursos de serviço dependentes a jusante;
  • Desvantagens: Baseando-se no Redis, o limite não é bem tratado, resultando na incapacidade de controlar com precisão o limite atual.

Link original: https://juejin.cn/post/7145435951899574302

おすすめ

転載: blog.csdn.net/weixin_45889893/article/details/128667935