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.