Integração e API

AsyncAPI

Para documentar integrações orientadas a eventos sem depender de diagramas informais, AsyncAPI descreve servidores, canais, operações, mensagens, schemas e bindings em documentos YAML ou JSON. A especificação 3.0 introduziu um modelo mais explícito de operações e mensagens, aplicável a MQTT, AMQP, Kafka, WebSocket e outros transportes. A consequência prática é gerar documentação, mocks e código com contrato comum. A limitação é que o documento não executa a integração nem garante semântica compatível entre brokers.


🔀 Tipos de Comunicação
Channels
Canais e endereços
O documento modela os locais pelos quais as mensagens circulam. Em MQTT, um channel pode corresponder a um tópico como casa/sala/temperatura; em Kafka, a um topic; em AMQP, a uma fila, exchange ou endereço conforme o binding. O endereço pode conter parâmetros, como casa/{id}/estado, e deve declarar o significado de cada variável. A especificação separa a identidade lógica do canal da sintaxe concreta do protocolo. Isso ajuda a manter um contrato único, mas não elimina diferenças de roteamento. Wildcards de MQTT, partições Kafka e exchanges AMQP possuem comportamentos próprios e precisam ser expressos nos bindings ou na documentação. Um erro frequente é usar o channel apenas como string e deixar retenção, partição, ordenação e política de acesso fora do contrato. Em automação residencial, o canal deve indicar domínio, entidade, direção, unidade e versão do payload sem expor credenciais.
Operations
Operações de envio e recebimento
AsyncAPI 3.x representa ações de send e receive de forma explícita e associa cada operação aos canais utilizados. A perspectiva é a da aplicação descrita: send significa que ela envia mensagens; receive, que consome. Essa direção precisa ser clara para evitar documentação invertida. Uma integração de gateway Zigbee pode receber comandos no canal casa/luz/set e enviar estados em casa/luz/state. As operações podem ter título, resumo, segurança, traits e mensagens. A modelagem permite gerar stubs e testes, mas o runtime continua responsabilidade do código. A declaração não garante idempotência, entrega ou ordenação. Esses aspectos devem aparecer nos bindings, cabeçalhos e requisitos. Operações também precisam registrar respostas assíncronas por correlationId quando o fluxo exige confirmação, em vez de presumir que publicar equivale a executar fisicamente.
Messages
Mensagens e schemas
Cada mensagem pode declarar headers, payload, contentType, exemplos, correlationId e schema. JSON Schema é comum, mas a especificação aceita outros formatos e referencia documentos externos. O contrato deve distinguir o envelope do domínio. Um payload de telemetria pode conter value, unit, timestamp, quality e sequence. A unidade precisa ser fixa ou enumerada. O timestamp deve indicar UTC e formato. O schema valida estrutura, não plausibilidade física; um valor de 900 °C pode ser válido sintaticamente se não houver limite. Limites, enums e padrões devem ser adicionados quando estáveis. Exemplos precisam representar casos normais e erros. Em sistemas de automação, a mensagem deve incluir versão ou ser compatível por evolução. Alterar o tipo de number para string quebra consumidores mesmo que o broker continue aceitando bytes.
Bindings
Bindings por protocolo
Bindings acrescentam detalhes específicos de MQTT, Kafka, AMQP, WebSocket, HTTP e outros. Em MQTT, podem registrar QoS, retain e informações de sessão; em Kafka, grupos, chaves e schema registry; em AMQP, propriedades de fila e exchange. O binding evita reduzir todos os transportes ao mesmo denominador. Entretanto, a cobertura depende da versão do binding e da ferramenta. Uma opção suportada pelo broker pode não estar modelada. O contrato deve declarar versões de binding e extensões. Se a integração usa MQTT 5 com response topic, correlation data ou user properties, esses detalhes precisam ser documentados. Não se deve afirmar portabilidade automática para AMQP apenas porque ambos usam publish/subscribe; semântica de roteamento, confirmação e retenção diverge.
Servers
Servidores, segurança e ambientes
A seção servers descreve endpoints, protocolo, versão, variáveis de ambiente e mecanismos de segurança. Pode haver produção, homologação e rede local. URLs e nomes não devem conter segredos. Segurança referencia schemes como user/password, API key, X.509, OAuth 2.0 ou SASL, conforme o transporte. O documento precisa separar autenticação de autorização. TLS protege o canal, mas ACLs definem tópicos. Para uma casa inteligente, um broker local pode usar mqtts://broker.local:8883 e um serviço gerenciado outro endpoint. Certificados, CA e rotação ficam na operação, não no arquivo público. A existência do server no contrato não prova disponibilidade. Health checks e monitoramento são complementares.
✅ Vantagens Arquiteturais
Contrato único para sistemas orientados a eventos
Equipes deixam de depender de planilhas e capturas do broker. Produtores e consumidores compartilham nomes, schemas, exemplos e segurança. Isso reduz interpretações diferentes. Em uma casa com Home Assistant, Node-RED, Zigbee2MQTT e um serviço de energia, o documento pode registrar eventos e comandos de cada domínio. A vantagem cresce quando há mais de um protocolo. O contrato serve à revisão antes do código. Ainda assim, precisa de governança: proprietário, versão, aprovação e testes. Um arquivo abandonado é pior que documentação curta e atual. A pipeline deve validar o documento e compará-lo ao comportamento real.
Geração de documentação, código e testes
Ferramentas do ecossistema AsyncAPI geram páginas, modelos, stubs e artefatos. Isso acelera onboarding e reduz boilerplate. Geradores precisam ser fixados por versão e revisados. Código gerado não substitui lógica de negócio, segurança, retry e observabilidade. Em IoT, um mock pode publicar mensagens de sensor para testar automações sem hardware. Testes de contrato verificam payloads e headers. O ganho depende da qualidade do schema. Se todos os payloads são object sem restrições, a geração produz pouco valor. O projeto deve incluir exemplos de falha, duplicidade, atraso e indisponibilidade.
Separação explícita entre semântica comum e detalhes do transporte
O núcleo descreve canais, mensagens e operações, enquanto bindings guardam particularidades. Isso facilita comparar MQTT, Kafka e AMQP sem fingir que são iguais. Uma organização pode manter o mesmo modelo de evento de presença em dois transportes, alterando bindings. A portabilidade, porém, não é automática. Kafka preserva ordem por partição; MQTT oferece QoS e retained messages; AMQP possui filas e exchanges. O contrato deve documentar as garantias efetivas. A vantagem é tornar as diferenças visíveis, não apagá-las.
Melhor controle de evolução e compatibilidade
Documentos versionados em Git permitem revisar alterações. Um breaking change pode ser detectado por diff semântico. Regras podem proibir remover campos obrigatórios ou alterar enums sem nova versão. A automação residencial se beneficia porque dispositivos e integrações atualizam em ritmos distintos. Campos opcionais e defaults preservam compatibilidade. O documento deve registrar política de depreciação. A limitação é que nenhuma ferramenta conhece toda a semântica: mudar °C para °F mantendo number pode passar no schema e quebrar o significado. Unidades e descrições são parte do contrato.
Base para governança e segurança de mensageria
A especificação pode declarar esquemas de autenticação, canais permitidos e dados sensíveis. Isso ajuda a revisar a superfície antes da implantação. Um tópico de fechadura exige política diferente de temperatura. O documento também pode marcar PII e retenção por extensões. A execução dessas políticas pertence ao broker, gateway e IAM. AsyncAPI não aplica ACLs. Portanto, a vantagem é fornecer uma fonte para automação de políticas e auditoria, desde que exista integração com infraestrutura. Publicar um documento com endpoints internos e exemplos contendo tokens é um risco; a documentação precisa ser sanitizada.