Distributed Systems
The Devprime platform offers technology to accelerate software developer productivity by facilitating the development of distributed systems, microservices, and cloud-native applications.
By developing a new project based on the technology and modern software architecture of the Devprime platform, which offers accelerators with production-ready code implementations and components with intelligent behaviors, projects will have access to powerful features including observability (logs, distributed trace, metrics), retry, circuit-break, resiliency, accelerating and simplifying the development of distributed systems.
Modern architecture using smart components
The Devprime Stack components that are part of the Devprime platform implement modern distributed systems strategies, such as the observability approach with logs, distributed trace, and automatic metrics, which are compatible with Open Telemetry.
The logs are automatically generated and include information such as Request ID, Correlation ID, and Trace ID, allowing traceability between different replicas and making it easier to index and search for these IDs in the main market tools. This helps maintain control and visibility of operations in distributed and scalable environments.
Stream, State, and Services Adapters provide Retry, Circuit Break, and Resiliency strategies where applicable, empowering software developers to build more robust and resilient systems.
Automatic strategy using Retry and Circuit Break
In the example below, the Stream Adapter initiates the Retry strategy due to an outage in the “RabbitMQ” service and then opens a Circuit Break to protect the application processes due to a temporary failure in the infrastructure.
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"]
|
Automatic resiliency strategy using fallback
In this resiliency strategy, a Fallback is implemented to handle failure situations in a service or component. When a failure occurs, Fallback kicks in, allowing the application to continue to function properly or provide an alternative to the user. This helps ensure application availability and responsiveness, even in adverse scenarios.
Starting Resiliency After Receiving a POST with the Adapter in Circuit Breaker
When looking at line 16, it is possible to observe the “Not delivered” status in the event submission, and then, in line 26, we see the information of the beginning of resilience, preserving the event in a local fallback.
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"]
|
Turning off the Circuit Breaker on RabbitMQ Return, Retrieving the Event, and Sending it to the RabbitMQ Queue
When parsing line 1, the Circuit Breaker is changed to the “Off” state, allowing the resiliency process to retrieve the event and ultimately safely deliver it to the RabbitMQ service.
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}}"]
|
The Devprime platform offers an automatic idempotency approach that allows you to control duplicate commands in HTTP/gRPC requests and Stream services (Kafka, RabbitMQ).
The Devprime platform offers a built-in feature to enable local database transactions and can be used in conjunction with SqlServer, MongoDB, MySQL, PostgreSQL, Oracle.
Devprime Distributed Services is a product of the Devprime platform that enables you to orchestrate distributed transactions across microservices using the Saga Pattern approach and event-driven architecture practices.
Last modified August 20, 2024 (2f9802da)