Implementación de la idempotencia en microservicios

La plataforma Devprime ofrece funcionalidad de idempotencia automática para su uso en microservicios.

Implementaremos un ejemplo en modo back-end en el que no es necesario pasar una clave para consumir la API de microservicios. El proceso gestiona automáticamente la idempotencia de la carga útil de la API.

El primer paso para habilitar la idempotencia es modificar la configuración de “Idempotencia” en Idempotencia en el “Devprime_App”. Si no lo ha hecho, debe agregar un segundo estado para que persista la idempotencia.

Parámetros utilizados en la configuración

  • El alias indica el estado utilizado en la persistencia de la idempotencia
  • La duración se utiliza para establecer la hora del registro de control duplicado del comando.
  • El flujo indica el tipo de idempotencia y se puede configurar en “backend” o “frontend”
  • Key se usa para establecer una clave requerida en la cabeza en la interfaz de Flow
  • El alcance limita el rendimiento de la idepontencia y utiliza los parámetros “all|web|stream”
  • La acción establece si el ide será automático o manual con los parámetros “auto|manual”

Creación de un microservicio para usar en el ejemplo

Utilizaremos un microservicio basado en la plataforma Devprime

Iniciando la configuración de idempotencia

Ajuste de la idempotencia en el interruptor “Devprime_App”
Cambio en la configuración de Idempotencia en la opción “Habilitado” a “verdadero”
code src/app/appsettings.json

1
2
3
4
5
6
7
8
9
    "Idempotency": {
      "Enable": "true",
      "Alias": "State2",
      "Duration": "86400",
      "Flow": "backend",
      "key": "idempotency-key",
      "Scope": "all",
      "Action": "auto"
    }

Incluir una segunda persistencia en la tecla “Devprime_State”
En este ejemplo, usaremos un Redis local con una contraseña predeterminada
code .\src\app\appsettings.json

1
2
3
4
5
6
7
8
9
{
  "enable": "true",
  "alias": "State2",
  "dbtype": "redis",
  "connection": "127.0.0.1:6379,password=LltF8Nx*yo",
  "timeout": "5",
  "retry": "2",
  "durationofbreak": "45"
}

Inicio de la idempotencia automática en el microservicio

Ahora es el momento de probar la configuración. Antes de iniciar el microservicio, asegúrese de que ha habilitado los contenedores y ha creado la cola en RabbitMQ.

Ejecute la aplicación y publique a través de la API de pedidos
En el siguiente ejemplo, estamos usando un json estándar para la publicación.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "customerName": "Bill",
  "customerTaxID": "string",
  "itens": [
    {
      "description": "short",
      "amount": 1,
      "sku": "XNY1AC",
      "price": 100
    }
  ],
  "total": 100
}

Tenga en cuenta la información de idempotencia en el registro
El proceso de idempotencia entró automáticamente para proteger esta solicitud HTTP sin necesidad de ninguna información del lado del consumidor de la API.
Capacidades de Devprime idempotencia

Hacer una segunda publicación idéntica a través de la API de pedidos
Al observar este segundo escenario, ya es posible ver que la idempotencia protegió el microservicio al evitar una inclusión duplicada.

La API ya ha recibido una devolución que rechaza el POST duplicado
Capacidades de Devprime idempotencia

Al analizar el Log podemos seguir todo el proceso de idempotencia
Capacidades de Devprime idempotencia

Inicio de la idempotencia manual en el microservicio

Devprime le permite ingresar manualmente un método específico que admitirá idempotencia. El primer paso es cambiar la configuración principal y luego ir directamente al método para agregar la configuración.

Cambiar la tecla “Acción” a “Manual”

1
2
3
4
5
6
7
8
9
    "Idempotency": {
      "Enable": "true",
      "Alias": "State2",
      "Duration": "86400",
      "Flow": "backend",
      "key": "idempotency-key",
      "Scope": "all",
      "Action": "manual"
    }

Al usar la opción “Acción” como “manual”, si vuelve a ejecutar el microservicio y realiza una publicación duplicada, notará que no se rechazará, porque el proceso automático está desactivado.

Habilitación de la idempotencia en un método
Dado que el proceso ahora es manual, activaremos la idempotencia en cada método a proteger. En el siguiente ejemplo, demostramos esta posibilidad directamente en el adaptador web.
code src\Adapters\Web\Order.cs

Busque la API “Order” en el adaptador web y realice la modificación como se muestra.

1
2
3
4
5
app.MapPost("/v1/order", async (HttpContext http, IOrderService Service, Devprime.Web.ViewModels.Order.Order command) => await Dp(http).Pipeline(() =>
        {
            Dp(http).Idempotency.Enable = true;
            Service.Add(command.ToApplication());
        }));

Ejecútelo de nuevo y notará que la función de idempotencia ha funcionado nuevamente, pero solo para POST en la API “/v1/order”.

Más artículos sobre idempotencia

Implementación de la idempotencia en microservicios
Idempotencia en microservicios y APIs REST

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