Vamos projetar um serviço de mensagens instantâneas como o WhatsApp.

image

O WhatsApp é o aplicativo mais comum que quase todos nós estamos usando todos os dias. O WhatsApp nos ajuda a conectar pessoas em todo o mundo de forma amigável e conveniente. Existem dois tipos de sistemas de bate-papo, um é o Facebook Messenger que armazena todas as mensagens permanentemente, outro como o WhatsApp, que armazena mensagens apenas até que as mensagens não sejam entregues. Uma vez obtida a confirmação de recebimento, essas mensagens serão excluídas do sistema.

Requisitos Funcionais

  • Suporte bate-papos um-para-um
  • Suporte a mensagem de envio offline
  • Suporte para enviar mensagens para outros usuários até mesmo o usuário está offline
  • chats de grupo de suporte
  • Grupo de WhatsApp com até 256 participantes
  • Suporte ao bate-papo por vídeo
  • Suporte ao bate-papo de vídeo em grupo
  • Permitir mensagens de voz
  • Suporte recursos de compartilhamento de imagens, vídeos e arquivos
  • Suporte a mensagem criptografada
  • O vídeo não pode exceder 16 MB ou 90 segundos a 3 minutos
  • Indicar leitura/recebimento de mensagens
  • Última vez visto dos usuários (depende de alguns cenários)
  • Enviado + Entregue + Leia os recibos de tique-taque
  • O tamanho do arquivo pode ser compartilhado é limitado a 100MB
  • Suporte para reproduzir youtube, áudio e vídeo na tela de exibição
  • Suporta formatos de vídeo — MP4, 3GP, MKV, AVI e MOV
  • A notificação será mostrada assim que seu arquivo, vídeo, áudio e imagem excederem a limitação de tamanho
  • Suporte para compartilhar o arquivo, vídeo, áudio e imagem para outros aplicativos que incluem
  • Resposta de suporte a uma mensagem específica em um bate-papo em grupo
  • Permita-nos encaminhar quaisquer mensagens
  • Permita-nos copiar a mensagem
  • Permita-nos salvar a mensagem
  • Permita-nos arquivar a mensagem
  • Permita-nos responder em particular à mensagem em particular
  • Permita-nos enviar e visualizar vídeos e imagens uma vez e excluí-los uma vez abertos
  • Permita-nos excluir a mensagem
  • Suporte para reportar à equipe do WhatsApp uma mensagem específica (você pode bloquear ou relatar à equipe)
  • Suporte para tirar fotos via WhatsApp
  • Suporte para gravar a conversa uma vez que a função de gravação de voz definida para totalmente aberto
  • Suporte para acessar a lista de contatos a partir do telefone
  • Suporte para compartilhar localização (compartilhar em tempo real ou compartilhar a localização atual)
  • Permitir compartilhar o vídeo e documentos para Mensagens, Facebook Messenger, Correio, WeChat, Telegram e etc
  • Pode editar/carregar, excluir o perfil do usuário
  • Pode adicionar sua biografia
  • Pode vincular a outros dispositivos
  • Pode atualizar seu status
  • Pode ter suas configurações personalizadas (diferentes cenários)

Requisitos não funcionais

  • Latência muito baixa
  • Sempre disponível
  • sem atrasos
  • Altamente escalável
  • Consistência (o que é mostrado em outros dispositivos, será sincronizado com outros dispositivos)

Componentes de arquitetura do sistema

image

image

Banco de dados de perfil

  • armazenar informações de perfil sobre usuários como status, foto de perfil, ID do perfil e detalhes de contato
  • Armazenar a foto do perfil através da tecnologia s3 bucket https://aws.amazon.com/s3/ para que cada foto de perfil tenha seus respectivos links

image

Serviço de perfil (API)

  • Tem vários pontos finais que ajudam a recuperar detalhes sobre o usuário. Obter — recuperar informações do perfil, postar/colocar — adicionar/atualizar informações do perfil

Servidor de bate-papo

3. Banco de dados de mapeamento

  • Antes de entendermos mais profundamente, você tem o conceito de arquitetura de comunicação geral? Quando 2 clientes (A e B) querem se comunicar e enviar mensagens uns aos outros, eles têm que saber o endereço um do outro (IP, MAC ou qualquer identidade exclusiva personalizada) e trocar mensagens por uma rede, neste caso, é a internet. E eles usarão a conexão bidirecional. Então ele vai para muitos processos de evolução, finalizá-lo como a imagem abaixo. Servidor, cliente, balanceador de carga e bancos de dados.

image

  • O protocolo HTTP não é usado porque todo usuário precisa enviar uma solicitação para o servidor, uma vez que uma resposta é recebida do cliente-servidor, então a conexão é fechada, significa que cada mensagem precisa esperar pela transação completa entre servidor-cliente. Mas, não queremos perder tempo e recursos criando conexão, então o protocolo WebSocket é usado porque a conexão não é fechada imediatamente. O manipulador de soquetes da Web WSH1 será conectado pelo usuário. O manipulador de soquetes web é um servidor leve que mantém uma conexão aberta com todos os usuários ativos.
  • Cada máquina terá cerca de 65K portas abertas. Mesmo que acabemos usando até portas 5K para nosso uso interno e se comunicando com outros serviços em nosso sistema, ele ainda tem até 60K portas que podemos usar para se conectar com os usuários. Um manipulador de soquetes web será conectado a um gerenciador de tomadas web, que é um repositório de informações sobre quais manipuladores de tomadas da Web estão conectados aos quais os usuários. O Redis é usado porque pode armazenar 2 tipos de informações: qual usuário está conectado a qual manipulador de tomadas web, o que todos os usuários estão conectados a um manipulador de tomadas da Web. Quando uma conexão entre um usuário e o manipulador de tomadas da Web quebra e ela se conecta a outro manipulador, essas informações serão atualizadas no Redis.
  • Serviço de mensagens: um repositório de todas as mensagens no sistema. As APIs receberão mensagens de vários filtros, como identificação do usuário, identificação de mensagens, status de entrega e etc. Cassandra é usada para serviços de mensagens porque pode lidar com dados cada vez maiores porque usuários antigos e novos continuam conversando todos os dias. Quando um manipulador de soquete web fala com um gerenciador de tomadas web e serviço de mensagem em paralelo.

image

image

image

  • Então podemos derivar alguns cenários. Neste caso, o remetente está conectado ao servidor, mas o receptor não está conectado, a mensagem é armazenada no banco de dados e quando o receptor se conecta ao servidor, a mensagem é retirada do banco de dados e encaminhada para o receptor. Quando o remetente não está conectado ao servidor, a mensagem é salva no armazenamento do dispositivo (pode ser SQLite ou qualquer outra coisa com base na plataforma) e quando o remetente fica on-line, a mensagem é retirada do armazenamento local e enviada para o servidor. Quando ambos os clientes estão conectados ao servidor, o remetente envia a mensagem, e o servidor encaminha essa mensagem para o receptor sem armazenar a mensagem para o banco de dados ou armazenamento local do dispositivo.
  • Banco de dados de mapeamento — O servidor de bate-papo criará um novo processo (um thread) para o remetente, usuário A. O mesmo vale para o receptor, usuário B se o usuário B estiver online. O servidor descobre o nome do receptor, então retira os dados do banco de dados e descobre o id de processo (pid) para o usuário B para que a mensagem possa ser enviada ao usuário B. Se o usuário B quiser enviar a mensagem para o usuário A, o servidor descobre o nome do usuário A no banco de dados de mapeamento, uma vez que o pid é encontrado, a mensagem é enviada para esse pid para o usuário A. Sempre que um usuário conversa com o sistema, um novo processo é criado e os detalhes são armazenados no banco de dados de mapeamento

image

Na aplicação do mundo real, a estrutura deve ser semelhante a esta imagem abaixo:

image

  • Uma fila com cada servidor de bate-papo é incluída porque a fila pode lidar com a carga excessiva de mensagens e não há falha no envio de mensagens para diferentes usuários.

Serviço em grupo

  • Para cada grupo é criado, um novo groupId também é criado. Este groupId terá então um mapeamento para todos os usuários que estão no grupo. Sempre que uma mensagem é enviada, o serviço de bate-papo descobrirá o tipo de receptor, seja um grupo ou um único usuário, se for um grupo, o serviço de bate-papo passará para o serviço de grupo para fazer uma chamada ao grupo db para pesquisar o mesmo groupId, e enviará mensagens para todos os userIds da lista.

