Projeto arquitetônico e prática de sistema de mensagens em tempo real com dezenas de milhões de conexões na Estação B

Este artigo foi compartilhado por Huang Shancheng, engenheiro de desenvolvimento sênior da Bilibili. O título original era "Dez Milhares de Sistemas de Mensagens de Longo Prazo".

1. Introdução

Na era atual do entretenimento digital, as barragens tornaram-se um dos elementos interativos indispensáveis ​​nas plataformas de transmissão ao vivo.

Ao enviar barragens, enviar presentes, etc., os usuários podem mostrar suas ideias, comentários e conteúdos interativos na tela de transmissão ao vivo em tempo real, enriquecendo assim a experiência de visualização do usuário. Neste processo, enviar informações interativas para o terminal em tempo real requer o uso de conexões longas.

Uma conexão longa, como o nome sugere, é um canal de dados de rede mantido com o servidor durante a vida útil do aplicativo e pode suportar transmissão de dados full-duplex uplink e downlink. A maior diferença entre ele e o serviço de conexão curta no modo de resposta de solicitação é que ele pode fornecer ao servidor a capacidade de enviar dados ativamente aos usuários em tempo real.

Este artigo apresentará o projeto arquitetônico e a prática de dezenas de milhões de sistemas de mensagens em tempo real de conexão longa implementados por Bilibili com base em golang, incluindo o design da estrutura do serviço de conexão longa, bem como otimizações relacionadas para estabilidade e alta Taxa de transferência.

 

2. Artigos relacionados

3. Projeto de arquitetura

3.1 Visão geral

O serviço de conexão longa é uma conexão longa compartilhada por várias partes comerciais.

Porque ao projetar, é necessário levar em consideração as demandas de diferentes partes comerciais e diferentes cenários de negócios para serviços de conexão de longo prazo. Ao mesmo tempo, os limites dos serviços de conexão de longo prazo também devem ser considerados para evitar intervenções nos negócios. lógica e afetando a iteração e o desenvolvimento subsequentes de serviços de conexão de longo prazo.

Os serviços de conexão longa são divididos principalmente em três aspectos:

  • 1) Estabelecimento, manutenção e gestão de ligações longas;
  • 2) Envio de dados de downlink;
  • 3) Encaminhamento de dados de uplink (atualmente apenas pulsação, sem requisitos reais de cenário de negócios).

3.2 Arquitetura geral

A estrutura geral do serviço de conexão longa é mostrada na figura acima. O serviço geral inclui as seguintes partes.

1) Camada de controle: pré-chamada para estabelecimento de conexão, principalmente para verificação de legalidade de acesso, verificação de identidade e controle de roteamento.

dever principal:

  • 1) Autenticação da identidade do usuário;
  • 2) Criptografar dados de montagem e gerar token legal;
  • 3) Agendamento dinâmico e alocação de nós de acesso.

2) Camada de acesso: serviço central de conexão longa, responsável principalmente pela desinstalação de certificados, acoplamento de protocolo e manutenção de conexão longa.

dever principal:

  • 1) Desinstale certificados e protocolos;
  • 2) Responsável por estabelecer e manter conexões com clientes, e gerenciar o relacionamento de mapeamento entre connection id e roomid;
  • 3) Processar mensagens de uplink e downlink.

3) Camada lógica: Camada de acesso simplificado, principalmente para funções de negócios de conexão de longo prazo.

dever principal:

  • 1) Registros de relatórios de números on-line;
  • 2) Registre o relacionamento de mapeamento entre cada atributo do ID de conexão e cada nó.
  • 4) Camada de distribuição de mensagens: as mensagens são enviadas para a camada de acesso.

dever principal:

  • 1) O encapsulamento, compactação e agregação de mensagens são enviados para os nós de borda correspondentes;

5) Camada de serviço: Camada de acoplamento de serviço de negócios, fornecendo uma entrada para envio de mensagens downstream.

dever principal:

  • 1) Gerenciar e controlar permissões de push de negócios;
  • 2) Detecção e remontagem de mensagens;
  • 3) O fluxo de mensagens é limitado de acordo com certas políticas para proteger seu próprio sistema.

3.3 Processo central

