lunes, 6 de junio de 2011

Aclarando el concepto "Tamaño de Grupo"

Hola,

En esta entrada voy a tratar de aclarar el concepto de "Tamaño de Grupo" o "Pool Size".

Para empezar es simple, cualquier elemento de la configuración de una producción ya sea un Business Service, Process u Operation tienen todos dentro de la parte de "Configuración General" un parámetro o setting denominado "Tamaño de Grupo". Este "setting" determina el número de "Jobs" o procesos de sistema operativo que se levantan para ese componente.

Por lo tanto podemos agrupar 3 casos diferentes:

1. "Pool Size" = 0
2. "Pool Size" = 1
3. "Pool Size" > 1

Para empezar tenemos que tener en cuenta que un componente que utilice un adaptador (es decir un Business Service o un Business Operation) deben tener siempre el "Pool Size" mayor que cero. Esto es porque si el "Pool Size" es igual a cero, simplemente no se levanta "Job" para ese elemento. Y en ese caso vamos a ver que el componente "no hace nada".

Por lo tanto todos los servicios y operaciones que utilicen adaptador deben tener tamaño de grupo mayor que cero.

Pero, entonces ¿Para qué sirve un PoolSize igual a cero en un Servicio?. Esta configuración es útil para por ejemplo disponer de servicios que son invocados directamente desde dentro de Ensemble como desde una aplicación compuesta, en ese caso utilizamos el mecanismo "CreateBusinessService" de la clase "Ens.Director":
Set tSC = ##class(Ens.Director).CreateBusinessService("MyService",.tService)
Y ¿Para qué es útil disponer de un servicio u operación con un tamaño de grupo mayor que uno?. Pues para mejorar la tasa de procesamiento de ese elemento. Esta claro que dos hacen más que uno. ¿no?.

De manera que si disponemos de una operación que, por ejemplo, envía mensajes HL7 hacia un destino externo y doblamos su tamaño de grupo entonces ¿esta irá el doble de rapido?. Pues sí siempre y cuando la configuración Hardware de la CPU permita trabajar a esos procesos en paralelo (por ejemplo en cores diferentes) con esto quiero decir que si solo disponemos de una CPU aunque dupliquemos el número de procesos no vamos a ver mejora, e incluso podemos ver como el rendimiento empeora.

Ádemas tenemos que tener en cuenta que con un tamaño de grupo mayor que uno (es decir con varios procesos trabajando simultaneamente en paralelo) el ordén FIFO no se respeta. Dos mensajes en secuencia pueden llegar a su destino final en desorden ya que son procesados en paralelo y terminar el segundo antes que el primero. Esto puede ser un problema dependiendo del entorno así que si queremos respetar el orden FIFO entonces el PoolSize siempre debe ser igual a uno.

Y ¿qué pasa con los Business Process?. Pues pasa lo mismo cuando el PoolSize es igual o mayor que uno. Pero cuando PoolSize es igual a cero entonces el comportamiento es un poco diferente. En el caso de que el PoolSize de un proceso sea igual a cero entonces efectivamente no se levanta Job para él sino que el proceso que lo ejecutará será el proceso especial "Ens.Actor".

"Ens.Actor" es un Job que se levanta automáticamente al iniciarse la producción y es un proceso de sistema operativo de uso "comunitario". Es decir, si disponemos de 10 BPL en una producción y todos disponen de PoolSize = 0 entonces esos 10 BPL estarán siendo ejecutados por el proceso físico Ens.Actor. Es decir el procesamiento de esos BPL es compartido por el mismo proceso. Esto quiere decir que nunca se procesan mensajes en paralelo para esos 10 BPL. ¿Nunca? no exactamente, porque depende del número de "Ens.Actor" que esten levantados y eso lo podemos configurar. Es un setting a nivel de producción denominado "Actor Pool Size" o "Tamaño de grupo de Actores".

Si establecemos "Actor Pool Size" a dos entonces veremos en la lista de Jobs exactamente dos procesos "Ens.Actor". En este caso el rendimiento será el doble. En este caso ocurre como anteriormente, un Ens.Actor alto solo puede ser útil en configuraciones HW que lo soporten.

Bueno pues después de todo esto podemos hacer este resumen:

1. "Pool Size" = 0
Util para BS que sean invocados directamente
Util para BP que comparten tiempo de procesamiento mediante "Ens.Actor"
2. "Pool Size" = 1
Respeta FIFO y es lo recomendable para BS, BP y BO
3. "Pool Size" > 1
Puede mejorar el rendimiento pero no respeta FIFO

Por último os remito a la documentación donde se explica todo esto:

Saludos

No hay comentarios: