Whatsapp usa rabbitmq

O RabbitMQ é construído em Erlang linguagem de programação de uso geral e também é usado pelo WhatsApp para mensagens.

Resumo

O WhatsApp usa o RabbitMQ, que é construído em Erlang, como sua fila de mensagens para entrega de mensagens.

Ao projetar um sistema de bate-papo em tempo real, é importante considerar a fila usada por plataformas de mensagens populares como WhatsApp e Facebook Messenger. Embora possa parecer lógico ter uma fila por pessoa ou tópico de kafka para cada usuário, dados os bilhões de usuários nessas plataformas, essa abordagem exigiria um número impraticável de filas ou tópicos. No entanto, foi observado que o WhatsApp e o Facebook Messenger usam uma fila chamada “Iris” (semelhante a Kafka) para entrega de mensagens.

Existem sistemas internos que preenchem bancos de dados (como HBase e Myrocks) na fila de mensagens, mas esses bancos de dados não são o sistema de entrega primário.

Perguntas e respostas

1. O que é RabbitMQ construído?

RabbitMQ é construído na linguagem de programação de uso geral de Erlang.
2. Como o WhatsApp usa RabbitMQ?

Whatsapp usa o RabbitMQ como sua fila de mensagens para entrega de mensagens.
3. Qual é o objetivo de uma fila de mensagens?

Uma fila de mensagens é usada para dissociar componentes de um sistema, permitindo que as mensagens sejam enviadas entre eles de forma assíncrona.
4. Uma fila por pessoa pode ser usada para entrega de mensagens no whatsapp ou facebook messenger?

Embora uma fila por pessoa possa parecer lógica, exigiria um número impraticável de filas, dados os bilhões de usuários nessas plataformas.
5. Que fila é usada pelo WhatsApp e Facebook Messenger para entrega de mensagens?

Whatsapp e Facebook Messenger usam uma fila chamada “Iris” para entrega de mensagens. “Iris” é semelhante a Kafka.
6. Quais são alguns dos bancos de dados usados ​​pelo WhatsApp para armazenar mensagens?

O Whatsapp usa bancos de dados como HBase e Myrocks para armazenar mensagens. Esses bancos de dados são preenchidos na fila de mensagens.
7. RabbitMQ é o sistema de entrega principal para o WhatsApp?

Não, o RabbitMQ não é o principal sistema de entrega para o WhatsApp. É usado como uma fila de mensagens para entrega de mensagens.
8. A entrega de mensagens é síncrona ou assíncrona do WhatsApp e Facebook?

Entrega de mensagens no WhatsApp e Facebook Messenger é assíncrona, o que significa que as mensagens são enviadas e recebidas independentemente uma da outra.
9. Quais são os benefícios de usar uma fila de mensagens como o RabbitMQ?

O uso de uma fila de mensagens como o RabbitMQ permite a dissociação de componentes, melhorabilização e comunicação assíncrona entre os elementos do sistema.
10. O RabbitMQ pode lidar com altos volumes de mensagens?

Sim, o RabbitMQ foi projetado para lidar com altos volumes de mensagens e é capaz de entregá -las de maneira eficiente e confiável.
11. Quais são as alternativas ao RabbitMQ para implementar uma fila de mensagens?

Algumas alternativas ao RabbitMQ incluem Apache Kafka, ActiveMQ e Redis Streams.
12. Existem limitações para usar uma fila de mensagens como o RabbitMQ?

Algumas limitações do uso de uma fila de mensagens como o RabbitMQ incluem a necessidade de configurar e ajustá -lo corretamente para o desempenho ideal, a potencial perda de mensagens se não estiver configurada corretamente e a necessidade de infraestrutura adicional para apoiar a fila de mensagens.
13. O RabbitMQ pode ser usado para outros fins, além de mensagens?

Sim, o RabbitMQ pode ser usado para outros fins, além de mensagens, como agendamento de tarefas, arquiteturas orientadas por eventos e transmissão de dados.
14. RabbitMQ suporta a persistência da mensagem?

Sim, o RabbitMQ suporta a persistência da mensagem, permitindo que as mensagens sejam armazenadas e recuperadas, mesmo no caso de falhas do sistema.
15. Como o RabbitMQ garante a confiabilidade da entrega da mensagem?

O RabbitMQ garante a confiabilidade da entrega de mensagens por meio de recursos como reconhecimento de mensagens, o editor confirma e a durabilidade da fila.

Whatsapp usa rabbitmq

O RabbitMQ é construído em Erlang linguagem de programação de uso geral e também é usado pelo WhatsApp para mensagens.

Fila usada no whatsapp ou fb messenger