Conexões longas consistem principalmente em três processos principais:

  • 1) Estabelecendo uma conexão : iniciada pelo cliente, primeiro através da camada de controle para obter o token legal e a configuração do ponto de acesso do dispositivo;
  • 2) Manter a conexão : principalmente o cliente inicia batimentos cardíacos regularmente para garantir que a conexão longa esteja ativa;
  • 3) Downlink push : O downlink push é iniciado pelo servidor de negócios. A camada de serviço determina o identificador de conexão e o nó de acesso de acordo com o identificador relevante. Através da camada de distribuição de mensagens, o push é enviado para a camada de acesso correspondente, gravado no designado. conexão e depois distribuído ao cliente.

3.4 Lista de funções

Combinado com o cenário de negócios da estação B, o envio de dados de downlink fornece as seguintes funções gerais:

  • 1) Mensagens no nível do usuário: designadas para serem enviadas a determinados usuários (como o envio de mensagens PK de convite para uma determinada âncora);
  • 2) Mensagens no nível do dispositivo: desenvolver e enviar para determinados dispositivos (por exemplo, enviar instruções de relatório de log do cliente para dispositivos não registrados);
  • 3) Mensagens no nível da sala: envie mensagens para as conexões em uma determinada sala (como enviar mensagens de barragem para todos os usuários online na sala de transmissão ao vivo);
  • 4) Mensagens de partição: enviar mensagens para salas em uma determinada partição (por exemplo, enviar uma determinada atividade de receita para todas as salas que são transmitidas em uma determinada partição);
  • 5) Notícias em todo o distrito: mensagens push para todos os usuários da plataforma (como notificações push de eventos para todos os usuários online).

4. Projeto de tecnologia de alto rendimento

À medida que o negócio se desenvolve e se expande, há cada vez mais utilizadores online e a pressão sobre o sistema de ligação a longo prazo aumenta, especialmente a transmissão ao vivo de eventos populares. Por exemplo, durante os S-Games, o número de pessoas online. em toda a plataforma atingiu dezenas de milhões, e a taxa de transferência de mensagens atingiu centenas de milhões. O atraso médio na distribuição de mensagens do sistema Changlian é de cerca de 1 segundo, e a taxa de chegada de mensagens chega a 99%. medidas que Changlian tomou.

4.1 Protocolo de rede

Escolher o protocolo de rede correto é fundamental para o desempenho de um sistema de conexão longa:

  • 1) Protocolo TCP : pode fornecer conexão confiável e transmissão de dados e é adequado para cenários que exigem alta confiabilidade de dados;
  • 2) Protocolo UDP : É um protocolo não confiável, mas possui alta eficiência de transmissão e é adequado para cenários que não exigem alta confiabilidade de dados;
  • 3) Protocolo WebSocket : Ele também realiza comunicação bidirecional sem adicionar muita sobrecarga e é mais usado no lado da web.

A camada de acesso é dividida em módulo de protocolo e módulo de conexão:

  • 1) Módulo de protocolo : interage com protocolos específicos da camada de comunicação e encapsula a interface e as diferenças lógicas de diferentes protocolos de comunicação.
  • 2) Módulo de conexão : mantém o status das conexões comerciais de conexão de longo prazo, suporta solicitação de uplink, downlink e outras lógicas de negócios, mantém os atributos da conexão e o relacionamento de ligação com o ID da sala.

Em relação ao  ponto 1) acima , o módulo de protocolo também fornece uma interface de dados unificada para o módulo de conexão, incluindo estabelecimento de conexão, leitura de dados, gravação, etc. Se novos protocolos forem adicionados no futuro, desde que a adaptação seja feita no módulo de protocolo, isso não afetará a lógica de negócios de longo prazo dos outros módulos.

Vantagem de:

  • 1) A lógica de negócios e os protocolos de comunicação são isolados para facilitar a adição iterativa de protocolos de comunicação e simplificar a dificuldade de implementação de compatibilidade com múltiplos protocolos de comunicação;
  • 2) A camada de controle pode emitir melhores protocolos de comunicação com base na situação real do cliente.

4.2 Balanceamento de carga

A tecnologia de balanceamento de carga pode ser usada para distribuir solicitações para diferentes nós do servidor para processamento, evitando carga excessiva em um único nó e melhorando a escalabilidade e estabilidade do sistema.

