Protocolo MQTT – alimentando o Facebook Messenger para dispositivos IoT
Resumo:
Mensagens instantâneas ou comunicação em tempo real: atrás da cena
Para muitas pessoas, especialmente aquelas que trabalham com o nó.JS, comunicação em tempo real (RTC) pode parecer familiar. Aplicativos de bate -papo construídos usando o nó.JS se tornou um ponto de partida comum para os desenvolvedores. No entanto, alcançar a verdadeira comunicação em tempo real não é tão fácil quanto parece. Neste artigo, fornecerei uma visão geral das questões práticas enfrentadas por grandes empresas como Facebook, Slack, Discord e Telegram ao lidar com o RTC.
Observe que este artigo se concentra apenas no RTC e não abrange tópicos como design do sistema de banco de dados ou codificação.
Pontos chave:
1. A comunicação em tempo real ainda é um tópico desafiador devido à conectividade de rede instável e outros problemas.
2. Compreender conceitos básicos como comunicação bidirecional, websocket, eventos enviados por servidor, pesquisa curta/longa e MQTT é essencial para o RTC.
3. Analisar os dados trocados entre os navegadores e os servidores dos principais aplicativos de bate -papo pode fornecer informações valiosas.
4. O Facebook Messenger usa o MQTT sobre o WebSocket para enviar/receber mensagens, digitação e outros recursos.
5. O Instagram também utiliza o MQTT sobre o WebSocket, mas com chamadas de API adicionais para recursos como visualização de mensagens e listas de usuários.
6. O telegrama depende apenas do WebSocket para todos os seus recursos.
7. Slack e Discord combinam WebSocket e API exige diferentes funcionalidades.
8. Zalo usa a API e a Polling HTTP longa para receber mensagens e outros recursos.
9. Grandes empresas dependem fortemente do WebSocket/TCP para comunicação em tempo real.
10. A combinação do WebSocket com as chamadas da API facilita a dimensionamento e o gerenciamento do sistema.
Questões:
1. O que as tecnologias fazem o Facebook Messenger e o Instagram usam para comunicação em tempo real?
Tanto o Facebook Messenger quanto o Instagram usam o MQTT sobre a WebSocket para comunicação em tempo real.
2. Quais são alguns recursos suportados pelo sistema de comunicação em tempo real do Facebook Messenger?
O sistema de comunicação em tempo real do Facebook Messenger suporta recursos como enviar/receber mensagens, digitação e solicitações.
3. Como o sistema de comunicação em tempo real do Instagram difere do Facebook Messenger’s?
Enquanto o Instagram também usa o MQTT sobre o WebSocket para comunicação em tempo real, ele também depende de chamadas de API para funcionalidades como visualizar mensagens e listas de usuários.
4. Qual tecnologia usa telegrama para comunicação em tempo real?
O telegrama depende apenas do WebSocket para todos os seus recursos de comunicação em tempo real.
5. Como funciona o sistema de comunicação em tempo real do Slack?
O Slack combina chamadas WebSocket e API para ativar o recebimento e digitação de mensagens em tempo real, além de funcionalidades como listar itens e enviar mensagens.
6. Qual é a tecnologia por trás do sistema de comunicação em tempo real da Discord?
O sistema de comunicação em tempo real da Discord utiliza chamadas WebSocket e API para receber mensagens, listar itens, enviar mensagens, digitar e ver funcionalidade.
7. Como o Zalo lida com a comunicação em tempo real?
Zalo usa uma combinação de Pollings de API e HTTP para comunicação em tempo real. Ele suporta recursos como receber mensagens, listar itens, enviar mensagens, digitar e ver funcionalidades.
8. O que as grandes empresas confiam para a comunicação em tempo real?
Grandes empresas dependem fortemente do WebSocket/TCP para comunicação em tempo real.
9. Que vantagens combinam o WebSocket com as chamadas da API oferecem?
A combinação do WebSocket com as chamadas da API facilita a dimensionamento e o gerenciamento do sistema de comunicação em tempo real. As chamadas da API podem ser usadas para enviar mensagens de clientes e podem utilizar as camadas de middleware existentes para autenticação, autorização e limitação de taxa.
10. Por que algumas empresas usam uma combinação de chamadas WebSocket e API?
O uso de chamadas WebSocket e API permite que as empresas alavancem a escalabilidade das APIs HTTP para certas funcionalidades enquanto desfrutam dos benefícios do WebSocket para transmissão de mensagens em tempo real. Além disso, permite a reutilização de camadas de middleware existente e simplifica o processo de escala.
11. Por que o sistema de comunicação em tempo real do Instagram difere do Facebook Messenger’s?
O Instagram foi desenvolvido inicialmente separadamente do Facebook e é adquirido posteriormente. Portanto, pode haver diferenças nos sistemas de sincronização usados pelo Facebook (baseado em Websocket) e pelo sistema existente do Instagram.
12. Qual é o significado de entender conceitos básicos como WebSocket e MQTT para comunicação em tempo real?
Conceitos básicos como WebSocket e MQTT são essenciais para entender a comunicação em tempo real e permitir que os desenvolvedores construam sistemas mais eficientes e confiáveis.
13. Como os tutoriais para criar aplicativos de bate -papo usando o nó.JS ajuda os desenvolvedores?
Tutoriais sobre a criação de aplicativos de bate -papo usando o nó.Os JS fornecem aos desenvolvedores a autoconfiança necessária para iniciar sua jornada de comunicação em tempo real. No entanto, eles devem estar cientes de que a construção de um sistema de comunicação verdadeiramente em tempo real envolve a superação de vários desafios.
14. Por que escalar um servidor websocket está uma tarefa não trivial?
Escalar um servidor WebSocket é uma tarefa não trivial porque o WebSocket é um protocolo de comunicação com estado que exige manter uma única conexão persistente aberta. Embora o WebSocket seja eficiente para enviar mensagens de servidores para clientes, usá -lo para outras tarefas lógicas, como gravar mensagens de clientes, pode ser um desafio.
15. Qual é o objetivo de inspecionar os dados trocados entre navegadores e servidores dos principais aplicativos de bate -papo?
Inspecionar os dados trocados entre os navegadores e servidores dos principais aplicativos de bate-papo permite que os desenvolvedores obtenham informações sobre a implementação prática da comunicação em tempo real e aprendam com os sistemas existentes.
Protocolo MQTT – alimentando o Facebook Messenger para dispositivos IoT
Cargas úteis de mensagens são codificadas em binário. Em uma rede aberta, onde o destinatário é de um fabricante diferente enfrentará problemas.
Mensagens instantâneas ou comunicação em tempo real: atrás da cena
Para muitas pessoas, especialmente os caras que trabalham com o nó.JS, este tópico não é muito novo. Existem muitos tutoriais como “Crie um aplicativo de bate -papo simples usando o nó.JS”, “Aplicativo de bate -papo em tempo real usando o nó.JS Express e Socket.io”, etc. Eles de alguma forma fazem os aplicativos de bate -papo se tornarem um “Olá Mundo” Para qualquer um de nós que deseja começar nossa jornada com o nó.JS. O bom da existência deles é lhe dar autoconfiança. Até certo ponto, como você não está confiante se é capaz de construir algo como o Facebook Messenger em tão pouco tempo (1h talvez?)? O ruim é que Não é tão fácil.
O fato é que, não importa quanto esforço tenha sido proposto, a comunicação em tempo real (RTC) ainda é um tópico quente na comunidade e na comunidade acadêmica. Devido a muitos impactos fora de controle, em termos de conectividade de rede instável, conexão duplicada/conflito, mensagem duplicada, etc., É um desafio obter uma experiência real em tempo real (não, não é o que você sente como terminando os tutoriais do Hello-World. Neste post, fornecerei a você uma visão geral de questões práticas que foram consideradas por caras grandes como Facebook, Slack, Discord, Telegram, etc.
Observe que, como se trata apenas de comunicação em tempo real, sugiro que você dê uma olhada em conceitos básicos, como comunicação bidirecional, websocket, eventos enviados pelo servidor, pesquisa curta/longa, MQTT. Além disso, não se trata de design ou seleção ou codificação do sistema DB, apenas RTC.
De caras grandes
O que você faria se seu chefe pedir que você construa um sistema de bate -papo como o Facebook Messenger ou o WhatsApp? Aqui está a lista que você pode passar:
- Encontre o tutorial?
- Design do sistema Ebook
- Projetar um aplicativo de bate -papo para milhões de usuários em educação educativa.io
- Felizmente, o blog de engenharia do Facebook vazou algo sobre o trabalho deles
- Google “Como fazer um aplicativo de bate -papo” com mais de 3 bilhões de resultados.
Mas há uma etapa essencial que você deve fazer, desde o início ou depois de todas essas etapas: abra seu aplicativo da web, inspecione os dados trocados entre navegadores e servidores. Que’s O que vou mostrar na próxima seção, com base nos principais recursos de um back -end de bate -papo:
- Listos de tópicos, listar mensagens
- Enviar mensagem
- Receber mensagem
- Digitando
- Visto
Facebook Messenger
Tecnologia: MQTT sobre WebSocket
Recurso: Enviar/receber mensagens, digitar, solicitar, etc. em todo o webSocket
Veja os dados de resposta das solicitações da WebSocket para seus bate-papo.mensageiro.com. Todos os pedidos para carregar dados, listar itens, enviar/receber mensagens, digitando, são executados por meio de mensagens de publicação e assinando o WebSocket, não a API.
Mesma empresa e, portanto, as mesmas tecnologias. Mas não a mesma origem, portanto, com alguma diferença.
Tecnologia: MQTT sobre WebSocket + API
Recurso: Enviar/receber mensagens e digitar sobre o WebSocket, listar itens, visto, listar o usuário online, etc. sobre API.
Telegrama
Tecnologia: WebSocket
Recurso: em todo o webSocket
Folga
Tecnologia: Websocket + API
Recurso: Receba mensagens e digitando o websocket, liste itens, enviando mensagens sobre a API.
Discórdia
Tecnologia: Websocket + API
Recurso: Receba mensagens sobre o WebSocket, listar itens, enviar mensagens, digitando, visto na API.
Zalo
Tecnologia: API e Pollings HTTP
Recurso: Receba mensagens sobre pesquisas longas HTTP, listar itens, enviar mensagens, digitando, visto na API.
Nossa vez
Então, criamos algumas observações:
- Caras grandes dependem completamente do WebSocket/TCP
- Não é muito grande combinar WebSocket para receber mensagens do servidor e da API para enviar mensagens para o servidor.
- Caso Zalo – sem ideia
Aqui estão alguns dos meus pensamentos:
- Embora o desempenho do uso do WebSocket seja muito melhor do que chamar solicitações HTTP, o Scaling Websocket Server é uma tarefa não trivial, pois é um protocolo de comunicação com estado, pois mantém uma conexão única e persistente aberta. Assim, é usado apenas para servidores para enviar mensagens para clientes. Se você o usar para outras tarefas lógicas, como gravar mensagens de clientes, está pedindo para fazer o que não deve fazer.
- A API HTTP é útil para enviar mensagens de clientes, pois as APIs sem estado de escala é muito mais fácil do que em escalar o WebSocket. Além disso, pode reutilizar as camadas existentes de middleware para autenticação, autorização, limite de taxa, etc.
- Para aqueles que podem criar sistemas escalonáveis do WebSocket, é preferível mover completamente as solicitações HTTP para usar o WebSocket para otimizar a transmissão de mensagens. Requer sincronização de todo o mecanismo de solicitar dados, mesmo para tarefas que não sejam de tempo real.
- É compreensível que o Instagram seja comprado, não desenvolvido originalmente pelo Facebook, deve haver uma lacuna entre o Facebook’S Sistema de Sincronização (baseado em Websocket) e o Instagram existente um.
- Para aplicativos como Slack, Discord, eles aproveitam a escalabilidade das APIs HTTP e usam apenas o WebSocket para enviar mensagens de servidores ou para solicitações de alta taxa, como digitar.
- A abordagem que Zalo segue pode ser explicada por 3 vantagens i) Apoiando navegadores muito antigos com compatibilidade de pesquisa longa HTTP, não WebSocket, ii) Web Zalo pode ser uma versão extra para o zalo móvel, iii).
Da próxima vez, se você ouvir alguém sugerindo usar totalmente o WebSocket para enviar e receber mensagens, o cara deve ser:
- Novo nos requisitos em tempo real e na falta de experiência prática e no final do dia, o sistema é difícil de ser escalado e incapaz de lidar à medida que a demanda de tráfego aumenta.
- Ou, muito, muito experiência em sistemas em larga escala, como o Facebook ou Telegram.
Por trás da cena
Nesta última seção, vamos’S (teoricamente) experimenta coisas (dores no a **) que os professores do Hello-World nunca tiveram a chance de lhe contar.
Soquete.io?
Esta biblioteca parece ser uma panacéia mágica, pois nos ajuda a fazer tarefas chatas como a criação de um servidor, pingue/pong, manter vivo, loja de lojas, blá blá. Todos vocês poderiam começar com isso se trabalhar com o nó em tempo real.JS. Infelizmente, há coisas que você enfrentará tão profundamente.
- Sem mecanismo de QoS. Em breve você sentirá desconforto quando a rede no lado do cliente não for tão estável como o esperado. As mensagens são perdidas enquanto a conectividade continua subindo e descendo e soquete.io – sem garantir a QoS, pode’não é confiável.
- Escala? Quando um nó WebSocket estiver sobrecarregado, você o ampliará. Que’é o que você normalmente faz, correto? Neste momento, o adaptador Redis virá a cena como uma ponte entre nós via Redis Pubsub. O problema é que o mecanismo de retorno de chamada de contagem do pubsub de acordo com o número de nós físicos resultou em vários problemas ao se apegar a outros processos que emitem mensagens. E também porque o Redis Pubsub é usado em todo o servidor Redis, em vez do número do banco de dados, as mensagens de diferentes ambientes são facilmente bagunçadas.
- Quebra de versão. Até agora, soquete.O IO ainda está em desenvolvimento e alguns recursos estão disponíveis apenas na versão mais recente. No momento em que o adotamos, as peças de texto e adaptadores não foram concluídos e houve muitos erros durante a fase de desenvolvimento.
- ACK por retorno de chamada. Eu não’T gosto de retorno de chamada, isso’sentar. Eu só uso fogo e esquecer eventos, não mais, porque eu não’Eu acho que sou totalmente capaz de lidar com qualquer consequência de usar o excesso de retorno de chamada.
- Ping/pongue instável: Mesmo com boa conectividade, soquete.io O cliente ainda se desconecta frequentemente após um período de tempo, independentemente da mudança de tempo de tempo padrão de ping/pong ou aumento do tempo limite para o balanceador de carga. Todos esses problemas foram abertos e, se você o tiver, é simplesmente que você não tem sorte.
Em geral, soquete.io faz seu trabalho em um nível básico. Para adotá -lo para um projeto real com requisitos de estabilidade, ainda há muitos trabalhos para fazer, eu.e. Garantia de QoS, escalando, rastreando esta rastreamento que. A parte mais desafiadora é sincronizar o estado do cliente e do servidor quando a desconexão ocorre.
Mqtt
O MQTT é popular em aplicativos de IoT devido aos seus pequenos dados de transmissão e, portanto, é adequado para a rede não confiável de dispositivos inteligentes. Ele foi projetado com pub/sub mecanismo e possui bons recursos internos, como QoS, sessão persistente, a última fará a mensagem. Este é o protocolo usado pelo Facebook para seu aplicativo em tempo real, conforme mencionado-MQTT sobre o WebSocket.
Tentamos porque queremos que nosso aplicativo chegue ao topo do mundo. Mas, novamente, não é tão fácil.
- Mudando nossa mentalidade. Não há conceitos como quarto ou back -end de roteamento no MQTT. O quarto deve gerenciar no back -end de soquete.io e facilitar a criação da sala de bate -papo, inserção de novos usuários e emissão automática de mensagens para salas de bate -papo. Com o MQTT, você precisa gerenciar espaço sozinho, emitir mensagens para cada tópico por si mesmo, porque como o tópico é ouvido depende do cliente. A assinatura de um determinado tópico acontece somente após o estabelecimento da conectividade enquanto você está limitado ao forçar os clientes a cancelar a inscrição ou assinar novos tópicos.
- Escala? Não, é apenas marketing ou anúncio, como você chama, quando caras como Mosquitto, Vernemq ou Emq X dizem que podem escalar muito bem. Quando tentamos vários desses corretores de mensagens para grupos com alta demanda de tráfego, muitos problemas vêm e eles são dolorosos demais para consertar um por um. C’est la vie, Você usa os produtos deles, depende deles e se eles não’t conserte o problema, o que podemos dizer?
- Conexão de conflito. Isso é muito complicado no lado do cliente. Para alavancar o recurso de sessão persistente, precisamos manter o ID do cliente inalterado-o que é uma tarefa desafiadora se o aplicativo não estiver bem codificado. Muitas vezes, embora apenas 1 instância de conexão MQTT seja definida, realmente não tínhamos idéia de como diabos várias instâncias com o mesmo id poderia existir. Como resultado, os clientes chutam um ao outro e nenhum deles pode se conectar. Nesses casos, ninguém menos que os caras do front -end podem solucionar o problema.
- Segurança. É mais difícil atender aos requisitos de segurança para um sistema MQTT e para um soquete.io um, principalmente por causa da organização do tópico e padrão de assinatura.
Se você perceber, pode descobrir que o MQTT é mais vulnerável que a abordagem da API. Os problemas de segurança vêm não apenas de nossa implementação, mas também de corretores de mensagens de terceiros. Um problema de segurança no EMQ X, permitindo ignorar o Auth para enviar dados falsos para outros clientes, foi corrigida em nossa equipe e ainda é um problema em aberto. Pelo menos, a implementação do MQTT melhora a confiabilidade do nosso sistema de bate -papo, evita a falta de mensagens como anteriormente.
Conclusão
A comunicação em tempo real é um problema desafiador e requer muito conhecimento e experiência. O mesmo requisito, eu.e. “um mensageiro como o Facebook” pode ser feito em 1h, 3h, e também alguns anos, dependendo da situação.
Reconhecer
Eu gostaria de enviar meus grandes agradecimentos a Quang Minh (um.k.um Minc Monmen) para a permissão para traduzir sua postagem original.
Protocolo MQTT – alimentando o Facebook Messenger para dispositivos IoT
COMPARTILHAR
- Facebook Instagram -> Google+ GooglePlus -> Copy ->
Em 2011, Lucy Zhang, Ben Davenport e Jon Perlow se juntaram ao Facebook e começaram a construir o Facebook Messenger. Um grande obstáculo em seu empreendimento foi de longa latência ao enviar uma mensagem. O método que eles estavam usando para enviar mensagens foi confiável, mas lento. Eles também foram capazes de otimizá -lo até certo ponto. Algumas semanas antes do lançamento, eles exploraram o protocolo de transporte de telemetria de fila de mensagens (MQTT). Com a ajuda do MQTT, Lucy Zhang e Team foi capaz de estabelecer e manter uma conexão persistente com os servidores do Facebook sem reduzir a duração da bateria.
Então, o que é o protocolo MQTT?
Criado em 1999 por DR. Andy Stanford-Clark, da IBM, e Arlen Nipper, da Arcom, MQTT é um protocolo de mensagens leves no topo do protocolo TCP/IP. O MQTT foi projetado para dispositivos restritos (dispositivos com baixa memória e largura de banda de rede) e redes sem fio com níveis variados de latência devido a conexão não confiável.
O protocolo MQTT é um cliente-servidor, editor/assinante, open e protocolo de transporte de mensagens leves. No coração de MQTT está o ponto de comunicação central conhecido como corretor MQTT. É responsável por dispersar mensagens para clientes legítimos.
Cada cliente que publica uma mensagem para o corretor MQTT inclui as informações de roteamento, conhecidas como tópico. Os clientes podem assinar vários tópicos e corretor todas as mensagens publicadas correspondendo ao tópico. Os clientes não’Temos que nos conhecer para receber informações; Eles só precisam se inscrever em tópicos relevantes.
Por exemplo, imagine uma rede simples de três clientes, eu.E A, B e C, onde cada um está conectado a um corretor por meio de uma conexão TCP. Client-B e Client-C assinam o Tópico: Temperatura.
Client-A publica 34.5 para a temperatura do tópico. O corretor identifica isso e encaminha esta mensagem a todos os assinantes, que neste caso são Client-B e Client-C.
A arquitetura do MQTT do editor-assinante do editor o torna uma solução altamente escalável, sem criar dependências entre produtores de dados e consumidores.
Formato de mensagem do protocolo MQTT
Todas as mensagens do MQTT têm uma pequena pegada de código, por isso é popular como um protocolo de mensagens leves. Cada mensagem MQTT consiste no seguinte:
- Cabeçalho fixo (2 bytes)
- Cabeçalho variável opcional
- Carga útil da mensagem (
- Nível de qualidade de serviço (QoS)
O MQTT suporta comunicação individual, um para muitos e muitos para muitos.
Ao diminuir a quantidade de dados transmitidos, o MQTT se torna um protocolo perfeito para dispositivos IoT restritos.
Cargas úteis de mensagens são codificadas em binário. Em uma rede aberta, onde o destinatário é de um fabricante diferente enfrentará problemas.
Nível de qualidade de serviço (QoS) para o protocolo MQTT
A qualidade dos níveis de serviço determina como o conteúdo é gerenciado. MQTT usa três níveis de QoS diferentes. É importante escolher o nível de QoS certo para cada mensagem, pois determina como o cliente e o servidor se comunicam para entregar a mensagem. Os níveis de QoS de MQTT são os seguintes:
- QoS 0 : Mensagens entregues de acordo com os melhores esforços do ambiente operacional, mas a perda de mensagens pode ocorrer
- QoS 1 : Entrega de mensagens garantida, mas duplicatas podem ser criadas
- QoS 2 : Mensagem para entregar exatamente uma vez
O MQTT nos oferece uma opção para definir o nível de QoS apropriado, mas lembre -se, mais alto o QoS, diminua o desempenho .
Segurança do protocolo MQTT
O MQTT permite que você passe o nome de usuário e a senha como um pacote MQTT. A criptografia de uma mensagem em toda a rede pode ser tratada independentemente do MQTT com camada de soquetes seguros (SSL). Tem um recurso de autenticação mínimo incorporado. Nome de usuário e senha são enviados como texto claro. Para torná -lo seguro de camada de soquetes seguros (SSL)/ Segurança da camada de transporte (TLS) deve ser empregada, mas SSL/ TLS não é um protocolo leve.
Muitos especialistas do setor acreditam que o MQTT desempenhará um papel importante na IoT, contribuindo para campos como rastreamento de inventário e IoT médico..
Messenger usa MQTT
Na terça-feira, apresentamos o Facebook Messenger, um novo aplicativo de mensagens independentes que permite que as pessoas enviem mensagens 1-em-1 ou para grupos de amigos. Entrei para o Facebook há cinco meses com meus outros co-fundadores, Ben Davenport e Jon Perlow, que trabalharam comigo para construir um aplicativo de mensagens em grupo chamado Beluga. Nosso novo aplicativo, Facebook Messenger, representa o melhor dos dois mundos – combina a facilidade e a simplicidade de Beluga com a escala e a integração das mensagens do Facebook.
Eu tive algumas experiências de vida que me levaram a criar beluga. Por exemplo, um grupo de nós estava se encontrando para um filme no Festival de Cinema de Tribeca em Nova York, mas a hora que levou o filme foi uma falha total de comunicação. Eu tinha um amigo mensagens de texto para me dizer que outro amigo estava atrasado. Estávamos salvando um ingresso para outro amigo, mas ele decidiu não vir e ninguém sabia. Não era’até horas depois, quando voltei para casa, vi um IM do amigo que estava atrasado e um e -mail do amigo que havia socorrido. Acreditamos que o Facebook Messenger’A capacidade de integrar bate -papo, mensagens de texto e e -mail ajuda a resolver esse problema exato.
Começamos a construir Beluga como uma ferramenta para coordenação em grupo, mas descobrimos que a comunicação instantânea e leve, privada e instantânea, pode mudar a maneira como um grupo de pessoas se conecta muito mais amplamente. Em vez de enviar por e -mail as fotos de férias semanas após uma viagem, as pessoas começam a compartilhar mais no momento. A natureza instantânea das mensagens permite que as conversas em grupo iniciem espontaneamente e preenche a lacuna entre pessoas que se conectam de seus computadores e aqueles em dispositivos móveis. Mensageiro’A integração com o bate -papo no Facebook agora torna esse cenário uma realidade.
Mergulhando em novas águas
Quando ingressamos no Facebook e começamos a construir o Messenger, nosso primeiro desafio técnico foi aprender toda a pilha de infraestrutura para mensagens do Facebook. Foi ótimo estar construindo em uma plataforma escalável que já havia lançado para centenas de milhões de usuários, mas o sistema continha certas suposições e decisões de design que não fizeram’sempre bastante combina com o produto que queríamos construir. Felizmente, nossos novos colegas também ficaram empolgados com a visão de Messenger e se juntaram ao esforço para garantir que o sistema pudesse fazer o que precisávamos.
Um dos problemas que enfrentamos foi uma longa latência ao enviar uma mensagem. O método que estávamos usando para enviar era confiável, mas lento, e havia limitações de quanto poderíamos melhorá -lo. Faltando apenas algumas semanas até o lançamento, acabamos construindo um novo mecanismo que mantém uma conexão persistente com nossos servidores. Para fazer isso sem matar a duração da bateria, usamos um protocolo chamado MQTT que tínhamos experimentado em Beluga. O MQTT é projetado especificamente para aplicações como enviar dados de telemetria de e para sondas espaciais, por isso foi projetado para usar largura de banda e baterias com moderação. Ao manter uma conexão MQTT e de rotear mensagens através do nosso pipeline de bate-papo, conseguimos obter entrega de telefone a telefone nas centenas de milissegundos, em vez de vários segundos.
Além do desempenho e dos problemas de integração do sistema, os maiores desafios foram realmente decisões de produtos sobre como integrar perfeitamente diferentes canais de comunicação com diferentes expectativas do usuário. As pessoas se comunicam de maneira diferente no bate -papo do que no telefone – por exemplo, você pode iniciar uma conversa de bate -papo com “Ei você aí?” Mas você provavelmente não’t mande isso como um texto, porque é claro a pessoa’está lá! Você pode tentar tornar o sistema inteligente e fazer o “certo” coisa em muitos casos diferentes, mas se você tornar as regras muito complexas, pode parecer também “mágico” e não como um canal de comunicação confiável.
Para garantir que o Messenger se sentisse certo, testamos constantemente projetos diferentes com nossos colegas. Ao lançarmos as construções para cada vez mais pessoas no Facebook, recebemos ainda mais feedback e aprendemos onde nossas suposições eram diferidas da realidade. Nós’Estou tão animado para finalmente lançar o Facebook Messenger para o público – e estamos ansiosos para obter feedback de milhões a mais pessoas.
Esperamos que você goste de usar o Facebook Messenger tanto quanto gostamos de construí -lo!
Lucy Zhang, engenheiro de software, espera nunca ter dificuldade em coordenar a noite do cinema novamente.
Como fazer um mensageiro legal que funciona rápido com uma internet fraca
Por que você deve usar o MQTT e o nó.JS para mensagens em tempo real
9 min de leitura
23 de maio de 2017
Atualmente, mais e mais aplicativos que desenvolvemos no S-Pro exigem mensagens em tempo real e transferência de dados. Na maioria dos casos, usamos o soquete.Biblioteca de IO para Nó.JS. No entanto, existem alternativas que têm suas vantagens. MQTT (Transporte de telemetria da fila de mensagens) é um deles. E essa’é o que nós’Eu falarei aqui!
O que é MQTT
“É um protocolo de mensagens de publicação/assinatura, extremamente simples e leve, projetado para dispositivos restritos e redes de baixa largura de banda, alta latência ou não confiáveis. Os princípios de design são minimizar os requisitos de largura de banda de rede e recursos de dispositivo, além de tentar garantir a confiabilidade e algum grau de garantia da entrega. Esses princípios também acabam para tornar o protocolo ideal para os emergentes “máquina a máquina” (M2m) ou “Internet das Coisas” Mundial de dispositivos conectados e para aplicativos móveis em que a largura de banda e a energia da bateria estão em um prêmio.” – http: // mqtt.Org/FAQ
Assim, o MQTT é um protocolo de rede simplificado que percorre TCP/IP. Ajuda a trocar mensagens entre dispositivos via padrão de assinatura de publicação. A primeira versão do protocolo foi desenvolvida por DR. Andy Stanford-Clark (IBM) e Arlen Nipper (Arcom) em 1999 e publicados sob uma licença sem royalties. O MQTT 3.1.1 Especificação foi padronizada pelo Oasis Consortium em 2014.
Por que você vai gostar?
- Fácil de usar. O protocolo é uma unidade de programa sem funcionalidade adicional, que pode ser facilmente integrada a qualquer sistema complexo.
- O padrão de inscrição de publicação é conveniente para a maioria das soluções. Ele permite que os dispositivos se comuniquem e publiquem/recebam mensagens que não eram conhecidas ou predefinidas.
- Fácil de gerenciar.
- A carga no canal de comunicação é reduzida.
- Funciona com uma conexão lenta ou instável.
- Não há restrição no formato do conteúdo transmitido.
E quanto aos benefícios?
- binário
- Overhead baixo (mais de 2 bytes)
- nível de QoS múltiplo
- mensagens offline
- tópico WildCards +, #
- Mensagens retidas, Última vontade e testamento, batimentos cardíacos e outras coisas ..
Deixar’s olha para isso!
Binário e baixo sobrecarga
Há uma sobrecarga muito baixa na estrutura dos dados binários transmitidos. Isso significa que, em comparação com muitos outros protocolos (por exemplo, com HTTP), quase não carrega a rede com a transferência de informações, o que é necessário apenas para o funcionamento do protocolo. De acordo com as medidas feitas em redes 3G, o MQTT’A capacidade de s é 93 vezes maior que o protocolo REST (Representational State Transfer) possui que percorre http.
Nível de QoS múltiplo
O MQTT pode especificar o nível de qualidade do serviço (QoS). Em geral, existem três níveis:
- QoS 0. O destinatário não confirma o recebimento das mensagens. O remetente, consequentemente, transmite a mensagem apenas uma vez, sem tentar retransmitir no futuro. Isto é o “Envie e esqueça” método.
- QoS 1. É garantido que o receptor recebe uma mensagem pelo menos uma vez. Nesse caso, o assinante pode receber a mesma mensagem várias vezes. E o remetente fará tentativas repetidas de enviar até receber uma confirmação da entrega bem -sucedida da mensagem.
- QoS 2. O procedimento de entrega de mensagem mais lento corresponde a esse nível de qualidade do serviço, mas é o mais confiável. Sua principal característica é a implementação do “Entrega de mensagem única” estratégia. Ele fornece um procedimento de confirmação de entrega de mensagens em quatro etapas.
Você escolhe um nível específico de qualidade de serviço com base em:
- as características dos dados transmitidos
- a importância disso para ser entregue.
Mensagens offline/sessão persistente
Esta opção pode ser ativada ou desativada. Quando “0” está definido, o corretor salva a sessão e todo o cliente’s assinaturas. Na próxima vez que a conexão for estabelecida, mostra todas as mensagens do QOS1 e QOS2 que foram recebidas pelo corretor durante a desconexão. Consequentemente, quando “1” está definido e a conexão é renovada, o cliente precisará recorrer novamente aos tópicos.
Tópico Wildcards
Um tópico é uma string UTF-8, usada pelo corretor para filtrar mensagens para cada cliente conectado. Um tópico consiste em um ou mais níveis de tópico. Cada nível de tópico é separado por uma barra para frente (separador de nível de tópico).
Quando um cliente se inscreve em um tópico, ele pode usar o tópico exato para o qual a mensagem foi publicada ou pode se inscrever em mais tópicos de uma só vez usando Wildcards.
Um curinga de nível único é um substituto para um nível de tópico. O símbolo Plus representa um curinga de nível único no tópico.
Enquanto o curinga de nível único cobre apenas um nível de tópico, o curinga de vários níveis cobre um número arbitrário de níveis de tópico. Para determinar os tópicos correspondentes, é necessário que o curinga de vários níveis seja sempre o último personagem do tópico e é precedido por uma barra para a frente.
Outras características
Além disso, o MQTT possui outros recursos interessantes, como mensagens retidas, última vontade e testamento e batimentos cardíacos. Nós ganhamos’t Cubra -os neste artigo, mas as informações estão amplamente disponíveis na Internet. Então, se você estiver interessado, vá em frente.
Corretores e clientes para o nó.JS
Deixar’s fazer algum código! Nesta seção, nós’mostrarei a você como você pode obter uma solução funcionando com o nó.JS. Você também’eu conhecerá alguns módulos. Deixar’está tentando implementar esse esquema na prática.
O MQTT requer um corretor, que é o coração de qualquer protocolo de publicação/assinatura. O corretor é o principal responsável por receber todas as mensagens, filtrá -las, decidir quem está interessado nelas e depois enviar a mensagem a todos os clientes inscritos.
Como corretor, usaremos Mosca.
Mosca é um corretor MQTT como um módulo NPM. Você pode usá -lo tanto na linha de comando quanto no módulo NPM. Nesse caso, nós o usaremos como um módulo.
Para apoiar mensagens offline, usaremos Ascoltatori com MongoDB. Em geral, ascoltatori é uma biblioteca simples de publicação/subscrição que suporta os seguintes corretores/protocolos:
- Redis, uma loja de chave/valor criada por @antirez.
- MongoDB, Um banco de dados escalável, de alto desempenho e orientado a documentos.
- Mosquitto e todas as implementações do Mqtt protocolo.
- RabbitMQ e todas as implementações do AMQP protocolo.
- Zeromq Para usar ascoltatori de maneira P2P.
- Qlobberfsq, uma fila de sistema de arquivos compartilhada.
- Apache Kafka, Um sistema de mensagens distribuído de alto rendimento.
- Roteamento somente de memória, usando Qlobber.
Você pode ver o código de back -end abaixo. Este é o código de um servidor de trabalho real que inclui um corretor MQTT, um servidor HTTPS para suportar o recebimento de pacotes MQTT via websockets, um adaptador ascoltatori para salvar mensagens no banco de dados MongoDB.
// requer corretor MQTTvar Mosca = requer ('Mosca');// Defina conexão com MongoDBvar monongo_con = 'mongodb: // localhost: 27017/mqtt';// essas configurações são necessárias para ativar o recurso de sessão persistente.// Todas as mensagens serão armazenadas em MongoDBvar ascoltatore = Tipo: 'Mongo',URL: MONGO_CON,PubSubCollection: 'Ascoltatori',Mongo: <>>;// Configurações finais para Mosca MQTT BrokerVAR Configurações = Porto: 1883,Back -end: Ascoltatore,persistência: Fábrica: Mosca.persistência.Mongo,URL: MONGO_CON>>;// Defina servidores HTTP e MQTTvar http = requer ('http'),httpServ = http.CreateServer (),mqttServ = new Mosca.Servidor (configurações);// Anexe HTTP ao servidor MQTTMQTTSERV.aptachhttpServer (httpServ);httpserv.Ouça (3000);// aciona quando o servidor MQTT está pronto para aceitar solicitaçõesMQTTSERV.em ('pronto', pronto);// desencadeia quando a nova mensagem é publicadaMQTTSERV.ON ('Publicado', função (pacote, cliente) console.log (pacote.tópico + ':' + pacote.carga útil);>);função pronta () console.log ('Mosca Server está em funcionamento');>
Para implementar o cliente MQTT, usaremos o NPM MQTT.Módulo JS.
// requer biblioteca MQTTvar mqtt = requer ('mqtt');// Defina o cliente conectando ao nosso servidor MQTT// limpo: false significa não iniciar uma nova sessão em reconectar// Isso nos permite usar o recurso de sessões persistentes do protocolo MQTT// Além disso, o clientID deve ser um único para cada string de clientevar client = mqtt.Connect ('mqtt: // localhost', Limpo: Falso,ClientID: 'Console_client'>);// gatilhos no Connect// CleanT assina sobre o tópico com QoS: 1, o que significa nível de QoS. O cliente estará recebendo todas as mensagens em reconectar.// então ele publica nova mensagem para tópico. Esta mensagem será armazenada em banco de dados e enviada para assinantes. Os assinantes offline com QoS 1 receberão o Reconnect.//cliente.on ('Connect', function () cliente.assine ('/hello/s-pro',);cliente.Publish ('/hello/s-pro', 'Olá, S-Pro!',);>);// Faça algo quando a nova mensagem chegar.cliente.em ('mensagem', função (tópico, mensagem) console.log (tópico + ':' + mensagem.para sequenciar());>);
Deixar’s Considere mais um exemplo do cliente’S implementação. Nesse caso, será MQTT sobre os websockets. Este exemplo será especialmente útil para clientes que trabalham com navegadores ou aplicativos móveis híbridos.
Todo o código será semelhante ao anterior. A única diferença é o cliente’definição s.
cliente = mqtt.Connect ('ws: // mqtt.tk: 3000/mqtt ', Limpo: Falso,ClientID: Nome de usuário>);
Como você pode ver, aqui nos conectamos ao nosso servidor via soquetes. Você pode encontrar o código de trabalho em nosso Github. Todos os exemplos do código funcionam perfeitamente, e eles foram usados pelo autor durante a apresentação como um exemplo vivo.
Escalabilidade
Esta seção está além do escopo deste artigo por causa de sua vastidão. Mas isso’é importante mencionar até que ponto esta solução é expansível. Você pode criar uma infraestrutura MQTT escalável usando o nó.JS, Redis, Haproxy com bastante facilidade. Outra opção é usar o apache kafka. No final do artigo, você’verá várias referências a soluções interessantes nesta área.
Conclusão
Então, neste artigo, examinamos e testamos na prática como é fácil usar o protocolo MQTT para mensagens usando JavaScript e Node.JS. O corretor de Mosca pode ser usado no lado do servidor. Além disso, ele suporta WebSockets. Ou seja, se necessário, você pode receber mensagens de dispositivos IoT e transferi -los para aplicativos móveis ou de desktop sobre o TCP via websockets. Além disso, o MQTT é muito escalável. Mas mesmo sem isso, é muito rápido e pode processar 10k+ mensagens por segundo de 10k+ conexões simultâneas.
Se você gostou disso, mostre seu apoio batendo palmas para compartilhar com outras pessoas no meio.