Ao longo da minha jornada estudando tecnologias de comunicação em tempo real, cheguei inevitavelmente ao XMPP e ao Ejabberd. Apesar de ambos existirem há muitos anos, percebi que eles continuam extremamente relevantes, principalmente quando começamos a estudar arquitetura distribuída, mensageria, chats corporativos, IoT e protocolos descentralizados.
Hoje quero registrar, em primeira pessoa, tudo o que aprendi até agora — não como alguém que já domina a tecnologia, mas como alguém explorando, descobrindo, quebrando a cabeça e anotando os melhores caminhos.
Começando pelo básico: O que é XMPP e por que ele importa?
Quando comecei a estudar XMPP, a primeira coisa que me chamou atenção foi sua filosofia descentralizada. Ao contrário de soluções modernas baseadas em APIs privadas, XMPP nasce com a ideia de:
-
comunicação distribuída
-
servidores independentes
-
extensibilidade
-
foco em interoperabilidade
Em vez de pensar em um servidor monolítico que gerencia tudo, o XMPP funciona parecido com o conceito de e-mail:
cada servidor pode falar com outro, cada usuário tem um endereço único, e ninguém precisa depender de uma empresa gigantesca para se comunicar.
Esse formato descentralizado me pareceu extremamente atual quando pensamos em privacidade, segurança digital e futuro da internet.
Como visualizei um usuário XMPP
A forma de endereço de usuários foi uma das primeiras coisas que estudei. É chamada de JID (Jabber ID):
Ou, de forma completa:
O resource representa o dispositivo ou sessão. Por exemplo:
Achei fantástico que XMPP suporta várias sessões simultâneas, com prioridade de mensagem. Algo nativo, sem gambiarras.
Por que escolhi estudar Ejabberd?
Existem vários servidores XMPP, como Prosody, Openfire e Tigase.
A escolha do Ejabberd foi simples:
-
é open source
-
é extremamente robusto e escalável
-
é escrito em Erlang (o que me intrigou muito pela arquitetura tolerante a falhas)
-
é amplamente usado em ambientes reais (WhatsApp, por exemplo, foi originalmente baseado em XMPP)
Além disso, muitos tutoriais indicam o Ejabberd como ótima porta de entrada.
E realmente é.
Primeira impressão: instalar o Ejabberd
Quando fiz meu primeiro teste, instalei o Ejabberd no Linux usando apt:
Depois comecei a mexer no arquivo de configuração, normalmente encontrado em:
Uma das primeiras coisas que configurei foi o domínio:
- "dudaserver.com"
E logo em seguida criei meu primeiro usuário:
A sensação foi a mesma de criar um usuário de e-mail — simples e direto.
Entendendo a arquitetura do Ejabberd
Quanto mais eu estudava, mais percebia que o Ejabberd não é só um “servidor de chat”. Ele é uma plataforma distribuída em Erlang, com:
-
Hot code swapping (trocar partes do sistema sem reiniciar)
-
Clusterização nativa
-
Alta tolerância a falhas
-
Suporte integrado a módulos, como MUC (Multi-User Chat), PubSub, WebSockets etc.
Esse conjunto me mostrou que estudar Ejabberd é, na prática, estudar sistemas distribuídos modernos.
Primeiro teste prático: um chat entre dois usuários
Criei dois usuários:
ejabberdctl register joao dudaserver.com senhateste2
Depois usei um cliente XMPP simples (como o Dino no Linux ou o Gajim) para conectar os dois.
E ali, quase sem configuração adicional, consegui mandar mensagens entre os usuários.
Fiquei impressionado com a simplicidade do fluxo.
Mas o mundo XMPP fica realmente interessante com as extensões (XEPs)
XMPP tem um conjunto enorme de XEPs — XMPP Extension Protocols.
Foi nesse ponto que comecei a entender a força real do protocolo.
Algumas XEPs que estudei:
XEP-0045 — Multi-User Chat (MUC)
Permite criar salas de chat públicas ou privadas.
Com isso, criei salas no Ejabberd assim:
XEP-0085 — Chat States
Adiciona “digitando…”, “parou de digitar”, “entrou no chat”.
Nunca imaginei que esse tipo de funcionalidade fosse padronizada desde os anos 2000.
XEP-0060 — PubSub
Essa é uma das mais poderosas.
Permite construir sistemas de eventos publish/subscribe.
Usei para simular notificações:
-
um publisher envia um evento
-
vários subscribers recebem
Percebi que PubSub em XMPP pode substituir partes inteiras de filas como RabbitMQ em alguns cenários.
Testando XMPP como solução de IoT
O que me surpreendeu: XMPP não é só chat.
Decidi simular um dispositivo IoT enviando telemetria.
Usei a XEP-0323 e XEP-0325 (IoT Sensor Data).
Fiz um script Python usando a biblioteca slixmpp:
def __init__(self, jid, password):
super().__init__(jid, password)
self.send_message(
mto="central@dudaserver.com",
mbody="temperatura: 22.5",
mtype="chat"
)
xmpp.connect()
xmpp.process()
xmpp.send_data()
Quando vi a mensagem chegando no outro lado, percebi o potencial da plataforma como backend de IoT.
XMPP tem:
-
estados
-
eventos
-
autenticação
-
criptografia
-
comunicação assíncrona
Tudo nativo.
Security e TLS
Configurei TLS no Ejabberd:
- "/etc/letsencrypt/live/dudaserver.com/
fullchain.pem"
- "/etc/letsencrypt/live/dudaserver.com/
privkey.pem"
E pronto — qualquer cliente XMPP moderno já suporta TLS automaticamente.
Cluster: meu primeiro teste distribuído
Ejabberd permite criar um cluster com um comando como:
Fiz isso em duas VMs e pude observar:
-
usuários conectados em um nó conseguiam enviar mensagens a usuários no outro
-
se um nó caísse, o outro continuava ativo
Mesmo sem configuração complexa.
Foi uma das experiências mais interessantes deste estudo.
Estudar XMPP e Ejabberd me mostrou que existem tecnologias maduras e extremamente poderosas que, mesmo com a explosão de soluções modernas, continuam sendo base sólida para:
-
comunicação em tempo real
-
sistemas descentralizados
-
IoT
-
notificações
-
chats privados e corporativos
-
plataformas escaláveis
Minha sensação é que aprender XMPP é como aprender “fundamentos avançados”:
coisas que você carrega para a vida inteira, independente do framework da moda.
Ainda tenho muito o que explorar: módulos customizados em Erlang, integração com HTTP APIs, push notifications, escalonamento massivo, e padrões de autenticação avançados.
Mas, como estudo inicial, já enxerguei o poder do protocolo e por que ele continua sendo referência em arquitetura distribuída.
Em breve vou postar um artigo que ensina a criar uma pequena aplicação em Python conectando com Ejabberd via XMPP, usando a biblioteca slixmpp (moderna e assíncrona).