Introdução a Arquitetura Baseada em Eventos
Published: 2023-03-02 00:18:49

Nos tempos atuais, em que vivemos em contato constante e até "frenético" com sistemas digitais online e interconectados, é muito comum que em apenas um dia, por pessoa, sejam realizadas diversas ações através de aplicativos de celular, computadores pessoais, caixas eletrônicos, meios de pagamentos, etc.

Cada ação realizada em um sistema computacional online pode desencadear uma série de efeitos colaterais, por exemplo, a compra de um produto em um e-commerce, vai necessitar comunicar um setor para gerar nota fiscal, vai precisar avisar o setor de estoque para separar o pedido, a situação do pedido precisa ser informada para o cliente, o pedido precisa ser enviado para a transportadora, etc. E cada ação dessa, pode desencadear outras ações como efeitos colaterais.

**Vamos utilizar esse contexto de *ação* para definir o que é evento. Evento é uma situação desencadeada por essas ações, o evento é uma situação que já ocorreu (está no passado) e deixa (na maioria das vezes) efeitos colaterais.**

Nesse mundo em que o tempo é precioso, a resposta para as ações (que causam os eventos) devem ser rápidas, para que as pessoas não fiquem paradas esperando um retorno que talvez irá passar por diversos setores diferentes e possa demorar.

A demanda por respostas rápidas e eficientes traz a necessidade de uma estrutura capaz de lidar com um grande fluxo de eventos transitando na internet e que precisam ser captados e processados quase que instantaneamente.

*A arquitetura baseada em eventos é uma forma de planejar e estruturar os sistemas para que lidem com eventos de forma rápida, eficiente e desacoplada.*

## Tipos de evento

Existem alguns tipos de eventos que são muito importantes e podem nortear a arquitetura, influenciando na escolha das ferramentas adequadas para trabalhar com o tipo específico.

### Event Notification

Esse tipo de evento é muito comum em sistemas que lidam com grande quantidade de microserviços que se comunicam freneticamente, pois, o event notification é uma mensagem bem enxuta que contêm apenas o essencial para comunicação fluir, por exemplo, uma série de microserviços de grande sistema de entrega de comida só precisam saber da mudança de status do pedido para tomar algumas ações, então o event notification pode ser simplesmente um json `{"pedido": 123, "status": "saiu para entrega"}`

### Event Carried State Transfer

Esse tipo de evento é utilizado quando é necessário enviar mensagens muito grandes, em que estejam carregadas de dados, a mensagem é mais completa, por exemplo, `{"acao": "cadastro_cliente", "cliente": {...}, "origem": {...}, "produtos_de_interesse": []}`, esses eventos são comumente utilizados para desencadear ações para alimentar sistemas analíticos em que seja necessário grande quantidade de informações.

### Event Sourcing

Esse tipo de evento é normalmente utilizado para que seja capturado e armazenado em banco de dados, gerando histórico dos eventos, deixando-os disponíveis para serem consumidos posteriormente para diversas situações, por exemplo, armazenar histórico para auditoria, armazenar histórico para backup de eventos, armazenar eventos para que posteriormente outras aplicações possam vir a consumir e realizar outras ações baseadas neles, etc.

## Event Collaboration

Esse é um conceito de uma abordagem utilizando a arquitetura de eventos em que uma série de sistemas que dependem de informações um do outro estão gerando eventos de **todas** as ações (mudança de estado) que acontecem no contexto deles, fazendo com que nenhum dos sistemas tenha que ficar solicitando informação de outro, pois, ele recebe a informação a cada evento que acontece, pois, está configurado para ouvir e consumir todos os eventos necessários para que tome suas ações de forma mais autônoma. **Esse conceito visa construir um fluxo de trabalho distribuido em que os sistemas evoluam de forma independente**

Referência: [Confluent Event Collaboration](https://developer.confluent.io/patterns/compositional-patterns/event-collaboration/)

## Conclusão

Esse texto visa compartilhar estudos e entendimentos introdutórios sobre um assunto muito quente no mercado de tecnologia, e trazer tópicos para despertar interesse em aprofundamento.

A arquitetura baseada em eventos está sendo muito utilizada nas empresas que utilizam sistemas distribuídos e microserviços, alguns tópicos e ferramentas interessantes que fazem parte desse contexto: Kafka, RabbitMQ, Sistemas de Mensageria, CQRS.