Arquitetura Orientada a Eventos

Quem sou eu?

Quem sou eu?

Marcelo Michels

Marcelo Michels

  • Formado em Sistemas de Informação
  • Desenvolvedor de Software há 14 anos
  • Staff Engineer na empresa Conta Simples
  • Empreendendo
  • Entusiasta de arquitetura, infra, devops e cloud

Disclaimer

Essa apresentação é mais sobre arquitetura do que sobre software livre.

Arquitetura Orientada a Eventos

Arquitetura Orientada a Eventos

Event Driven Architecture (EDA)

Arquitetura Orientada a Eventos

É um estilo de arquitetura de software onde os eventos são os principais responsáveis por acionar e comunicar diferentes partes de um sistema.

Arquitetura Orientada a Eventos

É um estilo de arquitetura de software onde os eventos são os principais responsáveis por acionar e comunicar diferentes partes de um sistema.

Baseado na emissão, detecção, consumo e reação a eventos.

Mas o que são eventos?

Mas o que são eventos?

📌 Um evento é qualquer coisa que aconteceu e que pode ser descrita, como "pedido criado", "pagamento aprovado" ou "usuário fez login".

Explicando com um exemplo do dia a dia

Explicando com um exemplo do dia a dia

Imagine um restaurante com cozinha e garçons:

  • O cliente faz um pedido (evento: novo pedido).
  • O garçom registra o pedido e o envia para a cozinha (evento: pedido registrado).
  • O cozinheiro começa a preparar o prato assim que recebe o pedido (evento: pedido recebido).
  • Quando o prato está pronto (evento: pedido pronto), o garçom é notificado e leva o prato até o cliente.

Explicando com um exemplo do dia a dia

Agora imagine se o cozinheiro tivesse que perguntar a cada segundo: "tem pedido novo?", e o garçom tivesse que perguntar: "o prato está pronto?" o tempo todo.

Explicando com um exemplo do dia a dia

Isso seria ineficiente e pouco escalável.

Por que você deveria se importar?

Por que você deveria se importar?

Entender e aplicar uma Arquitetura Orientada a Eventos pode te ajudar a:

  • Reduzir custos com infra
  • Aumentar resiliência do sistema
  • Agilizar entregas e novas funcionalidades
  • Modernizar aplicações
  • Separação de responsabilidades

Vantagens

Vantagens

  • Desacoplamento total entre sistemas: facilita mudanças e atualizações.
  • Alta escalabilidade: ideal para sistemas distribuídos e com grande volume.
  • Resiliência e tolerância a falhas: eventos podem ser armazenados e reprocessados.
  • Time-to-market mais rápido: você pode evoluir funcionalidades de forma independente.

Principais componentes

Principais componentes

  • Produtores de eventos: quem emite eventos (ex: um serviço de pedidos).
  • Brokers ou barramentos de eventos: transporte dos eventos (ex: Amazon EventBridge, Apache Kafka, RabbitMQ).
  • Consumidores de eventos: quem reage aos eventos (ex: serviço de faturamento, envio de e-mail).
  • Eventos e payloads: estrutura que descreve o que aconteceu.

Principais componentes

Principais componentes

Principais componentes

Principais componentes

Dúvidas até aqui?

Bora ver alguns exemplos reais!!!

Transação Pix (Débito)

Chain of Responsibility

Cadeia de Responsabilidade é um padrão de design comportamental que permite repassar solicitações ao longo de uma cadeia de manipuladores. Ao receber uma solicitação, cada manipulador decide se processa a solicitação ou a repassa ao próximo manipulador na cadeia.

https://refactoring.guru/design-patterns/chain-of-responsibility

Chain of Responsibility

A mensagem percorre uma "esteira" de filtros. Cada etapa consome, transforma/valida e republica, permitindo montar workflows encadeados.

Stream / Pipeline de eventos


						[ ]
					

Stream / Pipeline de eventos


						[
							{
								"transactionId": "1234",
								"status": "CREATED",
								"createdAt": "2021-01-01T00:00:00Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							}
						]
					

Stream / Pipeline de eventos


						[
							{
								"transactionId": "1234",
								"status": "CREATED",
								"createdAt": "2021-01-01T00:00:00Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "BALANCE_CHECKED",
								"createdAt": "2021-01-01T00:00:01Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							}
						]
					

Stream / Pipeline de eventos


						[
							{
								"transactionId": "1234",
								"status": "CREATED",
								"createdAt": "2021-01-01T00:00:00Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "BALANCE_CHECKED",
								"createdAt": "2021-01-01T00:00:01Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "LIMIT_CHECKED",
								"createdAt": "2021-01-01T00:00:02Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							}
						]
					

Stream / Pipeline de eventos


						[
							{
								"transactionId": "1234",
								"status": "CREATED",
								"createdAt": "2021-01-01T00:00:00Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "BALANCE_CHECKED",
								"createdAt": "2021-01-01T00:00:01Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "LIMIT_CHECKED",
								"createdAt": "2021-01-01T00:00:02Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210"
								}
							},
							{
								"transactionId": "1234",
								"status": "ERROR",
								"createdAt": "2021-01-01T00:00:03Z",
								"payload": {
									"value": 100.0,
									"description": "Compra no supermercado",
									"payer": "1234567890",
									"payee": "9876543210",
									"error": {
										"code": "RISK_POLICY_VIOLATION",
										"message": "Transação bloqueada por política de risco."
									}
								}
							}
						]
					

Transação de entrada (Crédito)

Cuidados

Cuidados

  • Contratos mudam
  • Tenha um controle sobre essas alterações
  • Versione suas mensagens
  • Schema Registry
  • Event Catalog / Event Discovery

Arquitetura Orientada a Eventos

Event Driven Architecture (EDA)

Quando usar????

Importante conhecer o que é antes de sair usando

Apache Kafka é um projeto da Apache Software Foundation licenciado sob Apache License 2.0, totalmente open source. Qualquer pessoa pode baixar o código-fonte, contribuir e usá-lo sem custo (inclusive para uso comercial).

RabbitMQ também é open source; o servidor é distribuído sob a Mozilla Public License 2.0 (MPL-2.0). O repositório oficial fica no GitHub, e a comunidade mantém plugins e clientes em várias linguagens.

Obrigado!!!

https://eda.michels.app/