A conexão de longo prazo adiciona uma camada de controle para balanceamento de carga. A camada de controle fornece uma interface de conexão curta http e seleciona dinamicamente o nó de acesso apropriado com base na situação real do cliente e de cada nó de borda e no princípio da proximidade.

A camada de acesso suporta expansão horizontal e a camada de controle pode adicionar e reduzir nós de alocação em tempo real. Durante o jogo S, quando o número de pessoas online se aproximava de dezenas de milhões, cada nó de acesso era balanceado e programado para garantir que a CPU e a memória de cada nó estivessem dentro de uma faixa estável.

4.3 Fila de mensagens

O link push da mensagem é: a empresa envia o push, envia-o para o nó de borda através da camada de serviço e depois o entrega ao cliente.

A camada de serviço distribui para cada nó de borda em tempo real. Se for uma mensagem do tipo sala, ela precisa ser enviada para vários nós de borda. A camada de serviço também processa a lógica de negócios, o que afeta muito o rendimento da mensagem.

Portanto, a fila de mensagens e a camada de distribuição de mensagens são adicionadas. A camada de distribuição de mensagens mantém as informações de cada nó de borda e envia mensagens, o que melhora a capacidade de processamento simultâneo e a estabilidade do sistema e evita problemas de desempenho causados ​​​​pelo bloqueio de envio de mensagens.

4.4 Agregação de mensagens

Quando há um evento popular, o número de pessoas online ao mesmo tempo pode chegar a dezenas de milhões, e uma barragem de mensagens será espalhada por dezenas de milhões de terminais. Se todos online enviarem uma mensagem a cada segundo, a quantidade de mensagens será maior. precisa ser enviado é 1kw * 1kw, que é uma quantidade muito grande de mensagens, neste momento, a camada de distribuição de mensagens e a camada de acesso estarão sob grande pressão.

A análise constatou que essas mensagens são todas da mesma sala e pertencem a salas quentes, como a sala de jogos S. O número de telespectadores não pode ser reduzido, por isso só podemos nos preocupar com o número de mensagens. O envio de mensagens comerciais não pode ser reduzido e o número de mensagens difundidas deve ser reduzido, por isso foi pensada a agregação de mensagens.

Para mensagens de sala, a agregação de mensagens é realizada de acordo com certas regras e enviada em lotes:

Depois que a agregação de mensagens fica online, o QPS chamado pela camada de distribuição de mensagens para a camada de acesso é reduzido em cerca de 60%, o que reduz bastante a pressão sobre a camada de acesso e a camada de distribuição de mensagens.

4.5 Algoritmo de compressão

Após a agregação da mensagem, o número de mensagens é reduzido, mas o tamanho do corpo da mensagem é aumentado, o que afeta a E/S de gravação. Se o tamanho do corpo da mensagem precisar ser reduzido, considera-se a compactação da mensagem.

Para algoritmos de compressão, selecionamos dois comumente usados ​​no mercado: zlib e brotli para comparação.

Capturamos os dados enviados pelo negócio online, selecionamos o nível de compactação mais alto e passamos na verificação de compactação:

Pode-se observar que o brotli tem grandes vantagens sobre o zlib, e o algoritmo de compactação do brotli foi finalmente escolhido.

Escolha executar a compactação de mensagens na camada de distribuição de mensagens para evitar compactação repetida em cada nó de acesso e desperdício de desempenho. Depois de ficar online, não só melhora o rendimento, mas também reduz os custos de uso da banda larga.

5. Projeto de tecnologia de garantia de serviço

Hoje em dia, algumas empresas dependem fortemente de mensagens push de longo prazo. A perda de mensagens afetará, na melhor das hipóteses, a experiência do usuário e, na pior das hipóteses, bloqueará os processos de negócios subsequentes, afetando assim o fluxo de negócios. Para garantir a garantia da mensagem de serviço a longo prazo, foi realizado o seguinte trabalho.

5.1 Implantação multiativa

A implantação multiativa, ao implantar a mesma arquitetura de sistema e serviços em diferentes localizações geográficas, consegue um rápido failover do sistema no caso de uma única falha geográfica, melhorando assim a estabilidade e a disponibilidade do sistema.

A implantação de serviços de longo prazo envolve principalmente os seguintes pontos:

  • 1) LongConnect implantou pontos de acesso no Leste da China, Sul da China e Norte da China, apoiando os três principais operadores, os pontos de acesso também foram implantados em salas de computadores autoconstruídas no Sul da China e na China Central para apoiar usuários estrangeiros, acesso independente; para salas de informática de Cingapura foi adicionado um ponto;
  • 2) Para diferentes cenários de negócios, alterne entre nós de nuvem e nós autoconstruídos em tempo real. Como os custos dos nós de nuvem e das salas de computadores autoconstruídas são diferentes, os custos devem ser controlados tanto quanto possível, garantindo ao mesmo tempo a qualidade do serviço.

Durante a operação on-line atual, ocasionalmente são encontrados tremores de rede de nós únicos ou salas de computadores. Através da camada de controle, nós problemáticos são removidos em segundos, o que reduz bastante o impacto nos negócios.

5.2 Canais de mensagens altos e baixos

Mensagens multiserviço acessam conexões longas, mas a importância de mensagens diferentes é diferente, como mensagens de barragem e mensagens de convite. A perda de algumas mensagens de barragem não terá um grande impacto na experiência do usuário, mas se a mensagem de convite for perdida. , isso fará com que o negócio pk não consiga prosseguir com os processos subsequentes.

Para diferentes níveis de mensagens, são usados ​​canais de mensagens de alta e baixa qualidade. As notícias importantes vão para o canal de alta qualidade e as notícias comuns vão para o canal de baixa qualidade. Dessa forma, mensagens importantes e comuns são fisicamente separadas e a distribuição de mensagens prioriza mensagens importantes.

Para canais de alta qualidade, a entrega dupla é garantida e a desduplicação idempotente é realizada na camada de acesso. Em primeiro lugar, as mensagens importantes são para o nível do usuário, e o volume não será muito grande, portanto a pressão na camada de acesso não aumentará muito. Além disso, os trabalhos de entrega dupla são implantados em diversas salas de computadores, o que reduz o impacto da instabilidade da rede em uma única sala de computadores.

Depois que os canais de alta e baixa qualidade ficaram online, encontramos nervosismo de saída da intranet. Naquele momento, os nós de trabalho afiliados à intranet enviavam mensagens de forma anormal, mas os nós de trabalho de alta qualidade na nuvem podiam enviar mensagens normalmente, o que. garantiu a chegada de mensagens de alta qualidade e, assim, garantiu que os serviços de alta qualidade não serão afetados.

5.3 Funções Gundam

O canal de otimização alto-baixo resolve o link do trabalho para a camada de acesso, mas a conexão push de mensagem envolve vários links, como a camada de serviço para o trabalho e a camada de acesso para o cliente.

Para todo o enlace, a taxa de chegada do terminal é garantida pela implementação do mecanismo must-reach, denominado função de alcance.

Implementação da função:

  • 1) Cada mensagem apresenta msgID e o cliente realiza desduplicação idempotente e confirmação de recebimento após receber a mensagem;
  • 2) O servidor realiza a detecção de confirmação no msgid, e se não houver confirmação, o servidor tentará novamente a entrega dentro do período de validade.

Taxa de chegada final = (1-(1-r)^(n+1)), onde: r é a taxa de chegada única da transmissão e n é o número máximo de novas tentativas.

Por exemplo: r = 97%, n=2, então a taxa de chegada final pode atingir (1-(1-0,97)^(2+1)) = 99,9973%

6. Projeto de garantia de entrega para mensagens que entram e saem da "sala"

Alguns cenários de negócios exigem o uso de informações de entrada e saída do usuário. Por exemplo, quando o usuário A entra na sala de transmissão ao vivo, a página exibirá uma mensagem convidando o usuário A a entrar na sala ou ingressar na lista online.

1) As informações de entrada na sala serão perdidas e é necessário um mecanismo de compensação. Achei que a mensagem de entrada na sala poderia ser compensada conectando-se à pulsação, mas a pulsação é contínua. Durante o período de conexão on-line, a empresa espera receber a mensagem de entrada na sala apenas uma vez, portanto, a mensagem de entrada na sala precisa ter um idempotente. mecanismo.

2) As informações de check-out do quarto também serão perdidas. Em caso de perda, a empresa não poderá remover usuários da lista online. Um mecanismo de compensação também é necessário neste momento. Neste momento, você precisa adicionar uma máquina de estado para a conexão e manter a máquina de estado por meio de pulsações. Quando a pulsação é perdida, a conexão é considerada desconectada e o usuário faz check-out.

