Conteúdo[Esconder][Mostrar]
O WhatsApp é um programa de mensagens sociais que permite aos usuários trocar mensagens entre si.
Você já parou para pensar em como o WhatsApp funciona?
Quais são os conceitos que fundamentam a sua criação e funcionamento?
Este artigo abordará os conceitos básicos do WhatsApp projeto de sistema.
Também passaremos pela arquitetura geral do WhatsApp, que pode ser usada para construir qualquer tipo de software de bate-papo.
Então, sem mais delongas, vamos dar uma olhada no design do sistema do WhatsApp!
1. Principais Requisitos
O WhatsApp é uma tecnologia altamente escalável que é usada por muitas pessoas em todo o mundo. Como resultado, ele deve ser bem projetado para ser praticamente sempre confiável e funcional.
Como resultado, determinar as necessidades críticas do sistema é fundamental.
Estes são os requisitos mínimos para o mensageiro do WhatsApp:
- Capaz de facilitar interações individuais.
- A confirmação da mensagem e a última visualização são possíveis (enviada, entregue e lida).
- Permitir criptografia de ponta a ponta e suporte de mídia (imagens/vídeos).
Vamos descobrir quanta capacidade nosso serviço necessário requer.
2. Estimativa de Capacidade
Nosso objetivo é criar uma plataforma capaz de lidar com uma grande quantidade de tráfego. Suponha que 10 bilhões de SMS sejam enviados por dia. Temos:
- Todos os dias, 10 bilhões de SMS são enviados por um bilhão de pessoas.
- No pico de tráfego (por segundo), 700,000 pessoas estavam ativas (média de 6X)
- Durante o pico de uso, 40 milhões de mensagens são transmitidas por segundo.
- O comprimento médio de uma mensagem é de 160 caracteres: 10B * 160 = 1.6TB de dados são gerados todos os dias.
- Tome dez anos de serviço como exemplo: 10 * 1.6B * 365 PB
- Todo o aplicativo será composto de microsserviços, cada um dos quais executará uma tarefa especializada. Suponha que o envio de uma mensagem leve 20 milissegundos e que haja 100 conexões simultâneas por servidor. Como resultado, o número previsto de servidores de bate-papo necessários = (mensagens de bate-papo por segundo Latência)/ conexões simultâneas por servidor = 40M * 20ms / 100 = 8000 servidores.
3. Arquitetura de alto nível
Este sistema é construído em dois serviços principais. Serviço de chat e serviço transitório, por exemplo. O serviço de chat lida com todo o tráfego gerado pelas mensagens online dos usuários. Simultaneamente, o serviço temporário trata o tráfego quando o usuário está offline.
Se o usuário estiver online, o serviço de chat se encarrega de entregar as mensagens.
Ele verificará se o destinatário da mensagem está online ou não; se o destinatário estiver online, este serviço entregará a mensagem imediatamente; se o destinatário não estiver online, o serviço transitório enviará a mensagem para ele quando ele retornar online.
O serviço transitório mantém uma área de armazenamento separada para manter os dados temporariamente acessíveis até que o usuário offline se reconecte.
Projetando APIs de alto nível
Este serviço possui duas APIs de alto nível de funcionamento para envio e leitura de mensagens. O sistema pode ser implementado usando a arquitetura REST.
Parâmetros para envio de mensagens
Esta API será usada para transmitir mensagens entre dois usuários.
Parâmetros de conversa
Esta API é usada para exibir chats encadeados. Considere isso a primeira coisa que você vê quando abre o WhatsApp. Gostaríamos de receber apenas algumas mensagens para um usuário em uma única consulta de API. Para lidar com isso, são necessários os parâmetros de deslocamento e contagem de mensagens.
Quais são as funções de recursos como visto pela última vez, marca única e marca dupla?
O papel importante na implantação desses serviços é o serviço de reconhecimento. Estas funcionalidades foram desenvolvidas uma vez que este serviço continua a gerar e verificar respostas de confirmação.
- Carrapato único: Quando uma mensagem do usuário A chega ao usuário B, o servidor envia um único tique confirmando que a mensagem foi transmitida.
- Marque duas vezes: Após a mensagem do servidor ter sido enviada ao Usuário B através da conexão apropriada, o Usuário B confirmará o recebimento da mensagem ao servidor. O servidor então fornecerá ao Usuário A outra confirmação. Como resultado, uma marca duplicada aparecerá.
- Carrapato azul: O usuário B enviará outra confirmação ao servidor após verificar a mensagem. O servidor então enviará ao usuário A uma mensagem de confirmação adicional. Uma marca azul aparecerá na tela do usuário A depois disso.
- Visto pela última vez: O mecanismo de pulsação é inteiramente responsável pelo último recurso visto. A cada 5 segundos, uma pulsação é transmitida ao servidor, que acompanha o último status visto de cada usuário em uma tabela que pode ser facilmente acessada por qualquer outro usuário.
4. Projetando os principais recursos
Interação personalizada
Esta é uma parte necessária do serviço de Chat. Um usuário pode simplesmente enviar mensagens para outro usuário usando este serviço. Vamos dar uma olhada em como isso funciona:
Suponha que Jay queira se comunicar com Aayush. Jay está vinculado a um servidor de bate-papo com o qual recebe a mensagem. Jay recebe a confirmação do servidor de bate-papo de que a mensagem foi enviada. O servidor de bate-papo agora está solicitando informações do armazenamento de dados sobre o servidor de bate-papo ao qual Aayush está conectado. O servidor de bate-papo de Jay agora transmite a mensagem para o servidor de bate-papo de Aayush, e Aayush recebe a mensagem por meio de um mecanismo de envio. Aayush agora envia uma confirmação para o servidor de bate-papo de Jay, que notifica Jay que a mensagem foi entregue. Se Aayush lesse a mensagem novamente, uma nova confirmação de que a mensagem havia sido lida era entregue a Jay.
Status da atividade do usuário
A última vez que uma pessoa esteve ativa é um recurso comum dos mensageiros instantâneos.
Um sistema para manter uma conexão entre o cliente e o servidor é representado neste diagrama. Web sockets foram usados para estabelecer uma conexão bidirecional entre o servidor e o cliente. Essas conexões enviam pulsações, que são usadas para monitorar o status da atividade do usuário.
Privacidade de ponta a ponta
A criptografia de ponta a ponta é um recurso importante que garante que apenas os usuários que conversam possam ler as comunicações. Uma chave pública é compartilhada entre todos os usuários envolvidos na comunicação e é fundamental para manter a criptografia de ponta a ponta. Suponha que haja dois usuários no canal, Jay e Aayush, que se comunicam.
Jay tem a chave pública de Aayush e Aayush tem a chave pública de Jay, bem como sua chave privada não compartilhada. Como resultado, quando Jay transmite a mensagem, ele a criptografa com a chave pública de Aayush, que só pode ser decodificada com a chave privada de Aayush.
Da mesma forma, Jay só poderá decodificar a comunicação de Aayush. Como resultado, apenas Jay e Aaysuh poderão ver as comunicações um do outro, e o servidor funcionará apenas como um gateway em todo o processo.
5. Gargalos
Todo sistema é propenso a mau funcionamento. Para gerenciar um volume tão grande de tráfego, o serviço deve permanecer operacional e tolerante a falhas o tempo todo para evitar gargalos. Como nosso serviço é totalmente dependente de servidores de Chat e Transient, devemos resolver todos os problemas que surgem de sua operação.
Falha do servidor de bate-papo: Este é o coração do nosso sistema. Quando os usuários estão online, é responsável por gerenciar e entregar mensagens. Como resultado, este sistema mantém vínculos com seus usuários.
Como resultado, se esse serviço falhar, toda a arquitetura sofrerá. Existem duas abordagens para gerenciar a falha do servidor de bate-papo. Um método é mudar as conexões TCP para outro servidor, enquanto outro é permitir que os usuários iniciem as conexões automaticamente em caso de perda de conexão.
Falha de armazenamento temporário: Outro componente propenso a falhas que pode eventualmente danificar todo o serviço é o armazenamento temporário. As mensagens em rota para usuários offline são perdidas se esse serviço falhar.
Podemos evitar a perda de mensagens replicando o armazenamento temporário de cada usuário. Como resultado, a réplica pode ser empregada para processar as funções sempre que o usuário retornar online. Se o servidor original se tornar acessível, as instâncias original e de réplica do armazenamento transitório do usuário serão combinadas em um único armazenamento.
6. Técnicas de otimização
Latência: Para oferecer uma experiência perfeita e aprimorada ao cliente, o serviço de mensagens deve ser em tempo real. Como resultado, a latência deve ser reduzida armazenando em cache parte dos dados acessados com frequência. Podemos armazenar em cache o status da atividade do usuário e as conversas recentes na memória usando um cache distribuído como o Redis.
Disponibilidade: Precisamos que nosso serviço esteja disponível na maior parte do tempo. Nosso sistema deve ser tolerante a falhas, assim podemos manter várias cópias de mensagens transitórias para que qualquer mensagem perdida possa ser rapidamente recuperada de suas duplicatas. Como resultado, a disponibilidade do sistema não pode ser comprometida.
Conclusão
Nosso sistema agora suporta apenas alguns recursos, mas podemos expandi-lo facilmente para adicionar bate-papos em grupo para distribuir mensagens para vários indivíduos. Você também pode fornecer recursos de vídeo e chamadas telefônicas. Este sistema também pode ser desenvolvido para que os usuários possam publicar atualizações de status ou narrativas e ler uns aos outros.
Trabalhei duro para fornecer a você uma visão geral de alto nível do design do sistema WhatsApp. Espero que tenham gostado e que façam bom uso.
Deixe um comentário