Sistemas distribuidos

La plataforma Devprime ofrece tecnología para acelerar la productividad de los desarrolladores de software al facilitar el desarrollo de sistemas distribuidos, microservicios y aplicaciones nativas de la nube.

Al desarrollar un nuevo proyecto basado en la tecnología y la arquitectura de software moderna de la plataforma Devprime, que ofrece aceleradores con implementaciones de código listas para producción y componentes con comportamientos inteligentes, los proyectos tendrán acceso a potentes funciones que incluyen observabilidad (registros, rastreo distribuido, métricas), reintento, corte de circuito, resiliencia, aceleración y simplificación del desarrollo de sistemas distribuidos.

Arquitectura moderna con componentes inteligentes

Los componentes de Devprime Stack que forman parte de la plataforma Devprime implementan estrategias modernas de sistemas distribuidos, como el enfoque de observabilidad con registros, seguimiento distribuido y métricas automáticas, que son compatibles con Open Telemetry.

Los logs se generan automáticamente e incluyen información como el ID de solicitud, el ID de correlación y el ID de seguimiento, lo que permite la trazabilidad entre diferentes réplicas y facilita la indexación y búsqueda de estos ID en las principales herramientas del mercado. Esto ayuda a mantener el control y la visibilidad de las operaciones en entornos distribuidos y escalables.

Los adaptadores de flujo, estado y servicios proporcionan estrategias de reintento, interrupción de circuito y resistencia cuando corresponda, lo que permite a los desarrolladores de software crear sistemas más sólidos y resistentes.

Estrategia automática usando Retry y Circuit Break

En el ejemplo siguiente, el adaptador de secuencia inicia la estrategia de reintento debido a una interrupción en el servicio “RabbitMQ” y, a continuación, abre un corte de circuito para proteger los procesos de la aplicación debido a un error temporal de la infraestructura.

 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"]

Estrategia de resistencia automática mediante reserva

En esta estrategia de resistencia, se implementa una reserva para controlar las situaciones de error en un servicio o componente. Cuando se produce un error, se activa la reserva, lo que permite que la aplicación siga funcionando correctamente o proporcione una alternativa al usuario. Esto ayuda a garantizar la disponibilidad y la capacidad de respuesta de las aplicaciones, incluso en escenarios adversos.

Inicio de la resiliencia después de recibir un POST con el adaptador en el disyuntor

Al analizar la línea 16, es posible observar el estado “No entregado” en el envío del evento, y luego, en la línea 26, vemos la información del inicio de la resiliencia, preservando el evento en un respaldo 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"]

Apagar el disyuntor en el retorno de RabbitMQ, recuperar el evento y enviarlo a la cola de RabbitMQ

Al analizar la línea 1, el disyuntor se cambia al estado “Desactivado”, lo que permite que el proceso de resistencia recupere el evento y, finalmente, lo entregue de forma segura al servicio 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}}"]

Idempotencia

La plataforma Devprime ofrece un enfoque de idempotencia automática que permite controlar comandos duplicados en solicitudes HTTP/gRPC y servicios de transmisión (Kafka, RabbitMQ).

Transacción local

La plataforma Devprime ofrece una función integrada para permitir transacciones locales con bases de datos y se puede utilizar junto con SqlServer, MongoDB, MySQL, PostgreSQL, Oracle.

Transacción distribuida

Devprime Distributed Services es un producto de la plataforma Devprime que permite orquestar transacciones distribuidas entre microservicios mediante el enfoque de patrones de Saga y prácticas de arquitectura basadas en eventos.

Última modificación January 10, 2024 (967dcac3)