7. Planejamento futuro

Após várias iterações do serviço unificado de conexão longa, as funções básicas tornaram-se estáveis ​​e o serviço de conexão longa será melhorado e otimizado no futuro.

Concentre-se principalmente nas seguintes direções:

  • 1) Dataização : melhorar ainda mais a capacidade de coletar estatísticas de dados de qualidade de rede de link completo de conexão longa e rastreamento de link completo de mensagens de alto valor;
  • 2) Inteligência : O estabelecimento de conexão no dispositivo, a seleção do ponto de acesso, etc. podem ser ajustados automaticamente de acordo com o ambiente real;
  • 3) Otimização de desempenho : No módulo de conexão da camada de acesso, os Ctrips que processam mensagens de uplink e downlink são compartilhados, reduzindo o número de Ctrips na camada de acesso e melhorando ainda mais o desempenho de uma única máquina e o número de conexões;
  • 4) Expansão de função : Adicionada função de mensagens offline, etc.

8. Materiais de referência

[1]  Ensina passo a passo como escrever uma conexão Socket longa baseada em TCP

[2]  Compreender corretamente os mecanismos de conexão longa, pulsação e reconexão de mensagens instantâneas e implementá-los na prática

[3]  Artigo longo de 10.000 palavras: Ensina passo a passo como implementar um mecanismo eficiente de manutenção de atividade de pulsação adaptativa de conexão longa de mensagens instantâneas

[4]  Use a tecnologia JWT para resolver os problemas de autenticação de identidade da conexão longa do soquete do sistema IM

[5]  Explicação detalhada de TCP/IP  -  Capítulo 11·UDP: Protocolo de datagrama de usuário

[6]  Explicação detalhada de TCP/IP  -  Capítulo 17·TCP: Protocolo de Controle de Transmissão

[7]  Do iniciante ao proficiente em WebSocket, meia hora é o suficiente!

[8]  Um artigo é suficiente para entender rapidamente o protocolo TCP

[9]  Entenda rapidamente as diferenças entre TCP e UDP

[10]  Com apenas um xixi, você pode entender rapidamente a diferença entre TCP e UDP

[11]  O que exatamente é Socket? Entenda em um artigo!

[12]  Quando lemos e escrevemos Socket, o que exatamente estamos lendo e escrevendo?

[13]  Se você projetasse o protocolo TCP, o que faria?

[14]  Aprofunde-se no sistema operacional e entenda o que é Socket em um artigo

[15]  É fácil entender como os servidores de alto desempenho são implementados.

[16]  Iluminação trazida pela captura de ingressos 12306: veja como eu uso Go para implementar um sistema de venda flash de um milhão de QPS (incluindo código-fonte)

 Intercâmbio de tecnologia:

- Um artigo introdutório ao desenvolvimento de mensagens instantâneas móveis: " Um artigo é suficiente para iniciantes: Desenvolvendo mensagens instantâneas móveis do zero "

- Código-fonte da estrutura IM de código aberto: https://github.com/JackJiang2011/MobileIMSDK ( Endereço alternativo, clique aqui )

(Este artigo foi publicado simultaneamente em: http://www.52im.net/thread-4647-1-1.html )

A equipe de IA da Microsoft na China fez as malas e foi para os Estados Unidos, envolvendo centenas de pessoas. Quanta receita um projeto de código aberto desconhecido pode trazer? A Huawei anunciou oficialmente que a posição da Universidade de Ciência e Tecnologia de Yu Chengdong foi ajustada. abriu oficialmente o acesso à rede externa Os fraudadores usaram o TeamViewer para transferir 3,98 milhões! O que os fornecedores de desktop remoto devem fazer? A primeira biblioteca de visualização front-end e fundador do conhecido projeto de código aberto ECharts do Baidu - um ex-funcionário de uma conhecida empresa de código aberto que "foi para o mar" deu a notícia: Depois de ser desafiado por seus subordinados, o técnico O líder ficou furioso e rude e demitiu a funcionária grávida. A OpenAI considerou permitir que a IA gerasse conteúdo pornográfico. A Microsoft relatou à The Rust Foundation doou 1 milhão de dólares americanos. ?
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/jb2011/blog/11139830
Recomendado
Clasificación