Integração de sistemas é fazer softwares que evoluem independentemente cooperarem sem fingir que redes são confiáveis ou que todos compartilham o mesmo modelo do mundo.
A tecnologia importa, mas a primeira pergunta é mais simples: quem chama precisa da resposta agora ou o trabalho pode acontecer depois?
APIs para interação imediata
Uma API síncrona é adequada quando o consumidor precisa da resposta para continuar, como consultar uma conta ou validar uma operação. O contrato deve definir entradas, saídas, autenticação, autorização, erros, timeouts e compatibilidade.
Cada dependência síncrona adiciona latência e acoplamento de disponibilidade. Use timeouts explícitos, retries limitados e circuit breaking ou load shedding quando apropriado. Repetir uma mudança de estado só é seguro quando a operação é idempotente ou possui uma chave de idempotência.
Webhooks para notificação externa
Um webhook permite que um sistema notifique outro por callback HTTP. É útil para parceiros e notificações quando o receptor expõe um endpoint acessível.
Webhooks de produção exigem payload assinado, timestamp validado, retries com backoff, IDs estáveis, histórico de entrega e recuperação. Um HTTP de sucesso confirma recebimento conforme o contrato; não significa necessariamente que todo o processamento terminou.
Filas para trabalho assíncrono
Uma fila separa o caminho da requisição do trabalho que pode ocorrer depois. Ela absorve rajadas e permite processamento sustentável. Envio de e-mail, geração de relatórios e jobs em background são exemplos comuns.
Consumidores devem tratar duplicatas e definir o destino após falhas repetidas. Monitore profundidade, idade da mensagem mais antiga, tempo de processamento e dead letters. A fila deve reduzir acoplamento temporal, não esconder falhas.
Eventos para fatos compartilhados
Um evento declara que algo aconteceu: order.placed, payment.authorized ou customer.address.changed. Consumidores independentes podem reagir, reduzindo o acoplamento direto.
Bons eventos representam fatos estáveis, incluem ID único e horário de ocorrência e usam schema versionado. Devem carregar contexto suficiente sem expor dados pessoais ou internos desnecessários.
Eventos também trazem consistência eventual, duplicatas, entrega fora de ordem, evolução de schema, replay e propriedade operacional. Use-os quando esses trade-offs resolverem acoplamento ou escala reais.
Combine padrões deliberadamente
Sistemas reais combinam padrões. Uma API aceita um comando, confirma uma transação e publica um evento. Uma fila agenda processamento lento. Um webhook notifica um parceiro. As fronteiras precisam permanecer explícitas.
Um desafio é publicar o evento de forma consistente com a alteração no banco. Um transactional outbox pode impedir que um commit bem-sucedido seja seguido por um evento perdido. Consumidores continuam precisando de idempotência e processamento observável.
Defina propriedade e evidência
Toda integração precisa de proprietário, contrato, objetivos de serviço, controles de segurança e processo de depreciação. Acompanhe requisições e eventos com correlação, sem colocar secrets ou dados pessoais desnecessários na telemetria.
Escolha o padrão mais simples que satisfaça o contrato. APIs fornecem respostas imediatas. Webhooks notificam assinantes remotos. Filas desacoplam trabalho no tempo. Eventos distribuem fatos a consumidores independentes.
O objetivo não é remover todas as dependências. É tornar cada dependência compreensível, observável e resiliente quando uma parte inevitavelmente falhar.
Referência
O AWS Prescriptive Guidance documenta o padrão transactional outbox para coordenar alterações no banco e publicação de eventos.
