Acciones masivas de tareas
Bulk
Si la misma acción debe ejecutarse en varias tareas, puede ejecutarse como un 'bulk' de tareas. En el contexto de HTM, un bulk se refiere a una 'colección' de tareas. El bulk contiene una lista de task ids y un conjunto de datos requeridos para un cierto tipo de acción.
Acciones soportadas
Las acciones bulk soportadas son:
Allocate and Execute Bulk Action
Esta acción bulk combina dos acciones separadas de tarea individual: Allocate y Execute. Para cada taskId proporcionado en los datos de entrada, se realiza la acción de Allocate de la tarea y luego, para cada taskId, se realiza la acción de Execute de la tarea.
Por ejemplo, si los datos de entrada contienen task ids: [taskId1, taskId2], se realizarán las siguientes acciones de tarea individual:
-
Task Allocate en la tarea taskId1
-
Task Allocate en la tarea taskId2
-
Task Execute en la tarea taskId1
-
Task Execute en la tarea taskId2
Disparar esta acción bulk se hace mediante una solicitud HTTP POST /bulk-tasks/assign-and-execute. Para más detalles, consulte la sección API.
Además de validar los parámetros de solicitud requeridos, se implementan las siguientes validaciones:
-
Tamaño máximo permitido del bulk: el número máximo de tareas en un bulk es configurable mediante la propiedad ipf.htm.bulk.max-size y, de forma predeterminada, se establece en 1000 tareas por bulk. Si el bulk contiene más tareas de las permitidas, se devolverá el siguiente error:
{
"code": "400",
"message": "Maximum bulk size exceeded",
"description": "Current bulk size 2000 exceeded maximum allowed bulk size 1000.",
"instance": "/bulk-tasks/assign-and-execute"
}
-
No se requieren aprobaciones: solo las tareas sin required approvals pueden procesarse en el bulk. Si al menos una de las tareas del bulk tiene required approvals > 0, el bulk no se procesará y se devolverá el siguiente error:
{
"code": "400",
"message": "Required approvals are not allowed for bulk task action",
"description": "Required approvals are not allowed for bulk task action, but the bulk contains 2 tasks with required approvals greater than 0.",
"instance": "/bulk-tasks/assign-and-execute"
}
-
Mismo tipo: todas las tareas deben tener el mismo tipo. Si hay tareas con diferentes tipos, el bulk no se procesará y se devolverá el siguiente error:
{
"code": "400",
"message": "All tasks from the bulk have to be of the same type",
"description": "All tasks from the bulk have to be of the same type, but this bulk has tasks of different types: [OTHER_PROCESSING, PAYMENT_PROCESSING].",
"instance": "/bulk-tasks/assign-and-execute"
}
Obtener reporte de acción bulk
Esta acción devuelve información sobre el estado actual de la acción bulk. El cliente puede usar esta acción para verificar si la acción bulk todavía está en procesamiento o si ha finalizado, verificando si el estado es Processing o Completed.
Obtener el reporte de acción bulk se hace mediante una solicitud HTTP GET /bulk-tasks/<bulk-id>. Para más detalles, consulte la sección API.
La información recuperada por el reporte es:
-
createdAt: la hora en que se crea el bulk (se inicia el procesamiento)
-
status: estado actual de la acción bulk (Processing o Completed)
-
operatorId: el id del operador que inició la acción bulk
-
taskIds: lista de task ids incluidos en el bulk
-
errors: lista de errores para acciones de tarea individual. Se pueden realizar varias acciones de tarea individual en una tarea. Por eso, la lista de errores puede tener múltiples errores para una sola tarea, pero cada error tiene información sobre la acción de tarea individual.
"errors": [
{
"taskId": "b3f34207-992e-4e76-918d-e371c50861be",
"taskErrors": [
{
"action": "Allocate",
"error": "400: Invalid State - Invalid state 'Cancelled'. Current operation can only be performed from one of [Registered, Allocated] states."
},
{
"action": "Execute",
"error": "400: Invalid State - Invalid state 'Cancelled'. Current operation can only be performed from the 'Allocated' state."
}
]
}
]
Implementación
La implementación se realiza utilizando un Akka Event Sourced Behaviour (ESB) y un Event Processor dedicado.
El agregado de bulk se implementa como un Event Sourced Behaviour (ESB) de tres estados:
-
Ready
-
Processing
-
Completed
Cuando se crea una nueva instancia de un ESB de bulk, inicialmente está en el estado Ready, pero cambia al estado Processing de inmediato. Permanece en el estado Processing hasta que se completan todas las acciones de tarea individual. Luego cambia al estado Completed.
Diagrama de secuencia:
Cómo funciona la implementación de la acción de tareas bulk se explica aquí utilizando la acción bulk "Allocate and Execute" como ejemplo.
Procesamiento de la solicitud de acción bulk
Cuando se recibe una solicitud de bulk de un cliente, se convierte en un command, que luego se envía al agregado de bulk. En este ejemplo, se recibe la solicitud de Allocate and Execute con una lista de dos task ids: task 1 y task 2. Se convierte en el command AllocateAndExecuteBulk y se envía al agregado de bulk.
El agregado de bulk produce los siguientes eventos:
-
BulkProcessingStarted: representa el inicio del procesamiento del bulk. El agregado de bulk reaccionará a este evento cambiando su estado a Processing y almacenando todos los datos de entrada en el estado.
-
BulkProcessorTaskAllocate(task 1): será procesado por el bulk event processor, convirtiéndolo en el command TaskAllocate y enviándolo al Task aggregate.
-
BulkProcessorTaskAllocate(task 2): igual que el evento anterior, solo que para la task 2.
-
BulkProcessorTaskExecute(task 1): será procesado por el bulk event processor, convirtiéndolo en el command TaskExecute y enviándolo al Task aggregate.
-
BulkProcessorTaskExecute(task 2): igual que el anterior, pero para la task 2.
-
BulkProcessorProcessingDone: será procesado por el bulk event processor, enviando el command ProcessingBulkDone al agregado de bulk. El agregado de bulk reaccionará a este command cambiando su estado a Completed.
Los eventos con el prefijo de nombre BulkProcessor son procesados por el bulk event processor; otros eventos son procesados por el agregado de bulk.
Los eventos BulkProcessorTaskAllocate y BulkProcessorTaskExecute son procesados por el bulk event processor, convirtiéndolos en los comandos de Task apropiados y enviando esos comandos al Task aggregate. Si ocurre un error durante una acción de tarea individual, el processor recopilará información del error y enviará el command ProcessingTaskError al agregado de bulk. El agregado de bulk almacena el evento BulkTaskProcessingError y actualiza su estado con los detalles del error.
Al final, el bulk event processor consume el último evento de bulk BulkProcessorProcessingDone enviando el command ProcessingBulkDone al agregado de bulk. El agregado de bulk almacena un nuevo evento BulkProcessingDone y cambia su estado a Completed.
Este es el fin del ciclo de vida del procesamiento del bulk.
Garantías
El agregado de bulk almacena todos los eventos o ninguno. Esta acción es atómica y está garantizada por Akka. Evita la situación en la que algunos eventos de bulk se almacenan (y son procesados por el bulk event processor) y otros no.
Si ocurre un error inesperado/de sistema/de tiempo de espera mientras se envían comandos al agregado de bulk desde el bulk event processor, el evento (la fuente del comando) no se marcará como procesado (el offset del bulk event processor no se actualizará). El bulk event processor intentará procesar el mismo evento nuevamente.
El bulk event processor envía comandos al agregado de bulk usando el patrón ask de Akka. Es posible que el agregado de bulk reciba un command y, como resultado del procesamiento del command, devuelva una respuesta de fallo. Ante una respuesta de fallo, el bulk event processor registra el error y continúa. En el caso de un error que es manejado por el agregado de bulk, el procesamiento del bulk no se detiene (el procesamiento del evento no se reintentará).