Enquanto pensa em um design de sistema para bate-papo em tempo real, estou curioso. O que eu estava pensando foi que há uma fila por pessoa/Kafka-tópico; portanto, quando uma nova mensagem precisa ser entregue ao usuário a, a mensagem é enquadrada na fila de A. No entanto, pode haver bilhões de usuários (o FB tem 2 bilhões de usuários), isso significa que precisamos de 2 bilhões de filas/tópicos (no termo kafka)? Nesse caso, qual fila pode lidar com isso com atualização. Qualquer comentário é bem -vindo! Obrigado!

perguntou 25 de junho de 2019 às 16:44

1.669 8 8 crachás de ouro 23 23 crachás de prata 37 37 crachás de bronze

Você pode encontrar documentação de que o Messager foi construído sobre o HBASE, e agora Myrocks. Existem sistemas internos que estariam preenchendo esses bancos de dados de uma fila, sim, mas não é o sistema de entrega principal. código.fb.com/core-dados/…

26 de junho de 2019 às 3:08

@cricket_007 obrigado pelos comentários. Sim, parece que o FB usa a íris (Kafka como) como fila para entrega.

Alifzl/Yomkippur

Este compromisso não pertence a nenhum ramo neste repositório e pode pertencer a um garfo fora do repositório.

Switch Branches/Tags

Tags de ramificações

Não foi possível carregar ramificações

Nada para mostrar

Não foi possível carregar tags

Nada para mostrar

Nome já em uso

Uma tag já existe com o nome da filial fornecida. Muitos comandos Git aceitam nomes de tag e ramificação; portanto, criar este ramo pode causar comportamento inesperado. Tem certeza que deseja criar este ramo?

Cancelar Criar

  • Local
  • Codespaces

Https github cli

Use Git ou Checkout com SVN usando o URL da Web.

Trabalhe rápido com nossa cli oficial. Saiba mais sobre a CLI.

Autenticação necessária

Faça login para usar os espaços de codificina.

Lançando o GitHub Desktop

Se nada acontecer, faça o download do GitHub Desktop e tente novamente.

Lançando o GitHub Desktop

Se nada acontecer, faça o download do GitHub Desktop e tente novamente.

Lançando Xcode

Se nada acontecer, faça o download do Xcode e tente novamente.

Lançando o código do Visual Studio

Seu espaço de código será aberto uma vez pronto.

Houve um problema para preparar seu espaço de código, por favor tente novamente.

Última confirmação

Estatísticas Git

arquivos

Falha ao carregar informações mais recentes de compromisso.

Última mensagem de confirmação

Comprometer o tempo

Leia-me.MD

YOM KIPPUR é uma ferramenta de automação do WhatsApp que pretende ser uma solução consistente e permanente para o uso não comercial do WhatsApp como um bot automatizado.

O que isso faz?

Yom Kippur Demonstração

  • Enviar/receber uma única mensagem em um aplicativo WhatsApp pré-configurado no AVD (dispositivo virtual Android)
  • Crie lista de contato no AVD e use-o para o material de envio/recebimento
  • Literalmente, pode fazer tudo com o AVD (cria uma possibilidade inúmeras para persuadir)

No primeiro, vi Yowsup minha única escolha, mas devido aos problemas listados abaixo, mudei de idéia para implementá -la de outra maneira:

  • Variedade de questões comunitárias (vinculadas aqui)
  • YosUp é um tipo de API assíncrona que interage com o WhatsApp Restapi, em relação às considerações de alta segurança do WhatsApp, ficou muito sensível às sessões ativas atuais de todos os usuários e não será muito amigável com soluções síncronas. (Como você provavelmente sabe as restrições de usar a visão da web do WhatsApp, que diz que devemos ter uma conexão de Internet ativa consistente no telefone simultaneamente)
  • a preguiça minha e também me desafiando a fazê -lo da maneira mais difícil

Bem, dependências neste projeto, elas são muito! Primeiro de vocês, deve ter esse requisito satisfeito:
Os instaladores do Windows são refletidos, mas pode ser uma implementação na máquina Linux ou MacOS (ambos não testados)

Dependência Descrição / Download Links
Android Studio Android Studio com Android API 28
JAVA Java JDK 11
Mysql Comunidade do MySQL Installer 8.X ou acima
Python 2.7 Python 2.7
Appium V1.10 ou acima
RabbitMQ Versão mais recente do RabbitMQ
Carteiro Versão mais recente do Postman

Considerações: você pode usar o conda virenv para o python 2.7, mas isso me deixou uma dor de cabeça séria (não recomendada)
O principal motivo que usei o Python 2 para este projeto é que o Appium, o MySQL Connector Client e o RabbitMQ foram incompatibilados juntos na versão 3.

Primeiro de tudo, seja paciente nesta parte. Levou -me sangue e lágrimas para limpar as merdas de dependência por fazer isso uma tarefa tão simples.

1.Dispositivo virtual Android
Luanch AVD Manager do Android Studio, configure um dispositivo com o Android 9.0 com API 28 (escolha e nome apropriado para o AVD, porque precisamos dele em mais etapas).
Observe que você deve instalar o WhatsApp através do próprio AVD, então selecione a versão suportada pela Playstore.
Verifique se você tem essas variáveis ​​de ambiente em sua conta:

