Ir al contenido principal

Procesos paralelos y concurrencia

Executing multiple concurrent requests requires us to associate each message in the system to the correct process instance. No estoy de acuerdo, ya que el hecho de que los request se procesen concurrentemente implica que haya un único proceso vivo. Por lo tanto no hace tiene sentido establecer una asociación entre cada request y su correspondiente proceso, ya que habrá uno sólo.

Tu objeción tiene sentido si interpretamos "proceso" como el proceso del sistema operativo que atiende las peticiones. En ese caso, efectivamente, un servidor concurrente suele tener un solo proceso vivo (o un pool fijo), y no hay una asociación 1:1 entre mensaje y proceso.

Pero la frase original probablemente usa "process instance" en el sentido de instancia de proceso de negocio (por ejemplo, en un workflow, una saga, una transacción de larga duración o una máquina de estados). Ahí sí importa la asociación:

  • Un proceso vivo a nivel técnico (el servidor) puede estar gestionando muchas instancias de proceso lógico simultáneamente.

  • Cada mensaje entrante debe enrutarse a la instancia lógica correcta (por ejemplo, el pedido #123, la sesión #456, la saga #789).

  • Sin esa correlación, el servidor no sabría a qué estado de negocio aplicar el mensaje, aunque solo haya un proceso del SO.

Ejemplo clásico: un broker de mensajes con un solo consumidor concurrente. Ese consumidor es un proceso, pero cada mensaje lleva un correlation ID que lo asocia a una instancia de proceso de negocio distinta.

Conclusión: ambos tenéis razón en planos distintos. Si "process instance" = proceso del SO, tu crítica es correcta. Si = instancia de proceso de negocio/workflow, la asociación es imprescindible aunque solo haya un proceso técnico vivo. ¿En qué contexto venía la frase original?

Está hablando de procesos en paralelo vs un proceso que gestiona requests concurrentes: Because much of the processing required by the loan broker is to wait for replies from external parties (the credit bureau and the banks), running many parallel processes may not be a good use of system resources. Instead, we can run a single process instance that reacts to incoming message events as they arrive.

Ahora el contexto cambia por completo, y tu objeción inicial se vuelve más sólida que la frase original. Te explico por qué.

Qué está diciendo realmente el texto

El autor contrasta dos diseños para el loan broker:

  1. Muchos procesos en paralelo: lanzar un proceso (o hilo/tarea) por cada petición de préstamo, cada uno bloqueado esperando respuestas del buró de crédito y los bancos.

  2. Una sola instancia de proceso: un único proceso que reacciona a eventos de mensajes entrantes a medida que llegan (modelo reactivo/event-driven, tipo actor o máquina de estados).

Su argumento es de eficiencia de recursos: como la mayor parte del tiempo se pasa esperando E/S (respuestas externas), tener N procesos bloqueados es desperdicio. Mejor uno solo que no se bloquea y va gestionando eventos.

Dónde tu crítica acierta

Tú dijiste: "si los requests se procesan concurrentemente, hay un único proceso vivo, así que no tiene sentido asociar cada request a su proceso". En este contexto, tienes razón en lo esencial: el texto mismo propone una sola instancia de proceso. Si hay una sola instancia, no hay una asociación 1:1 entre mensaje y proceso; la asociación relevante es entre mensaje y estado/correlación dentro de esa única instancia.

El matiz que salva parcialmente al texto

La frase "associate each message to the correct process instance" solo tiene sentido si el sistema puede tener varias instancias (p. ej., una por préstamo). En el diseño que el autor propone (una sola instancia), esa asociación se sustituye por:

  • un correlation ID que identifica a qué caso de negocio (qué solicitud de préstamo) pertenece cada mensaje, para actualizar el estado correcto dentro del proceso único.

Es decir: no asocias mensaje → proceso, sino mensaje → caso/estado de negocio dentro del proceso único.

Veredicto

  • El texto es inconsistente: describe un diseño de instancia única y a la vez habla de asociar mensajes a "la instancia de proceso correcta", lo cual presupone múltiples instancias.

  • Tu observación es correcta para ese diseño: con una sola instancia viva, la asociación mensaje-proceso es trivial/inexistente; lo que hace falta es correlación mensaje-caso.

  • La asociación sí es necesaria si el diseño fuera multi-instancia (una por préstamo), que es justo lo que el autor está descartando por coste de recursos.

Así que la frase original está mal formulada para el escenario que propone. Tu crítica apunta a una ambigüedad real del texto, no a un error tuyo.

Entiendo bien si pienso que en un esquema multi instancia cada una se bloquea cuando espera un mensaje mientras que en la de instancia única los datos se procesen concurrentemente, además de que es orientada a eventos y no se bloquea?

Sí, lo entiendes bien en lo esencial, pero hay un matiz importante que conviene precisar para no mezclar dos cosas distintas: concurrencia y bloqueo.

Esquema multi-instancia (una por préstamo)

  • Cada instancia se bloquea mientras espera la respuesta del buró o de los bancos (espera de E/S).

  • Aunque haya muchas instancias "vivas", la mayoría están dormidas esperando, no consumiendo CPU. Ese es justo el desperdicio de recursos que critica el autor: mantener N contextos (hilos/procesos) solo para estar bloqueados.

  • La concurrencia aquí es real pero ineficiente: muchos contextos, casi todos ociosos.

Esquema de instancia única orientada a eventos

  • No se bloquea: el proceso recibe eventos de mensajes conforme llegan y reacciona a ellos (modelo reactor / event loop / actor).

  • No procesa los datos "concurrentemente" en sentido estricto: procesa eventos secuencialmente (uno tras otro), pero como cada evento es corto y no bloquea, el sistema parece concurrente desde fuera. La concurrencia es lógica/aparente, no paralelismo real.

  • La clave no es "procesar en paralelo", sino no quedarse esperando: cuando llega una respuesta, se despacha al manejador correspondiente y se actualiza el estado del caso.

El matiz que hay que corregir

Decir que en la instancia única "los datos se procesan concurrentemente" es impreciso. Lo correcto sería:

  • Multi-instancia: concurrencia real con bloqueo (muchos contextos, la mayoría esperando).

  • Instancia única: concurrencia lógica sin bloqueo (un solo contexto que despacha eventos; el paralelismo lo aportan los actores externos, no el proceso).

Es decir, la diferencia no es "concurrente vs. no concurrente", sino cómo se gestiona la espera: bloqueando contextos vs. reaccionando a eventos.

Resumen en una línea

Tu intuición es correcta: multi-instancia = muchos procesos bloqueados esperando; instancia única = orientada a eventos, sin bloqueo. Solo corrige que la instancia única no procesa concurrentemente, sino que despacha eventos secuencialmente sin bloquearse, lo que da concurrencia aparente.

Comentarios