SpringBatch de principio a fin: procesamiento en 3 paralelos
Muchos problemas de procesamiento por lotes se pueden resolver con trabajos de un solo subproceso y de un solo proceso, por lo que es una buena idea comprobar si estos trabajos satisfacen sus necesidades antes de considerar una implementación más compleja. Para medir el desempeño de un trabajo real, primero vea si la implementación más simple satisface sus necesidades. Incluso con hardware estándar, puedes leer y escribir archivos de cientos de MB en un minuto.
Spring Batch ofrece una variedad de opciones, que se tratan en este capítulo, pero algunas características se tratan en otros lugares. En un nivel alto, hay dos modos para el procesamiento paralelo:
Estos modos también se pueden dividir en los siguientes:
La forma más sencilla de iniciar el procesamiento paralelo es agregar en el paso configuración TaskExecutor.
Cuando se utiliza la configuración de Java, se puede agregar un TaskExecutor al paso, como se muestra en el siguiente ejemplo:
Siempre que la lógica de la aplicación que deba paralelizarse se pueda dividir en diferentes responsabilidades y asignado a cada paso, luego se puede paralelizar en un solo proceso. La ejecución de pasos paralelos es fácil de configurar y usar.
Cuando se utiliza la configuración de Java, la ejecución paralela de los pasos (paso1, paso2) y el paso 3 es muy simple, como se muestra en la siguiente figura:
En la fragmentación remota, el procesamiento de pasos es dividido en En múltiples procesos, estos procesos se comunican entre sí a través de algún middleware. El siguiente diagrama muestra este patrón:
El componente administrador es un proceso y los trabajadores son múltiples procesos remotos. Este patrón funciona mejor si el administrador no es el cuello de botella, por lo que el costo de procesamiento debe ser mayor que el costo de leer los elementos (que suele ser el caso).
Spring Integration le brinda control total sobre la concurrencia de procesos (por ejemplo, usando QueueChannel en lugar de DirectChannel). Además, al confiar en la rica colección de adaptadores de canal de Spring Integration, como JMS y AMQP, puede distribuir fragmentos de trabajos por lotes a sistemas externos para su procesamiento.
La configuración de un trabajo simple con un paso de procesamiento por lotes remoto podría verse similar a la siguiente:
A partir de la versión 4.1, Spring Batch Integration presenta la anotación @EnableBatchIntegration, que se puede utilizar para Simplifique la configuración de bloques remotos. Esta anotación proporciona dos beans que se pueden conectar automáticamente en el contexto de la aplicación:
RemoteChunkingManagerStepBuilderFactory: se usa para configurar los pasos del administrador
RemoteChunkingWorkerBuilder: se usa para configurar flujos de integración de trabajadores remotos
p>
Estas API son responsables de configurar múltiples componentes, como se muestra en la siguiente figura:
Como puede ver, el administrador necesita definir un lector, definir un canal de mensajes para enviar, y definir un canal de mensajes para recibir el canal de mensajes.
Aquí sólo se define el lector. ¿Qué recibir?
Se agregó ChunkMessageChannelItemWriter en RemoteChunkingManagerStepBuilder#build(), que es equivalente a un paso de finalización de empalme interno.
ChunkRequest saliente
Todo el proceso se puede resumir de la siguiente manera:
La partición remota está controlada por el particionador. La implementación real (incluido READER como una función STEP completa) es diferente del módulo de partición remota.
Por otro lado, la partición remota es útil cuando el cuello de botella no es el procesamiento del proyecto sino la E/S relacionada. Al utilizar particiones remotas, se puede asignar trabajo a los trabajadores que realizan los pasos de procesamiento por lotes de Spring.
Por lo tanto, cada trabajador tiene su propio ItemReader, ItemProcessor y ItemWriter.
La integración por lotes de Spring proporciona MessageChannelPartitionHandler para este propósito. Esto proporciona una buena abstracción para el transporte utilizado para comunicarse con trabajadores remotos (por ejemplo, se utiliza Rabbitmq en los ejemplos JMS y AMQP).
La sección Partición remota en el capítulo "Escalabilidad" proporciona una descripción general de los conceptos y componentes necesarios para configurar la partición remota y muestra un ejemplo del uso del TaskExecutionPartitionHandler predeterminado para particionar en subprocesos de ejecución locales separados. Para la partición remota de múltiples JVM, se requieren dos componentes adicionales:
De manera similar a la partición remota, JMS/AMQP se puede utilizar como un "tejido remoto". En este caso, como se mencionó anteriormente, se utilizará una instancia de MessageChannelPartitionHandler como implementación de PartitionHandler. El siguiente ejemplo supone un trabajo de partición y se centra en la configuración MessageChannelPartitionHandler y JMS/AMQP:
La anotación @EnableBatchIntegration se puede utilizar para simplificar la configuración de la partición remota. Esta anotación proporciona dos beans útiles para la partición remota:
RemotePartitioningManagerStepBuilderFactory: se usa para configurar los pasos del Administrador
RemotePartitioningWorkerStepBuilderFactory: se usa para configurar los pasos del Trabajador
Estas API son responsables de la configuración muchos componentes como se muestra a continuación: (usando el modo de sondeo db)
Configuración de partición remota (con agregación de respuestas)
En el lado del administrador, RemotePartitioningManagerStepBuilderFactory le permite declarar los siguientes contenidos para configurar el Pasos del administrador:
No es necesario configurar explícitamente MessageChannelPartitionHandler y MessagingTemplate (aún puedes configurarlos explícitamente si es necesario).
En el lado del trabajador, RemotePartitioningWorkersStepBuilderFactory le permite configurar el trabajador de la siguiente manera:
No es necesario configurar explícitamente StepExecutionRequestHandler (aún puede configurarlo explícitamente si es necesario).
Los siguientes ejemplos muestran cómo utilizar estas API: