Compartir a través de


Acción de excepción de instancia bloqueada

La propiedad InstanceLockedExceptionAction 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 InstanceLockedException. El proveedor de persistencia recibe esta excepción cuando intenta bloquear una instancia de servicio del flujo de trabajo que ya está bloqueada actualmente por otro host del servicio. Los valores de esta propiedad son NoRetry, BasicRetry y AggressiveRetry. El valor predeterminado es NoRetry. En la lista siguiente se describen las tres opciones:

  • NoRetry. El host de servicios no intenta bloquear la instancia de servicio de flujo de trabajo y pasa el objeto InstanceLockedException al autor de la llamada. Si el flujo de trabajo permanece en la memoria durante más de 60 segundos, use NoRetry como reintento. El valor predeterminado es NoRetry.

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

  • AggressiveRetry. El host del servicio vuelve a intentar bloquear la instancia de servicio de flujo de trabajo con un intervalo de interrupción exponencial entre los reintentos y pasa la excepción al autor de 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 alta, 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 está establecida en BasicRetry o AggressiveRetry, el host reintenta adquirir el bloqueo en instancias periódicamente de forma transparente.

  1. Permitir el apagado estable y el reciclaje superpuesto de dominios de aplicación. Supongamos que está reciclando un AppDomain con un host de servicios que ejecuta instancias de servicio de flujo de trabajo y que se plantea un AppDomain nuevo para administrar las solicitudes nuevas en paralelo mientras se acaba sin contratiempos con el AppDomain anterior. El apagado espera hasta que las instancias de servicio del flujo de trabajo estén inactivas, y, a continuación, conserva y descarga las instancias. Cualquier intento por parte de los hosts en el AppDomain nuevo para bloquear una instancia generará una InstanceLockedException.

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

    Escalado horizontal de flujos de trabajo de duración en una granja homogénea de servidores. Supongamos que desea escalar un flujo de trabajo de duración de manera horizontal usando varios hosts detrás de un NLB (equilibrador de carga de red). El host del flujo de trabajo que se ejecuta en un nodo de la granja carga una instancia de flujo de trabajo y está procesando un mensaje, y el mensaje siguiente a la instancia se enruta hacia el host que se está ejecutando en otro nodo porque el NLB no tiene el algoritmo de enrutamiento para entregar los 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 InstanceLockedException porque el primer host tiene un bloqueo en la instancia. El primer host desbloqueará la instancia cuando haya terminado de procesar el primer mensaje y el segundo host adquirirá el bloqueo cuando lo vuelva a intentar la próxima vez, cargue la instancia y procese el segundo mensaje.