image

  • Os manipuladores de soquetes da Web não podem acompanhar os grupos, ele só rastreia usuários ativos. Então, quando um remetente quer enviar uma mensagem para um grupo, um manipulador de tomadas web de um remetente entra em contato com o serviço de mensagens, e as mensagens serão armazenadas em Cassandra. O serviço de mensagens então se comunica com Kafka. Essas mensagens são salvas em Kafka com uma instrução para enviar ao grupo. Kafka interagirá com o manipulador de mensagens do Grupo e enviará todas as mensagens em grupo, este é o mecanismo de serviço em grupo. O manipulador de mensagens de grupo falará com o serviço de grupo e descobrirá todos os usuários da lista de grupos, e voltará ao processo através de um manipulador de tomadas da Web e entregará a mensagem a todos os usuários individualmente.
  • O serviço em grupo mantém todas as informações relacionadas ao grupo, como qual usuário pertence a qual grupo, ids de usuário, identidades de grupo, uma época em que o grupo foi criado, uma época em que cada usuário foi adicionado, status, ícone de grupo, etc. Esses dados também serão armazenados em um banco de dados MySQL que tem vários escravos em diferentes locais geográficos para reduzir a latência. O método de cache é aplicado para o grupo de frequência.

Serviço visto pela última vez

  • O serviço visto pela última vez usa um banco de dados visto pela última vez para que as últimas informações vistas possam ser armazenadas. Ele só mantém os últimos detalhes do tempo visto, o mais recente sempre substituir o mais velho. Sempre que um usuário abre o WhatsApp e envia qualquer solicitação relacionada aos usuários para o servidor de bate-papo, o servidor de bate-papo pode chamar este serviço para atualizar os detalhes da hora.

image

6. Servidor de armazenamento de mensagens & DB de mensagem temporária da loja

  • quando o receptor está offline, a mensagem deve ser criptografada e armazenada no DB do servidor. uma vez que o receptor fica on-line, todas as mensagens podem ser entregues

Mensagens de tipo de mídia

  • o serviço de bate-papo pega as mensagens e descobre o tipo de mensagem. Uma vez que o tipo de mensagem ou serviço de bate-papo detecta o formato da mensagem como mídia, ela é armazenada em um balde S3 que é um serviço de armazenamento de objetos. Os links para essas mídias são então armazenados em um SQL ou NoSQL db com mapeamento para os detalhes do usuário. Podemos usar um protocolo HTTP para transferir essas mensagens.

image

  • A imagem, os arquivos e o vídeo que foram enviados pelo WhatsApp serão compactados e criptografados no final do dispositivo e o conteúdo criptografado será enviado para o receptor e o conteúdo será descriptografado na extremidade do dispositivo no lado do receptor.
  • Se um usuário enviar uma imagem para outro usuário, o usuário carregará a imagem para um servidor e obterá o id da imagem. Em seguida, ele enviará o ID de imagem para outro usuário. Outro usuário pode pesquisar e baixar a imagem do servidor. Ou outro método é que a imagem será compactada no lado do dispositivo e enviada para um serviço Asset através do balanceador de carga. A imagem será armazenada no balde s3. A imagem pode não ser carregada em um CDN. Uma vez que a imagem é carregada no S3, o serviço de ativos enviará o id de imagem, o usuário se comunicará com outro usuário através de manipuladores de tomadas da Web sobre essas informações.

WhatsApp Front-End

  • Andróide: Java
  • iOS: Swift
  • Windows Phone: C #
  • Aplicativo web: JavaScript/HTML/CSS/
  • Mac Desktop app: Swift/Objective-C
  • Aplicativo pc desktop: C/C#/Java

WhatsApp Back-end

  • Erlang é a principal linguagem de programação
  • FreeBSD é o sistema operacional
  • Ejabberd é o servidor de aplicativos XMPP
  • BEAM é a máquina virtual baseada em Erlang
  • Mnésia é seu banco de dados baseado em Erlang
  • YAWS é seu servidor web multimídia

A arquitetura de sistema de alto nível

image


Artigo Original