Explicação detalhada da "alta simultaneidade" da arquitetura da Internet

1. O que é alta simultaneidade?

Alta simultaneidade (alta simultaneidade) é um dos fatores que devem ser considerados no projeto da arquitetura de sistema distribuído da Internet. Geralmente se refere a garantir que o sistema possa processar muitas solicitações em paralelo ao mesmo tempo por meio do projeto.


Alguns indicadores comumente usados ​​relacionados à alta simultaneidade incluem tempo de resposta (Response Time), taxa de transferência (Throughput), taxa de consulta por segundo (QPS) (Query Per Second), número de usuários simultâneos, etc.
 

Tempo de resposta : O tempo que o sistema leva para responder a uma solicitação. Por exemplo, o sistema leva 200 ms para processar uma solicitação HTTP. Esses 200 ms são o tempo de resposta do sistema.

Taxa de transferência : o número de solicitações processadas por unidade de tempo.

QPS : Número de solicitações de resposta por segundo. No campo da Internet, a diferença entre este indicador e o rendimento não é tão óbvia.

Número de usuários simultâneos : O número de usuários que estão usando o sistema normalmente ao mesmo tempo. Por exemplo, num sistema de mensagens instantâneas, o número de utilizadores online simultâneos representa, até certo ponto, o número de utilizadores simultâneos do sistema.

2. Como melhorar a capacidade de simultaneidade do sistema

Existem duas metodologias principais para o projeto de arquitetura distribuída da Internet e maneiras de melhorar a simultaneidade do sistema: expansão vertical (Scale Up) e expansão horizontal (Scale Out).

Expansão vertical : Melhore a capacidade de processamento de uma única máquina. Existem duas maneiras de expandir verticalmente:

(1) Melhorar o desempenho do hardware independente, por exemplo: aumentar o número de núcleos de CPU, como 32 núcleos, atualizar para uma placa de rede melhor, como 10G, atualizar para um disco rígido melhor, como SSD, expandir a capacidade do disco rígido, como 2T e expanda a memória do sistema, como 128G;

(2) Melhorar o desempenho da arquitetura de máquina única, por exemplo: usar cache para reduzir o número de IOs, usar assíncrono para aumentar a taxa de transferência de serviço único e usar estruturas de dados sem bloqueio para reduzir o tempo de resposta;


Nos primeiros dias, quando o negócio da Internet se desenvolvia muito rapidamente, se o orçamento não fosse um problema, era fortemente recomendado usar o método de "melhorar o desempenho do hardware independente" para melhorar as capacidades de simultaneidade do sistema, porque nesta fase, a empresa A estratégia muitas vezes era desenvolver negócios para aproveitar o tempo e "melhorar o desempenho do hardware independente" - muitas vezes é o caminho mais rápido.

Seja melhorando o desempenho do hardware independente ou melhorando o desempenho da arquitetura autônoma, há uma deficiência fatal: sempre há um limite para o desempenho independente. Portanto, a solução definitiva para projetar alta simultaneidade na arquitetura distribuída da Internet é a expansão horizontal.

Expansão horizontal : À medida que o número de servidores aumenta, o desempenho do sistema pode ser expandido linearmente. A expansão horizontal tem requisitos para o projeto da arquitetura do sistema. Como realizar o projeto de expansão horizontal em cada camada da arquitetura, bem como as práticas comuns de expansão horizontal em cada camada da arquitetura da empresa de Internet, são o foco deste artigo.
 

3. Arquitetura comum em camadas da Internet


 As arquiteturas comuns distribuídas pela Internet são como acima, divididas em:

(1) Camada do cliente : O chamador típico é um navegador ou aplicativo móvel APP

(2) Camada de proxy reverso : entrada do sistema, proxy reverso

(3) Camada de aplicativo do site : implemente a lógica principal do aplicativo e retorne html ou json

(4) Camada de serviço : Se a servitização for realizada, haverá esta camada

(5) Camada de cache de dados : o cache acelera o acesso ao armazenamento

(6) Camada de banco de dados : armazenamento de dados solidificados em banco de dados

Como são implementadas as expansões horizontais em cada nível de todo o sistema?

4. Prática de arquitetura de expansão horizontal em camadas

1. Expansão horizontal da camada de proxy reverso  

A expansão horizontal da camada de proxy reverso é obtida através de "polling DNS": o servidor dns é configurado com vários IPs de resolução para um nome de domínio. Cada vez que uma solicitação de resolução DNS é feita para acessar o servidor dns, esses IPs serão pesquisados ​​e devolvida.

Quando o nginx se tornar um gargalo, basta aumentar o número de servidores, implantar novos serviços nginx e adicionar um IP de rede externo para expandir o desempenho da camada de proxy reverso e alcançar alta simultaneidade teoricamente infinita.

2. Expansão horizontal da camada do site 

A expansão horizontal da camada do site é obtida através do "nginx". Ao modificar o nginx.conf, vários back-ends da web podem ser configurados.

Quando o back-end da web se torna um gargalo, basta aumentar o número de servidores, implantar novos serviços da web e configurar um novo back-end da web na configuração do nginx para expandir o desempenho da camada do site e alcançar alta simultaneidade teoricamente infinita.

3. Expansão horizontal da camada do site

A expansão horizontal da camada de serviço é alcançada através do “pool de conexões de serviço”.

Quando a camada de site chama o servidor RPC da camada de serviço downstream por meio do cliente RPC, o pool de conexões no cliente RPC estabelecerá múltiplas conexões com o serviço downstream. Quando o serviço se tornar um gargalo, basta aumentar o número de servidores e adicionar um novo serviço Estabelecer uma nova conexão de serviço downstream no cliente RPC pode expandir o desempenho da camada de serviço e alcançar alta simultaneidade teoricamente infinita. Se você precisar expandir automaticamente a camada de serviço de maneira elegante, talvez seja necessário oferecer suporte à função de descoberta automática de serviço no centro de configuração.

4. Expansão horizontal da camada de dados

Quando a quantidade de dados é grande, a camada de dados (cache, banco de dados) envolve a expansão horizontal dos dados, dividindo horizontalmente os dados (cache, banco de dados) originalmente armazenados em um servidor em servidores diferentes para expandir o desempenho do sistema.

Existem vários métodos comuns de divisão horizontal na camada de dados da Internet. Tomemos o banco de dados como exemplo:

5. Divida horizontalmente de acordo com o alcance

 

Cada serviço de dados armazena um determinado intervalo de dados, conforme mostrado na figura acima:

biblioteca user0, intervalo de uid de armazenamento 1-1kw

biblioteca user1, faixa de uid de armazenamento 1kw-2kw

Os benefícios desta solução são:

(1) As regras são simples e o serviço só precisa determinar o intervalo do UID para rotear para o serviço de armazenamento correspondente;

(2) Os dados estão bem equilibrados;

(3) É relativamente fácil de expandir e você pode adicionar um serviço de dados com uid [2kw, 3kw] a qualquer momento;

As deficiências são:

(1) A carga de pedidos não é necessariamente equilibrada.De um modo geral, os utilizadores recém-registados serão mais activos do que os utilizadores antigos, e a pressão sobre os pedidos de serviços de grande alcance será maior;


6. Divida de acordo com o nível de hash

 

Cada banco de dados armazena parte dos dados com hash por um determinado valor de chave. A figura acima é um exemplo:

biblioteca user0, armazena até dados uid

biblioteca user1, armazena dados uid estranhos

Os benefícios desta solução são:

(1) As regras são simples, o serviço só precisa fazer o hash do uid para rotear para o serviço de armazenamento correspondente;

(2) Os dados estão bem equilibrados;

(3) É necessária melhor uniformidade;

As deficiências são:

(1) Não é fácil expandir. Ao expandir um serviço de dados e o método hash mudar, a migração de dados pode ser necessária;

O que precisa ser observado aqui é que expandir o desempenho do sistema por meio da divisão horizontal é fundamentalmente diferente de expandir o desempenho do banco de dados separando a leitura e a gravação síncronas mestre-escravo.

Dimensione o desempenho do banco de dados com divisões horizontais:

(1) A quantidade de dados armazenados em cada servidor é 1/n da quantidade total, portanto o desempenho de uma única máquina também será melhorado;

(2) Os dados em n servidores não têm intersecção e a união dos dados nesse servidor é o conjunto completo de dados;

(3) Os dados são divididos horizontalmente em n servidores. Em teoria, o desempenho de leitura é expandido em n vezes, e o desempenho de gravação também é expandido em n vezes (na verdade, é muito mais do que n vezes, porque o volume de dados de uma única máquina passa a ser 1/n do original);

Expanda o desempenho do banco de dados por meio da separação de leitura e gravação da sincronização mestre-escravo:

(1) A quantidade de dados armazenados em cada servidor é igual à quantidade total;

(2) Os dados em n servidores são todos iguais e são todos conjuntos completos;

(3) Teoricamente, o desempenho da leitura é ampliado n vezes, a escrita ainda é um ponto único e o desempenho da escrita permanece inalterado;


A divisão horizontal da camada de cache é semelhante à divisão horizontal da camada de banco de dados, a maioria delas são divisão de intervalo e divisão de hash, que não serão expandidas.

Acho que você gosta

Origin blog.csdn.net/m0_68949064/article/details/128905584
Recomendado
Clasificación