No mundo atual de desenvolvimento de software, sistemas contendo algum tipo de construção de evento estão aumentando em popularidade. Embora isso seja impulsionado principalmente por mecanismos de comunicação baseados em mensagens, eventos também são usados em diferentes escopos e contextos. O uso frequente do termo "evento" leva à confusão, que é frequentemente observada em discussões sobre várias arquiteturas de software entre pessoas que são novas nesses conceitos.
Os termos "orientado por evento" e "originado por evento" são frequentemente usados de forma intercambiável, enquanto na realidade, os dois são conceitos muito diferentes. Neste artigo, exploraremos as principais características de cada um, explicaremos como eles diferem e como se complementam. Vamos nos concentrar em esclarecer as principais diferenças, não em um mergulho profundo em cada conceito.
Antes de mergulharmos, vamos esclarecer a definição de um "evento" em sistemas orientados a eventos e originados por eventos. Um evento é um registro imutável que descreve algo que aconteceu no passado. Portanto, os dados que um evento contém não podem ser alterados. Imutabilidade e descrição do passado são características fundamentais dos eventos.
Sistemas Orientados por Evento
Sistemas orientados por evento são aqueles em que o fluxo de controle é determinado pela ocorrência de eventos. Isso significa que, quando um evento relevante ocorre, o sistema responde a ele, executando as ações apropriadas. Nesse tipo de arquitetura, os eventos são a unidade fundamental de interação e comunicação entre os diferentes componentes do sistema.
Algumas características-chave dos sistemas orientados por evento incluem:
Desacoplamento
Os diferentes componentes do sistema são desacoplados uns dos outros. Eles não precisam conhecer os detalhes de implementação uns dos outros, apenas os eventos que podem gerar e consumir. Isso promove a flexibilidade e a escalabilidade do sistema.
Assincronicidade
A comunicação entre os componentes é assíncrona, o que significa que o remetente de um evento não precisa esperar pela resposta do receptor. Isso ajuda a melhorar a capacidade de resposta e a tolerância a falhas do sistema.
Reatividade
Os sistemas orientados por evento são altamente reativos, respondendo prontamente a eventos relevantes à medida que eles ocorrem. Isso os torna adequados para lidar com cenários em tempo real, como aplicativos de IoT, sistemas de monitoramento e processamento de fluxos de dados.
Composabilidade
Os diferentes componentes do sistema podem ser facilmente compostos e recompostos, permitindo a criação de soluções complexas a partir de blocos de construção menores e mais simples.
Exemplos de sistemas orientados por evento incluem sistemas de mensageria, como Apache Kafka e RabbitMQ, bem como arquiteturas de microsserviços e aplicativos de IoT.
Sistemas Originados por Evento
Sistemas originados por evento são aqueles em que as alterações de estado são capturadas na forma de eventos imutáveis, que são então usados como a fonte de verdade para reconstruir o estado do sistema. Nesse tipo de arquitetura, os eventos são a unidade fundamental de armazenamento e processamento de dados.
Algumas características-chave dos sistemas originados por evento incluem:
Imutabilidade
Todos os eventos são registrados de forma imutável, o que significa que eles não podem ser alterados após sua criação. Isso garante a integridade e a auditabilidade dos dados.
Projeção de Estado
O estado atual do sistema é projetado a partir da sequência de eventos armazenados. Isso permite que o sistema seja reconstruído a partir de qualquer ponto no tempo, facilitando o rastreamento, a depuração e a recuperação de falhas.
Consistência Eventual
Como os eventos são processados de forma assíncrona, o sistema pode exibir consistência eventual, onde diferentes visualizações do estado podem ser temporariamente divergentes, mas eventualmente convergirão.
Escalabilidade
Os sistemas originados por evento são altamente escaláveis, pois o armazenamento e o processamento de eventos podem ser distribuídos e paralelizados de maneira eficiente.
Exemplos de sistemas originados por evento incluem bancos de dados de eventos, como EventStore e Apache Kafka, bem como arquiteturas de CQRS (Command Query Responsibility Segregation) e DDD (Domain-Driven Design).
Diferenças e Complementaridade
Embora os sistemas orientados por evento e os sistemas originados por evento compartilhem algumas semelhanças, como o uso de eventos como unidade fundamental, eles diferem em vários aspectos:
Fluxo de Controle
Nos sistemas orientados por evento, o fluxo de controle é determinado pela ocorrência de eventos, enquanto nos sistemas originados por evento, o fluxo de controle é determinado pela necessidade de reconstruir o estado do sistema a partir da sequência de eventos.
Armazenamento de Eventos
Nos sistemas orientados por evento, os eventos são geralmente usados para comunicação entre componentes e não são necessariamente armazenados de forma persistente. Nos sistemas originados por evento, os eventos são armazenados de forma persistente e imutável, formando a fonte de verdade do sistema.
Projeção de Estado
Nos sistemas orientados por evento, o estado do sistema é geralmente mantido pelos próprios componentes. Nos sistemas originados por evento, o estado do sistema é projetado a partir da sequência de eventos armazenados.
Apesar dessas diferenças, os sistemas orientados por evento e os sistemas originados por evento podem ser complementares. Por exemplo, um sistema orientado por evento pode usar um sistema originado por evento como seu mecanismo de armazenamento de eventos, aproveitando os benefícios de ambas as abordagens.
Em conclusão, embora os termos "orientado por evento" e "originado por evento" sejam frequentemente usados de forma intercambiável, eles representam conceitos distintos e complementares no desenvolvimento de software. Entender essas diferenças é crucial para projetar e implementar sistemas de software robustos, escaláveis e resilientes.