Nome variável Valor variável
Android_home C: \ Users \ fzl \ AppData \ Local \ Android \ SDK
Java_home C: \ Arquivos de Programas \ Java \ JDK-11.0.2
Pythonpath C: \ python27; c: \ python27 \ lib \ sites-packages; c: \ python27 \ lib; c: \ python27 \ dlls; c: \ python27 \ scripts
Correção C: \ python27; c: \ python27 \ scripts; c: \ python27 \ lib \ site-packages; c: \ arquivos de programas \ java \ jdk-11.0.2; C: \ Arquivos de Programas \ Java \ JDK-11.0.2 \ bin;

Então você deve iniciar seu AVD, instalar o WhatsApp nisso e também autorizar o ADB com seu dispositivo (obrigatório)
Para fazer isso, você deve executar dispositivos ADB ou ADB USB para verificar a autorização do AVD.

C:\VOCÊsers\ FZl\Appdata\EUocal\Android\ Sdk\ pLATFORM-TOOLS: Dispositivos ADB Lista de dispositivos anexados emulador-5554 Dispositivo

Se você está vendo o resultado não autorizado, siga este link.

2.Configuração do RabbitMQ

Após a instalação do RaabitMQ, você deve executar o RabbitMQ-PLUGINS Permitir Rabbitmq_Management no diretório RabbitMQ SBIN para permitir o web-gui do sistema de gerenciamento de RabbitMQ. Pode ser necessário restringir o serviço RabbitMQ.
Depois disso, você poderá acessar o rabbitmq web-gui com http: // localhost: 15672/#/endereço em sua máquina local. Se sim, crie um novo usuário pelos comandos abaixo e faça com que o Administrador:

rabbitmqctl add_user name de usuário senha # Isso faz do usuário um administrador Rabbitmqctl set_user_tags Administrador de nome de usuário # Isso define permissões para o usuário Rabbitmqctl set_permissions -p / nome de usuário ".*" ".*" ".*"

Faça login com credenciais recém -criadas e importe as especificações da fila que já estão anexadas neste repositório que chamou Rabbitmq_conf.JSON nas seções de definições de importação sob a visão geral Menue.
Isso criaria as configurações necessárias para o RabbitMQ e permitiria as privilégias necessárias.

3.Appium
Basta executar o servidor Appium com as configurações padrão. Appium-Default-Capabilities ” já está incorporado no código. Tl; dr: não há nada para fazer nesta etapa.

4.Mysql
Instale a edição comunitária do MySQL, crie uma conta de banco de dados apropriada e defina o serviço executado automaticamente quando o OS iniciar.

5.Instale as dependências do Python
Simplesmente execute o PIP Instale – r dependências.txt para resolver a dependência das bibliotecas usadas.
Você pode enfrentar a versão depreciada da biblioteca MySqldb, que é solucionável com a instalação. Cuide da instalação do Python 2.x versão das bibliotecas mencionadas.

6.Crie diretórios para os arquivos de log
Crie os diretórios e arquivos como ele’é mencionado abaixo:

# diretórios C:\ var\euOG [Diretório] C:\ var\euOG\cHATSAPP_API [diretório] # arquivos de log C:\ var\euOG\api.LOG C:\ var\euOG\cHatsApp_single_consumer.LOG C:\ var\euOG\cHatsApp_single_worker.LOG C:\ var\euOG \

7.Defina o Yom Kippur’Arquivo de configuração S
Vá para Yomkippur-Master \ configs \ config.CFG e entrada o seguinte.
(Não mude nada esle, a menos que você saiba o que está fazendo)

[mysql] host = 127.0.0.1 nome de usuário ='Seu nome de usuário do MySQL' senha ='Sua senha do MySQL' banco de dados = whatsapp [rabbitmq] ip = 127.0.0.1 ipqueuename = ipaddr.Nome de usuário da fila ='Seu nome de usuário do RabbitMQ' senha ='Sua senha do RabbitMQ' [queue_name] single_message = whatsapp_singleMessage_queue transmission_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue lister_message = whatsapp_messagelistener_queue

Execute o principal.py e add_new_contact_producer.Py em dois terminais/cmd separados.
Se você não viu nenhum erro, está pronto para ir.

  1. Verifique se o MySQL Server está em execução
  2. Verifique se o rabbitmq sever está runnig
  3. Execute o Appium com configurações definidas
  4. Execute esses scripts

Python Main.py python add_new_contact_producer.py python single_message_producer.py

  1. Execute o Postman e crie comandos de postagem desejáveis ​​a partir da lista abaixo:

Adicionando contato no aplicativo de contatos do Google

Enviando uma única mensagem via WhatsApp

Desenvolvimento e contribuir?

Quer contribuir? Ótimo! Sinta -se à vontade para me bater em um.Fazeli95 [at] gmail [dot] com ou apenas crie uma solicitação de tração.

Todos os componentes utilizados neste projeto são de código aberto e têm licença MIT e podem ser usados ​​em qualquer produto não comercial

Sobre

Whatsapp Message Broker com RabbitMQ, AVD e Appium

Introdução ao RabbitMQ

Aqui vamos aprender o que é RabbitMQ, usos do RabbitMQ e por que precisamos usar o RabbitMQ em nossos aplicativos com exemplos.

O que é RabbitMQ?

RabbitMQ é um AMQP corretor de mensagens e é o mais popular corretor de mensagens de código aberto e plataforma cruzada.

RabbitMQ também é uma maneira de trocar os dados entre diferentes aplicativos de plataforma, como uma mensagem enviada de .Líquido O aplicativo pode ser lido por um Nó.JS aplicação ou Java aplicativo.

O RabbitMQ é construído em Erlang linguagem de programação de uso geral e também é usado pelo WhatsApp para mensagens.

O que é AMQP?

O protocolo de fila de mensagens avançado (AMQP) é um protocolo de camada de aplicativo padrão aberto para orientação a mensagens e os recursos do AMQP são orientação para mensagens, filas, roteamento (incluindo ponto a ponto e publicação e inscrição), confiabilidade e segurança.

Foi desenvolvido pela JPMorgan e Imatix Corporation. O AMQP foi projetado com as seguintes características principais como objetivos:

  • Segurança
  • Confiabilidade
  • Interoperabilidade
  • Padrão
  • Abrir

O RabbitMQ é leve e fácil de implantar nas instalações disponíveis e suporta vários protocolos de mensagens. O RabbitMQ pode ser implantado em configurações distribuídas e federadas para atender aos requisitos de alta escala e de alta disponibilidade.

A seguir, a representação pictórica de como o RabbitMQ atuará como mediador entre o remetente e o consumidor em nossos aplicativos.

Diagrama de fluxo do processo RabbitMQ

Por que e quando usar o RabbitMQ?

Hoje em dia, a maioria das pessoas realizará várias tarefas em aplicativos únicos, como enviar e -mails ou SMS, relatórios e isso criará uma carga pesada no aplicativo. Portanto, se você separar essas tarefas, obteremos mais espaço (memória) para atender a mais solicitações.

Ao usar o RabbitMQ, podemos remover alguns trabalhos pesados ​​de nossos aplicativos da Web, como o envio de relatórios em formato Excel ou PDF’s ou enviar um email, SMS ou outra tarefa, como acionar alguns outros aplicativos para iniciar o processamento.

RabbitMQ é um corretor de mensagens de código aberto e de plataforma cruzada, então’é fácil de usar com muitos idiomas, como .Rede, java, python, rubi, nó.JS.

Bibliotecas de clientes suportadas pelo RabbitMQ

RabbitMQ suportará vários sistemas operacionais e linguagens de programação. RabbitMQ forneceu várias bibliotecas de clientes para seguir as linguagens de programação.

  • .Líquido
  • Java
  • Estrutura de primavera
  • Rubi
  • Pitão
  • Php
  • Objective-C e Swift
  • JavaScript
  • IR
  • Perl

Design do sistema: whatsapp

Vamos projetar um serviço de mensagens instantâneas do WhatsApp, semelhante a serviços como WhatsApp, Facebook Messenger e WeChat.

O que é whatsapp?

Whatsapp é um aplicativo de bate -papo que fornece serviços de mensagens instantâneas para seus usuários. É um dos aplicativos móveis mais usados ​​no planeta conectando mais de 2 bilhões de usuários em mais de 180 países. Whatsapp também está disponível na web.

Requisitos

Nosso sistema deve atender aos seguintes requisitos:

Requisitos funcionais

  • Deve apoiar o bate-papo individual.
  • Bate -papos em grupo (máximo 100 pessoas).
  • Deve suportar compartilhamento de arquivos (imagem, vídeo, etc.).

requisitos não Funcionais

  • Alta disponibilidade com latência mínima.
  • O sistema deve ser escalável e eficiente.

Requisitos estendidos

  • Enviado, entregue e lê recibos das mensagens.
  • Mostre a última hora vista dos usuários.
  • Notificações via push.

Estimativa e restrições

Vamos começar com a estimativa e restrições.

Nota: verifique qualquer escala ou suposições relacionadas ao tráfego com seu entrevistador.

Tráfego

Vamos supor que temos 50 milhões de usuários ativos diários (DAU) e, em média, cada usuário envia pelo menos 10 mensagens para 4 pessoas diferentes todos os dias. Isso nos dá 2 bilhões de mensagens por dia.

50 m i l l i o n × 20 m e s s a g e s = 2 b i l i o n / d a y 50 \ Space Million \ Times 20 \ Mensagens Espaciais = 2 \ Espaço Bilhão / Dia 50 mi ll i o n × 20 m Esse a g es = 2 bi ll i o n / d a y a y a y

