Comparteix a través de


Acción de excepción bloqueada de instancia

La InstanceLockedExceptionAction propiedad del almacén de instancias de flujo de trabajo de SQL le permite especificar qué acción debe realizar el proveedor de persistencia de SQL cuando recibe un InstanceLockedException. El proveedor de persistencia recibe esta excepción cuando intenta bloquear una instancia de servicio de flujo de trabajo que actualmente está bloqueada por otro host de servicio. Los valores de esta propiedad son NoRetry, BasicRetryy AggressiveRetry. El valor predeterminado es NoRetry. En la lista siguiente se describen las tres opciones:

  • NoRetry. El host del servicio no intenta bloquear la instancia del servicio de flujo de trabajo y pasa al InstanceLockedException autor de la llamada. Si el flujo de trabajo permanece en memoria durante un período superior a 60 segundos, use NoRetry como reintento. El valor predeterminado es NoRetry.

  • BasicRetry. El host de servicio vuelve a adjuntar para bloquear la instancia del servicio de flujo de trabajo con un intervalo lineal entre los reintentos y pasa al InstanceLockedException autor de la llamada al final de la secuencia. Si el flujo de trabajo permanece en memoria aproximadamente entre 5 y 60 segundos, y los mensajes llegan en lotes donde es más probable que los mensajes se envíen a la misma instancia en el mismo host para procesar todos los mensajes antes de descargar el flujo de trabajo, use BasicRetry para lograr la mejor latencia sin perder recursos.

  • AggressiveRetry. El host de servicio vuelve a adjuntar para bloquear la instancia del servicio de flujo de trabajo con un intervalo de retroceso exponencial entre los reintentos y pasa la excepción al autor de la llamada al final de la secuencia. Si el flujo de trabajo permanece en memoria durante un tiempo muy corto (menos de 5 segundos), o una granja de servidores web es grande y la posibilidad de que se entregue otro mensaje al mismo host no es muy alto, use AggressiveRetry para lograr la mejor latencia.

La característica Acción de excepción bloqueada de instancia admite los siguientes escenarios. En todos los escenarios, si la propiedad instanceLockedExceptionAction de SqlWorkflowInstanceStore se establece BasicRetry en o AggressiveRetry, el host vuelve a intentar de forma transparente adquirir el bloqueo en las instancias periódicamente.

  1. Habilitación del apagado correcto y reciclaje superpuesto de dominios de aplicación. Supongamos que se recicla un appDomain con un host de servicio que ejecuta instancias de servicio de flujo de trabajo y se abre un nuevo AppDomain para controlar las nuevas solicitudes en paralelo mientras que el antiguo AppDomain deja de funcionar correctamente. El apagado espera hasta que las instancias del servicio de flujo de trabajo estén inactivas y, a continuación, conserva y descarga las instancias. Los intentos de los hosts en el nuevo AppDomain para bloquear una instancia provocarán un InstanceLockedException.

  2. Escalado horizontal de flujos de trabajo duraderos en una granja homogénea de servidores. Supongamos que un nodo de una granja de servidores en la que se ejecuta una instancia de flujo de trabajo se bloquea y el host de flujo de trabajo no puede quitar bloqueos en la instancia en la que se está ejecutando. Cuando un host de servicio que se ejecuta en otro nodo de la granja de servidores recibe un mensaje para esa instancia de flujo de trabajo, intenta adquirir bloqueos en estas instancias, recibirá el InstanceLockedException. Los bloqueos expirarán después de algún tiempo porque ya no existe el host que se suponía que renueve el bloqueo.

    Escalado horizontal de flujos de trabajo duraderos en una granja homogénea de servidores. Supongamos que desea escalar horizontalmente un flujo de trabajo duradero mediante varios hosts detrás de un NLB (Network Load Balancer), el host de flujo de trabajo que se ejecuta en un nodo de la granja de servidores carga una instancia de flujo de trabajo y está procesando un mensaje y el siguiente mensaje a la instancia se enruta al host que se ejecuta en otro nodo porque el NLB no tiene algoritmo de enrutamiento para entregar mensajes al host que ya está ejecutando la instancia. Al recibir el mensaje, el segundo host intenta cargar la instancia de flujo de trabajo y recibe porque InstanceLockedException el primer host tiene un bloqueo en la instancia. El primer host desbloquea la instancia cuando finaliza con el procesamiento del primer mensaje y el segundo host adquiere el bloqueo cuando vuelve a intentarlo la próxima vez, carga la instancia y procesa el segundo mensaje.