Sistemas Distribuídos

A plataforma Devprime oferece tecnologia para acelerar a produtividade do desenvolvedor de software, facilitando o desenvolvimento de sistemas distribuídos, microsserviços e aplicações nativas da nuvem.

Ao desenvolver um novo projeto baseado na tecnologia e arquitetura de software moderna da plataforma Devprime, que oferece aceleradores com implementações de código prontas para produção e componentes com comportamentos inteligentes, os projetos terão acesso a recursos poderosos, incluindo observabilidade (logs, distributed trace, métricas), retry, circuit-break, resiliência, acelerando e simplificando o desenvolvimento de sistemas distribuídos.

Arquitetura moderna usando componentes inteligentes

Os componentes da Devprime Stack que fazem parte da plataforma Devprime implementam estratégias modernas de sistemas distribuídos, como a abordagem de observabilidade com logs, distributed trace e métricas automáticas, que são compatíveis com o Open Telemetry.

Os logs são gerados automaticamente e incluem informações como Request ID, Correlation ID e Trace ID, permitindo a rastreabilidade entre diferentes réplicas e facilitando a indexação e busca por esses IDs nas principais ferramentas de mercado. Isso ajuda a manter o controle e a visibilidade das operações em ambientes distribuídos e escaláveis.

Os Adapters de Stream, State e Services disponibilizam estratégias de Retry, Circuit Break e Resiliência quando aplicáveis, capacitando os desenvolvedores de software a criar sistemas mais robustos e resilientes.

Estratégia automática usando Retry e Circuit Break

No exemplo abaixo o Adapter de Stream inicia a estratégia de Retry devido a uma indisponibilidade no serviço “RabbitMQ” e, em seguida, abre um Circuit Break para proteger os processos da aplicação devido a uma falha temporária na infraestrutura.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[INF][App]["Powered by DevPrime"][Version]["7.0.58"][Company]["DEVPRIME"]
[INF][App]["Start"]["x"][Configuration]["Appsettings"][AppVersion]["1.0.0.0"]
[INF][App][Idempotency]["Disable"]
[INF][State][Type "MongoDB"][Alias "State1"]["Database"]["Enable"]
[INF][App][Tenancy]["Disable"]
[INF][App][Observability]["Enable"][Log "Enable"][Export "Disable"]
[Trace "Disable"][Metrics "Disable"]
[INF][Security]["Disable"]
[INF][Web]["https://localhost:5001"]["http://localhost:5000"]
[Host]["Production"][Parameters]["Appsettings"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Enable"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Retry"]["1-3"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Retry"]["2-3"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Retry"]["3-3"]
[ERR][Stream][Type "RabbitMQ"][Alias "Stream1"]["Circuit Break"]["On"]

Estratégia automática de resiliência usando fallback

Nesta estratégia de resiliência, um Fallback é implementado para lidar com situações de falha em um serviço ou componente. Quando ocorre uma falha, o Fallback entra em ação, permitindo que a aplicação continue a funcionar de forma apropriada ou forneça uma alternativa ao usuário. Isso ajuda a garantir a disponibilidade e a capacidade de resposta da aplicação, mesmo em cenários adversos.

Iniciando a resiliência após receber um POST com o Adapter em circuit breaker

Ao analisar a linha 16, é possível observar o status “Not delivered” no envio do evento, e na sequência, na linha 26, vemos a informação do início da resiliência, preservando o evento em um fallback local.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[INF][Web]["HTTP"][Order][POST /v1/order]
[Origin "https://localhost:5001/swagger/index.html"]
[INF][Application][OrderService][Add]
[INF][Domain][Order][Add]
[INF][Domain][Order][ProcessEvent]["CreateOrder"]
[INF][Application][EventHandler]["CreateOrderEventHandler"]
[Event]["CreateOrder"]
[INF][State][Type "MongoDB"][Alias "State1"][Initialize]
[OrderRepository][Add]
[INF][State][Type "MongoDB"][Alias "State1"][Complete][OrderRepository]
[Add][Duration 74.932ms]
[INF][Domain][Order][ProcessEvent]["OrderCreated"]
[INF][Application][EventHandler]["OrderCreatedEventHandler"]
[Event]["OrderCreated"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"][Out]
[Event]["OrderCreated"]["Not delivered"]["orderevents"]
["{\"Headers\":{},\"Id\":\"a7bf4882-097c-4930-93ac-fb5fd6c22e70\",
\"CorrelationId\":\"9dd39484-b22c-455a-85f1-526df6eeab99\",
\"TraceId\":\"9dd39484-b22c-455a-85f1-526df6eeab99\",
\"AppId\":\"ed896882-49af-40e6-975a-d9328403e3c3\",
\"AppName\":\"x\",\"TenantID\":\"\",\"TenantUserID\":\"\",
\"Version\":1,\"Name\":\"OrderCreated\",
\"CreationDate\":\"2023-09-02T18:15:01.7438003-03:00\",
\"Payload\":{\"ID\":\"4c66f0f8-6417-4ab1-a5ae-9ac786ddf5aa\",
\"CustomerName\":\"Ramon\",\"CustomerTaxID\":\"string\",\"Total\":0}}"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Resilience"]["Write"]

Desligando o Circuit Breaker no Retorno do RabbitMQ, Recuperando o Evento e Enviando-o para a Fila do RabbitMQ

Ao analisar a linha 1, o Circuit Breaker é alterado para o estado “Off”, permitindo que o processo de resiliência recupere o evento e, finalmente, realize a entrega com segurança ao serviço do RabbitMQ.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Circuit Break"]["Off"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"]["Resilience"]["Read"]["1"]
[INF][Stream][Type "RabbitMQ"][Alias "Stream1"][Out][Event]["OrderCreated"]
["Delivered"]["orderevents"]
["{\"Id\":\"c5d42299-50f5-4edb-9758-1cabc68874fc\",
\"CorrelationId\":\"9dd39484-b22c-455a-85f1-526df6eeab99\",
\"TraceId\":\"9dd39484-b22c-455a-85f1-526df6eeab99\",
\"AppId\":\"ed896882-49af-40e6-975a-d9328403e3c3\",\"AppName\":\"x\",
\"TenantID\":\"\",\"TenantUserID\":\"\",\"Version\":1,
\"Name\":\"OrderCreated\",\"CreationDate\":\"2023-09-02T21:15:01.743Z\",
\"Payload\":{\"ID\":\"4c66f0f8-6417-4ab1-a5ae-9ac786ddf5aa\",
\"CustomerName\":\"Ramon\",\"CustomerTaxID\":\"string\",\"Total\":0}}"]

Idempotência

A plataforma Devprime oferece uma abordagem de idempotência automática que permite controlar comandos duplicados em solicitações HTTP/gRPC e serviços Stream (Kafka, RabbitMQ).

Transação Local

A plataforma Devprime oferece um recurso integrado para habilitar transações locais com banco de dados e pode ser utilizando em conjunto com SqlServer, MongoDB, MySQL, PostgreSQL, Oracle.

Transação distribuída

O Devprime Distributed Services é um produto da plataforma Devprime que permite orquestrar transações distribuídas entre microsserviços usando a abordagem Saga Pattern e as práticas de arquitetura orientada a eventos.

Última modificação September 9, 2023 (8e6a790b)