Entender cuándo se produce la activación

El proceso de activación de Service Broker consta de dos pasos. Primero, Service Broker determina si la activación es necesaria. En segundo lugar, Service Broker determina si la activación se produce. Aunque el proceso exacto es diferente para la activación interna y la activación externa, los conceptos generales implicados son los mismos para cualquier estrategia.

Determinar si la activación es necesaria

La activación es necesaria siempre que un nuevo lector de cola tenga trabajo útil que realizar. Los monitores de la cola determinan si la activación es necesaria. Service Broker crea un monitor de cola para cada cola con activación STATUS = ON o para la que se ha registrado una notificación de eventos QUEUE_ACTIVATION. La vista de administración dinámica sys.dm_broker_queue_monitors (Transact-SQL) enumera los monitores de cola activos en la instancia. Cada monitor de cola realiza el seguimiento de:

Si la cola contiene mensajes que están listos para la recepción

La frecuencia con la que una instrucción RECEIVE en la cola devuelve un conjunto de resultados vacío

El número de procedimientos almacenados de activación que se está ejecutando actualmente para la cola.

Un monitor de cola comprueba si la activación es necesaria cada pocos segundos y cuándo se produce al menos uno de los eventos siguientes:

  • Llegada de un nuevo mensaje en la cola.

  • SQL Server ejecuta una instrucción RECEIVE para la cola.

  • La reversión de una transacción que contiene una instrucción RECEIVE.

  • La salida de todos los procedimientos almacenados iniciados por el monitor de cola.

  • SQL Server ejecuta una instrucción ALTER para la cola.

La activación es necesaria si cualquiera de lo siguiente es verdad:

  • Un nuevo mensaje llega en una cola que no contiene ningún mensaje no leído y no existen procedimientos almacenados de activación que se ejecuten para la cola.

  • La cola contiene mensajes no leídos, no hay ninguna sesión que espera en una instrucción GET CONVERSATION GROUP o una instrucción RECEIVE sin una cláusula WHERE, así como ninguna instrucción GET CONVERSATION GROUP o instrucción RECEIVE sin una cláusula WHERE que haya devuelto un conjunto de resultados vacío durante unos segundos. En otras palabras, cuando los mensajes se están acumulando en la cola porque los procedimientos activados no pueden leerlos lo suficientemente rápido.

En efecto, este procedimiento permite al monitor de cola indicar si el número de lectores de cola que procesan la cola se está manteniendo al ritmo del tráfico de mensajes entrantes. Observe que este enfoque tiene en cuenta el bloqueo del grupo de conversación. Dado que sólo uno lector de cola puede procesar a la vez los mensajes para una conversación, el inicio de los lectores de cola en respuesta a enfoque más sencillo, como el número de mensajes no leídos en la cola, podría gastar los recursos. En su lugar, la activación de Service Broker considera si un nuevo lector de cola tendrá el trabajo útil que realizar.

Por ejemplo, una cola puede contener un amplio número de mensajes no procesados en una conversación única. En este caso, sólo uno lector de cola puede procesar los mensajes. El monitor de cola activa otro lector de cola. El segundo lector de cola espera en la instrucción RECEIVE, puesto que todos los mensajes pertenecen a una conversación única. Siempre que todos los mensajes en la cola pertenezcan a la misma conversación, y el segundo lector de cola siga ejecutándose, el monitor de cola no inicia otro lector de cola.

Determinar si la activación se produce

Cuando Service Broker determina que la activación es necesaria, Service Broker deben decidir si la activación se produce.

Para la activación interna, el monitor de cola activa una nueva instancia del procedimiento almacenado de activación cuando el número de programas en ejecución es inferior al valor MAX_QUEUE_READERS establecido para la cola. Si el número de programas en ejecución es igual o mayor al valor MAX_QUEUE_READERS, el monitor de cola no inicia ninguna nueva instancia del procedimiento almacenado. La vista de administración sys.dm_broker_activated_tasks (Transact-SQL) contiene información sobre los procedimientos almacenados iniciados por Service Broker.

Para las aplicaciones externas, Service Broker no tiene ninguna información sobre el número de lectores de cola distintos que pueden estar funcionando con la cola. Además, puede ser necesario algún tiempo de inicio entre el tiempo en el que se produce el evento de activación y el tiempo en el que un lector empieza a leer la cola. Por consiguiente, Service Broker proporciona un tiempo de espera para que una aplicación externa responda. Durante el tiempo de espera, Service Broker no generará otra notificación. Cuando una aplicación llama a la instrucción RECEIVE en la cola o expira el tiempo de espera, Service Broker crea otra notificación de eventos si se requiere la activación. Una aplicación externa supervisa las notificaciones de eventos mientras el programa se está ejecutando para determinar si se necesitan más lectores de cola para leer los eventos.