As mensagens também podem conter mídias como imagens, vídeos ou outros arquivos. Podemos assumir que 5 % das mensagens são arquivos de mídia compartilhados pelos usuários, o que nos dá 200 milhões de arquivos adicionais que precisamos para armazenar.

5 p e r c e n t × 2 b i l i o n = 200 m i l i o n / d a y 5 \ espacial por cento \ vezes 2 \ espacial bilhão = 200 \ espate milhão / dia 5 p erce n t × 2 bi ll i o n = 200 mi ll i o n / d a y a y a y a y

O que seria solicitações por segundo (RPS) para o nosso sistema? 2 bilhões de solicitações por dia traduzem em 24k solicitações por segundo.

2 b i l i o n (24 h r s × 3600 s e c o n d s) = ∼ 24 k r e q u e s t s / s e c o n d \ frac<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ Sim 24k \ Space Solicitações / Segundo (24 h rs × 3600 secret

### Storage Se assumirmos que cada mensagem, em média, é de 100 bytes, exigiremos cerca de 200 GB de armazenamento de banco de dados todos os dias.

2 b i l i l i o n × 100 b y t e s = ∼ 200 g b / d a y 2 \ Space bilhão \ vezes

De acordo com nossos requisitos, também sabemos que cerca de 5 % de nossas mensagens diárias (100 milhões) são arquivos de mídia. Se assumirmos que cada arquivo é de 50 kb, em média, exigiremos 10 TB de armazenamento todos os dias.

100 m i l i o n × 100 k b = 10 t b / d a y 100 \ Space Million \ vezes

E por 10 anos, exigiremos cerca de 38 pb de armazenamento.

(10 t b + 0.2 t b) × 10 y e r s × 365 d a y s = ∼ 38 p b (10 \ espaço tb + 0.2 \ Space Tb) \ Times 10 \ Anos Espaciais \ Times 365 \ Days Space = \ Sim 38 \ Space Pb (10 TB + 0.2 TB) × 10 ye A RS × 365 D A ys = ∼ 38 Pb

### BandWidth como nosso sistema está lidando com 10.2 TB de entrada todos os dias, exigiremos uma largura de banda mínima de cerca de 120 MB por segundo.

10.2 T B (24 h r s × 3600 s e c o n d s) = ∼ 120 m b / s e c o n d \ frac<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ Sim 120 \ Space Mb/Segundo (24 h Rs × 3600 SECO n D S) 10.2 TB = ∼ 120 Mb / Seco N D

### estimativa de alto nível aqui está nossa estimativa de alto nível:

Tipo Estimativa
Usuários ativos diários (dau) 50 milhões
Solicitações por segundo (RPS) 24k/s
Armazenamento (por dia) ~ 10.2 TB
Armazenamento (10 anos) ~ 38 pb
Largura de banda ~ 120 mb/s

Design do modelo de dados

WhatsApp-Datamodel

Este é o modelo de dados geral que reflete nossos requisitos. Temos as seguintes tabelas: Usuários Esta tabela conterá as informações de um usuário, como nome, número de telefone e outros detalhes. mensagens Como o nome sugere, esta tabela armazenará mensagens com propriedades como tipo (texto, imagem, vídeo, etc.), conteúdo e registro de data e hora para entrega de mensagens. A mensagem também terá um chatid correspondente ou grupo . bate -papos Esta tabela representa basicamente um bate -papo privado entre dois usuários e pode conter várias mensagens. usuários_chats Esta tabela mapeia os usuários e os bate -papos como vários usuários podem ter vários bate -papos (relacionamento n: m) e vice -versa. grupos Esta tabela representa um grupo entre vários usuários. Users_groups Esta tabela mapeia usuários e grupos como vários usuários podem fazer parte de vários grupos (relacionamento n: m) e vice -versa.

Que tipo de banco de dados devemos usar?

Embora nosso modelo de dados pareça bastante relacional, não precisamos necessariamente armazenar tudo em um único banco de dados, pois isso pode limitar nossa escalabilidade e rapidamente se tornar um gargalo. Vamos dividir os dados entre diferentes serviços, cada um com propriedade em uma tabela específica. Em seguida, podemos usar um banco de dados relacional como o PostgreSQL ou um banco de dados NOSQL distribuído, como Apache Cassandra, para o nosso caso de uso.

Design da API

Vamos fazer um design básico de API para nossos serviços:

Obtenha todos os bate -papos ou grupos

Esta API receberá todos os bate -papos ou grupos para um determinado UserID .

getall(ID do usuário: Uuid): Bater papo[] | Grupo[] 

Digite o modo de tela cheia

Saia do modo de tela cheia

Parâmetros ID do usuário (UUID): ID do usuário atual. Retorna Resultado (chat [] | grupo []): todos os bate -papos e grupos o usuário fazem parte de.

Obtenha mensagens

Obtenha todas as mensagens para um usuário, dado o canalid (bate -papo ou ID do grupo).

getMessages(ID do usuário: Uuid, canalidado: Uuid): Mensagem[] 

Digite o modo de tela cheia

Saia do modo de tela cheia

Parâmetros ID do usuário (UUID): ID do usuário atual. ID do canal (UUID): ID do canal (bate -papo ou grupo) da qual as mensagens precisam ser recuperadas. Retorna Mensagens (mensagem []): todas as mensagens em um determinado bate -papo ou grupo.

Enviar mensagem

Envie uma mensagem de um usuário para um canal (bate -papo ou grupo).

enviar mensagem(ID do usuário: Uuid, canalidado: Uuid, mensagem: Mensagem): boleano 

Digite o modo de tela cheia

Saia do modo de tela cheia

Parâmetros ID do usuário (UUID): ID do usuário atual. ID do canal (UUID): ID do canal (bate -papo ou grupo) O usuário deseja enviar uma mensagem para. Mensagem (mensagem): a mensagem (texto, imagem, vídeo, etc.) que o usuário deseja enviar. Retorna Resultado (booleano): representa se a operação foi bem -sucedida ou não.

Junte -se ou deixe um grupo

Envie uma mensagem de um usuário para um canal (bate -papo ou grupo).

juntar-se ao grupo(ID do usuário: Uuid, canalidado: Uuid): boleano deixar o grupo(ID do usuário: Uuid, canalidado: Uuid): boleano 

Digite o modo de tela cheia

Saia do modo de tela cheia

Parâmetros ID do usuário (UUID): ID do usuário atual. ID do canal (UUID): ID do canal (bate -papo ou grupo) que o usuário deseja entrar ou sair. Retorna Resultado (booleano): representa se a operação foi bem -sucedida ou não.

Design de alto nível

Agora vamos fazer um design de alto nível do nosso sistema.

Arquitetura

Usaremos a arquitetura de microsserviços, pois facilitará a escala horizontalmente e a dissociação de nossos serviços. Cada serviço terá a propriedade de seu próprio modelo de dados. Vamos tentar dividir nosso sistema em alguns serviços principais. Serviço de usuário Este é um serviço baseado em HTTP que lida com preocupações relacionadas ao usuário, como autenticação e informações do usuário. Serviço de bate -papo O serviço de bate-papo usará a Websockets e estabelecerá conexões com o cliente para lidar. Também podemos usar o cache para acompanhar todas as conexões ativas, como sessões, que nos ajudarão a determinar se o usuário está online ou não. Serviço de notificação Este serviço simplesmente enviará notificações push para os usuários. Será discutido em detalhes separadamente. Serviço de presença O serviço de presença acompanhará o último status visto de todos os usuários. Será discutido em detalhes separadamente. Serviço de mídia Este serviço lidará com a mídia (imagens, vídeos, arquivos, etc.) uploads. Será discutido em detalhes separadamente. Que tal a comunicação entre serviços e descoberta de serviços? Como nossa arquitetura é baseada em microsserviços, os serviços também estarão se comunicando. Geralmente, REST ou HTTP tem um bom desempenho, mas podemos melhorar ainda mais o desempenho usando GRPC, o que é mais leve e eficiente. A descoberta de serviço é outra coisa que teremos que levar em consideração. Também podemos usar uma malha de serviço que permita uma comunicação gerenciada, observável e segura entre serviços individuais. Nota: Saiba mais sobre REST, GraphQL, GRPC e como eles se comparam.

Mensagens em tempo real

Como enviamos e recebemos mensagens com eficiência? Temos duas opções diferentes: Modelo de puxar O cliente pode enviar periodicamente uma solicitação HTTP aos servidores para verificar se existem novas mensagens. Isso pode ser alcançado através de algo como uma longa votação. Modelo de push O cliente abre uma conexão de longa duração com o servidor e, assim que novos dados estiverem disponíveis, ele será empurrado para o cliente. Podemos usar websockets ou eventos enviados pelo servidor (SSE) para isso. A abordagem do modelo PULL não é escalável, pois criará uma solicitação desnecessária sobrecarga em nossos servidores e, na maioria das vezes, a resposta estará vazia, desperdiçando nossos recursos. Para minimizar a latência, o uso do modelo push with websockets é uma escolha melhor, porque podemos empurrar dados para o cliente, uma vez que ele estiver disponível sem qualquer atraso, dado que a conexão estiver aberta com o cliente. Além disso, os websockets fornecem comunicação complexa complexa, diferentemente dos eventos do servidor (SSE), que são apenas unidirecionais. Nota: Saiba mais sobre pesquisas longas, WebSockets, Eventos de SSE (SSE) de SSE (SSE).

Visto pela última vez

Para implementar a última funcionalidade vista, podemos usar um mecanismo de batimentos cardíacos, onde o cliente pode periodicamente pingar os servidores indicando sua vensagem. Como isso precisa ser o mais baixo possível, podemos armazenar o último timestamp ativo no cache da seguinte maneira:

Chave Valor
Usuário a 2022-07-01T14: 32: 50
Usuário b 2022-07-05T05: 10: 35
Usuário c 2022-07-10T04: 33: 25

Isso nos dará a última vez que o usuário estava ativo. Essa funcionalidade será tratada pelo serviço de presença combinado com redis ou memcached como nosso cache. Outra maneira de implementar isso é rastrear a ação mais recente do usuário, uma vez que a última atividade cruza um determinado limite, como “O usuário não realizou nenhuma ação nos últimos 30 segundos”, Podemos mostrar o usuário como offline e visto pela última vez com o último registro registrado. Isso será mais uma abordagem de atualização preguiçosa e poderá nos beneficiar do batimento cardíaco em certos casos.

Notificações

Depois que uma mensagem é enviada em um bate -papo ou um grupo, verificaremos primeiro se o destinatário está ativo ou não, podemos obter essas informações levando a conexão ativa do usuário e pela última vez em consideração. Se o destinatário não estiver ativo, o serviço de bate -papo adicionará um evento a uma fila de mensagens com metadados adicionais, como a plataforma de dispositivo do cliente, que será usada para rotear a notificação para a plataforma correta posteriormente em. O Serviço de Notificação consumirá o evento da fila de mensagens e encaminhará a solicitação para Firebase Cloud Messaging (FCM) ou Apple Push Notification Service (APNS) com base na plataforma de dispositivo do cliente (Android, iOS, Web, etc.). Também podemos adicionar suporte para email e sms. Por que estamos usando uma fila de mensagens? Como a maioria das filas de mensagens fornece pedidos de melhor esforço, o que garante que as mensagens geralmente sejam entregues na mesma ordem que elas são enviadas e que uma mensagem seja entregue pelo menos uma vez, o que é uma parte importante de nossa funcionalidade de serviço. Embora isso pareça um caso de uso clássico de inscrição de publicação, na verdade não é como dispositivos e navegadores móveis, cada um tem sua própria maneira de lidar com notificações push push. Geralmente, as notificações são tratadas externamente por meio de Firebase Cloud Messaging (FCM) ou Apple Push Notificatem. Podemos usar algo como Amazon Sqs ou RabbitMQ para apoiar essa funcionalidade.

Leia os recibos

O manuseio de recibos de leitura pode ser complicado, para este caso de uso, podemos aguardar algum tipo de reconhecimento (ACK) do cliente para determinar se a mensagem foi entregue e atualizar o campo entregue correspondente. Da mesma forma, marcaremos a mensagem a mensagem vista assim que o usuário abrir o bate.

Projeto

Whatsapp-Basic-Design

Agora que identificamos alguns componentes principais, vamos fazer o primeiro rascunho do design do nosso sistema.

Design detalhado

É hora de discutir nossas decisões de design em detalhes.

Particionamento de dados

  • Particionamento baseado em hash
  • Particionamento baseado em lista
  • Particionamento baseado em gama
  • Particionamento composto

As abordagens acima ainda podem causar dados desiguais e distribuição de carga, podemos resolver isso usando hash consistente.

Cache

Em um aplicativo de mensagens, precisamos ter cuidado ao usar o cache, pois nossos usuários esperam os dados mais recentes, mas muitos usuários solicitarão as mesmas mensagens, especialmente em um bate -papo em grupo. Portanto, para evitar picos de uso de nossos recursos, podemos cache mensagens mais antigas.

Algumas conversas em grupo podem ter milhares de mensagens e enviar isso pela rede será realmente ineficiente, para melhorar a eficiência, podemos adicionar paginação às nossas APIs do sistema. Essa decisão será útil para usuários com largura de banda de rede limitada, pois não terão que recuperar mensagens antigas, a menos que solicitado.

Qual política de despejo de cache usar?

Podemos usar soluções como redis ou memcached e cache 20% do tráfego diário, mas que tipo de política de despejo de cache melhor atender às nossas necessidades?

Menos usados ​​recentemente (LRU) pode ser uma boa política para o nosso sistema. Nesta política, descartamos os menos recentemente usados ​​pela chave primeiro.

Como lidar com o cache senhorita?

Sempre que houver uma falta de cache, nossos servidores podem atingir o banco de dados diretamente e atualizar o cache com as novas entradas.

Para mais detalhes, consulte o cache.

Acesso e armazenamento de mídia

Como sabemos, a maior parte do nosso espaço de armazenamento será usada para armazenar arquivos de mídia, como imagens, vídeos ou outros arquivos. Nosso serviço de mídia estará lidando com o acesso e armazenamento dos arquivos de mídia do usuário.

Mas onde podemos armazenar arquivos em escala? Bem, o armazenamento de objetos é o que estamos procurando. Objetos armazenos quebram os arquivos de dados em pedaços chamados objetos. Em seguida, ele armazena esses objetos em um único repositório, que pode ser espalhado por vários sistemas em rede. Também podemos usar o armazenamento de arquivos distribuído, como HDFs ou Glusterfs.

Curiosidade: o WhatsApp exclui a mídia em seus servidores depois de ser baixada pelo usuário.

Podemos usar lojas de objetos como Amazon S3, Azure Blob Storage ou Google Cloud Storage para este caso de uso.

Rede de entrega de conteúdo (CDN)

Rede de entrega de conteúdo (CDN) aumenta a disponibilidade e redundância do conteúdo enquanto reduz os custos de largura de banda. Geralmente, arquivos estáticos, como imagens e vídeos, são servidos de CDN. Podemos usar serviços como Amazon CloudFront ou CloudFlare CDN para este caso de uso.

API Gateway

Como usaremos vários protocolos como HTTP, WebSocket, TCP/IP, implantando vários balanceadores de carga L4 (camada de transporte) ou L7 (camada de aplicativo) separadamente para cada protocolo será caro. Em vez disso, podemos usar um gateway de API que suporta vários protocolos sem problemas.

A API Gateway também pode oferecer outros recursos, como autenticação, autorização, limitação de taxas, estrangulamento e versão da API, que melhorarão a qualidade de nossos serviços.

Podemos usar serviços como a Amazon API Gateway ou Azure API Gateway para este caso de uso.

Identificar e resolver gargalos

Whatsapp-advanced-Design

Vamos identificar e resolver gargalos, como pontos únicos de falha em nosso design:

  • “E se um de nossos serviços falhar?”
  • “Como vamos distribuir nosso tráfego entre nossos componentes?”
  • “Como podemos reduzir a carga em nosso banco de dados?”
  • “Como melhorar a disponibilidade do nosso cache?”
  • “O gateway da API não seria um único ponto de falha?”
  • “Como podemos tornar nosso sistema de notificação mais robusto?”
  • “Como podemos reduzir os custos de armazenamento da mídia”?
  • “O serviço de bate -papo tem muita responsabilidade?”

Para tornar nosso sistema mais resiliente, podemos fazer o seguinte:

  • Executando várias instâncias de cada um de nossos serviços.
  • Apresentando balanceadores de carga entre clientes, servidores, bancos de dados e servidores de cache.
  • Usando várias réplicas de leitura para nossos bancos de dados.
  • Várias instâncias e réplicas para o nosso cache distribuído.
  • Podemos ter uma réplica de espera do nosso gateway de API.
  • Exatamente quando a entrega e a ordem das mensagens é um desafio em um sistema distribuído, podemos usar um corretor de mensagens dedicado, como Apache Kafka ou Nats, para tornar nosso sistema de notificação mais robusto.
  • Podemos adicionar recursos de processamento e compactação de mídia ao serviço de mídia para comprimir arquivos grandes semelhantes ao WhatsApp, que economizarão muito espaço de armazenamento e reduzirão o custo.
  • Podemos criar um serviço de grupo separado do serviço de bate -papo para desacoplar ainda mais nossos serviços.

Este artigo faz parte do meu curso de design de sistema de código aberto disponível no GitHub.

KaranPratapsingh / System-Design

Aprenda a projetar sistemas em escala e se preparar para as entrevistas de design do sistema

Curso de design do sistema

Ei, bem -vindo ao curso. Espero que este curso ofereça uma ótima experiência de aprendizado.

Este curso também está disponível no meu site e como um e -book no LeanPub. Por favor, deixe um ⭐ como motivação se isso foi útil!

Índice

  • Começando
    • O que é design de sistema?
    • IP
    • Modelo OSI
    • TCP e UDP
    • Sistema de nomes de domínio (DNS)
    • Balanceamento de carga
    • Clustering
    • Cache
    • Rede de entrega de conteúdo (CDN)
    • Proxy
    • Disponibilidade
    • Escalabilidade
    • Armazenar
    • Bancos de dados e DBMs
    • Bancos de dados SQL
    • Bancos de dados NoSQL
    • Bancos de dados SQL vs NoSQL
    • Replicação do banco de dados
    • Índices
    • Normalização e desnormalização
    • Modelos de consistência ácida e base
    • Teorema do CAP
    • Teorema do PACELC
    • Transações
    • Transações distribuídas
    • Sharding
    • Hash consistente
    • Federação de banco de dados
    • Arquitetura de N-Tier
    • Corretores de mensagens
    • Filas de mensagens
    • Publicar-Subscribe
    • Bus de serviço corporativo (ESB)
    • Monólitos e microsserviços
    • Arquitetura orientada a eventos (EDA)
    • Fornecimento de eventos
    • Segregação de responsabilidade de comando e consulta (CQRS)
    • API Gateway
    • REST, grafQL, GRPC
    • Pesquisa longa, WebSockets, Eventos de Sever Servidor (SSE)