Prioridades de conversación

Las prioridades de conversación son un conjunto de reglas definidas por el usuario, cada una de las cuales especifica un nivel de prioridad y los criterios para determinar a qué conversaciones de Service Broker se debe asignar el nivel de prioridad. Los mensajes de las conversaciones que tienen niveles de prioridad altos suelen enviarse o recibirse antes que los que tienen niveles de prioridad bajos.

Usos de las prioridades de conversación

Las prioridades de conversación se pueden utilizar para lo siguiente:

  • Identificar las conversaciones que tienen prioridad sobre otras.

  • Admitir diferentes niveles de servicio, en los que los mensajes de los clientes que pagan las tasas más altas se envían antes que los de aquellos que pagan las tasas más bajas.

  • Favorecer las solicitudes de cliente sobre las tareas en segundo plano. Por ejemplo, los registros de nuevos clientes deberían tener una prioridad más alta que los envíos de resúmenes de transacciones comerciales a un almacenamiento de datos.

Prioridades y extremos de las conversaciones

Las prioridades de las conversaciones se crean en cada base de datos mediante la instrucción CREATE BROKER PRIORITY. Cada prioridad de conversación define lo siguiente:

  • Un nombre para la prioridad de conversación.

  • Un nivel de prioridad que asignar a las conversaciones de Service Broker. Los niveles se especifican como números enteros de 1 (menor) a 10 (mayor). El valor predeterminado es 5.

  • Los criterios que determinan en qué conversaciones se aplica el nivel de prioridad a lo siguiente:

    • Un nombre de contrato o ANY.

    • Un nombre de servicio local o ANY.

    • Un nombre de servicio remoto o ANY.

Service Broker asigna los niveles de prioridad a los extremos de una conversación cuando se crean éstos. Cada conversación tiene dos extremos:

  • El extremo iniciador de la conversación asocia un lado de la conversación con el servicio iniciador y con la cola del iniciador. El extremo iniciador de la conversación se crea cuando se ejecuta la instrucción BEGIN DIALOG. Las operaciones asociadas al extremo iniciador de la conversación son las siguientes:

    • Envíos desde el servicio iniciador.

    • Recepciones desde la cola del iniciador.

    • Obtención del siguiente grupo de conversación desde la cola del iniciador.

  • El extremo de destino de la conversación asocia el otro lado de la conversación al servicio y la cola de destino. El extremo de destino de la conversación se crea cuando el primer mensaje del iniciador se coloca en la cola de destino. Las operaciones asociadas al extremo de destino de la conversación incluyen las siguientes:

    • Recepciones desde la cola de destino.

    • Envíos desde el servicio de destino.

    • Obtención del grupo de conversación siguiente de la cola de destino.

El servicio que se evalúa como servicio local o remoto depende del tipo de extremo de la conversación:

  • Como extremo iniciador de la conversación, el servicio iniciador es el servicio local y el servicio de destino es el servicio remoto.

  • Como extremo de destino de la conversación, el servicio de destino es el servicio local y el servicio iniciador es el servicio remoto.

Cómo asigna Service Broker los niveles de prioridad

Service Broker asigna niveles de prioridad de conversación cuando se crean los extremos de conversación. El extremo de conversación conserva el nivel de prioridad hasta que finaliza la conversación. Las prioridades nuevas o los cambios en las existentes no se aplican a las conversaciones existentes.

Service Broker asigna al extremo de conversación el nivel de prioridad de la prioridad de conversación cuyos criterios de contrato y de servicios coinciden mejor con las propiedades del extremo. En la tabla siguiente se muestra la prioridad de la coincidencia:

Contrato del extremo

Servicio local del extremo

Servicio remoto del extremo

Contrato de prioridad

Servicio local de prioridad

Servicio remoto de prioridad

Contrato de prioridad

Servicio local de prioridad

ANY

Contrato de prioridad

ANY

Servicio remoto de prioridad

Contrato de prioridad

ANY

ANY

ANY

Servicio local de prioridad

Servicio remoto de prioridad

ANY

Servicio local de prioridad

ANY

ANY

ANY

Servicio remoto de prioridad

ANY

ANY

ANY

Service Broker busca primero una prioridad cuyo contrato, servicio local y servicio remoto especificados coincidan con los que utiliza el extremo de la conversación. Si no lo encuentra, Service Broker busca entonces una prioridad para la que se especificó ANY como servicio remoto y cuyo contrato y servicio local coincidan con los que utiliza el extremo. Esto continúa para todas las variaciones incluidas en la tabla de prioridad. Si no se encuentra ninguna coincidencia, se asigna al extremo la prioridad predeterminada, es decir, 5.

Los protocolos de comunicaciones de Service Broker no transmiten los niveles de prioridad entre los extremos de la conversación. Service Broker asigna independientemente un nivel de prioridad a cada extremo. Para hacer que Service Broker asigne niveles de prioridad tanto al extremo iniciador de la conversación como al de destino, debe asegurarse de que ambos extremos estén cubiertos por prioridades de conversación. Si los extremos iniciador y de destino de la conversación están en bases de datos independientes, debe crear prioridades de conversación en cada base de datos. Si los extremos de destino e iniciador están en la misma base de datos:

  • Puede cubrir ambos extremos de la conversación con una prioridad de conversación que especifique el nombre del contrato que use la conversación y ANY para los dos nombres de servicio, el local y el remoto.

  • Puede cubrir cada extremo de la conversación de forma independiente mediante dos prioridades de conversación:

    • Una conversación para el extremo iniciador que especifique el nombre del servicio iniciador para LOCAL_SERVICE_NAME y el nombre del servicio de destino para REMOTE_SERVICE_NAME.

    • Una conversación para el extremo de destino que especifique el nombre del servicio de destino para LOCAL_SERVICE_NAME y el nombre del servicio iniciador para REMOTE_SERVICE_NAME.

Se suele especificar el mismo nivel de prioridad para ambos extremos de una conversación. Aunque puede especificar niveles de prioridad diferentes para cada extremo, el que lo haga no significa que los mensajes se envíen más rápidamente en una dirección que en la otra. Los mensajes se envían desde un extremo de la conversación y se reciben en el otro. Los niveles de prioridad asignados a ambos extremos afectan, por lo tanto, a la transmisión de cada mensaje. Por ejemplo, podría configurar una conversación para que el extremo iniciador de la conversación tenga el nivel de prioridad 10 y el extremo de destino tenga el nivel de prioridad 1. En ese caso:

  • Los mensajes transmitidos desde el servicio iniciador con el nivel de prioridad 10 se reciben desde la cola de destino con el nivel de prioridad 1.

  • Los mensajes transmitidos desde el servicio de destino con el nivel de prioridad 1 se reciben desde la cola del iniciador con el nivel de prioridad 10.

A un grupo de conversación se le asigna el mismo nivel de prioridad que el máximo asignado a cualquier conversación en la que se cumpla lo siguiente:

  • La conversación es un miembro del grupo.

  • La conversación tiene mensajes disponibles en la cola de servicio en este momento.

Todos los extremos de una conversación de una base de datos tienen asignada la prioridad predeterminada 5, si no se ha creado ninguna prioridad de conversación en la base de datos.

Las prioridades de la conversación no afectan al reenvío de mensajes, que siempre funciona en el nivel de prioridad predeterminado 5.

Ejemplo de prioridad de conversación

Considere un sistema con lo siguiente:

  • Un InitiatorDB que contiene un InitiatorService e InitiatorQueue.

  • Un TargetDB que contiene un TargetService y TargetQueue.

  • Un contrato denominado SimpleContract, que especifica que los RequestMessages se envían desde el InitiatorService al TargetService. También especifica que los ReplyMessages se envían desde el TargetService al InitiatorService.

Este script especifica el nivel de prioridad para el extremo iniciador de la conversación y sus operaciones asociadas:

  • La instrucción SEND de RequestMessage desde el InitiatorService a la TargetQueue.

  • La instrucción RECEIVE del ReplyMessage desde la InitiatorQueue.

USE InitiatorDB;
GO
CREATE BROKER PRIORITY InitiatorToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = InitiatorSerivce,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 3);
GO

Este script especifica el nivel de prioridad para el extremo de destino de la conversación y sus operaciones asociadas:

  • La operación RECEIVE del RequestMessage desde la TargetQueue.

  • La operación SEND de ReplyMessage desde el TargetService a la InitiatorQueue.

USE TargetDB;
GO
CREATE BROKER PRIORITY TargetToInitiatorPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'InitiatorService',
         PRIORITY_LEVEL = 3);
GO

Funcionamiento de las prioridades

Normalmente, Service Broker envía y recibe los mensajes para las conversaciones de prioridad alta antes de enviar y recibir los de las conversaciones de prioridad baja. Los mensajes de las conversaciones de prioridad alta pasan menos tiempo en las colas que los mensajes de las conversaciones de prioridad baja.

Niveles de prioridad de la recepción

Los niveles de prioridad siempre se aplican a las operaciones que reciben mensajes o identificadores de grupo de conversación procedentes de una cola.

El nivel de prioridad es uno de los factores que determinan el conjunto de mensajes recuperado por una instrucción RECEIVE y la secuencia en la que se recuperan los mensajes:

  • Cada instrucción RECEIVE siempre recupera los mensajes de un grupo de conversación:

    • Una instrucción RECEIVE que no tiene ninguna cláusula WHERE recupera los mensajes que pertenecen al grupo de conversación de prioridad máxima desbloqueado que tiene mensajes en la cola.

    • Una instrucción RECEIVE que tiene una cláusula WHERE recupera los mensajes del grupo de conversación especificado en dicha cláusula.

  • Dentro de un grupo de conversación, RECEIVE recupera los mensajes según el nivel de prioridad de las conversaciones en el grupo. Primero se recuperan todos los mensajes de la conversación con el nivel de prioridad máxima, a continuación los mensajes de la conversación con el nivel de prioridad máxima siguiente, etc.

  • Dentro de una conversación, los mensajes se recuperan en la misma secuencia en que se enviaron.

GET CONVERSATION GROUP devuelve el grupo con el nivel de prioridad máxima del conjunto de grupos desbloqueados que tengan mensajes en la cola.

Niveles de prioridad de la transmisión

Los mensajes de las colas de transmisión para una instancia se transmiten en secuencia según:

  • El nivel de prioridad de su extremo de conversación asociado.

  • Dentro del nivel de prioridad, su secuencia de envío en la conversación.

Service Broker coordina los niveles de prioridad en todas las colas de transmisión de una instancia del motor de base de datos. Service Broker transmite primero los mensajes de las conversaciones de prioridad 10 de todas las colas de transmisión, a continuación los mensajes de las conversaciones de prioridad 9, etc.

La diferencia relativa en el rendimiento de los mensajes aumenta con la diferencia de los niveles de prioridad. En un sistema que usa dos niveles de prioridad seguidos, como 9 y 10, los mensajes con el nivel de prioridad más alto tendrán una ventaja pequeña en el rendimiento. En un sistema que usa dos niveles de prioridad muy separados, como 1 y 10, los mensajes con el nivel de prioridad más alto tendrán una ventaja más grande en el rendimiento. En los sistemas que usan varios niveles de prioridad, la mayor parte del procesamiento se asigna a los niveles de prioridad 2 ó 3 superiores.

Los niveles de prioridad especificados en prioridades de conversación sólo se aplican a los mensajes de la cola de transmisión si la opción de base de datos HONOR_BROKER_PRIORITY está establecida en ON. Si HONOR_BROKER_PRIORITY está establecido en OFF, todos los mensajes colocados en la cola de transmisión para esa base de datos se envían con el nivel de prioridad predeterminado de 5. Cuando se ve utilizando sys.transmission_queue, el mensaje todavía muestra el nivel de prioridad que recibió del extremo, pero para transmitir el mensaje se usa el nivel de prioridad predeterminado.

Dado que los niveles de prioridad se aplican a los mensajes de la cola de transmisión, no suelen afectar a los mensajes que se envían entre los servicios de la misma instancia del Motor de base de datos. Los mensajes que se envían a un servicio de la misma instancia se colocan directamente en la cola del servicio sin pasar por una cola de transmisión. Algunas condiciones podrían ocasionar que los mensajes locales se coloquen en la cola de transmisión, como algunos tipos de errores o la inactividad de la cola de destino. Si el mensaje está almacenado en la cola de transmisión, se aplica el nivel de prioridad pertinente.

Los mensajes y los fragmentos de mensajes se pueden enviar sin seguir el orden de prioridad:

  • Service Broker envía los mensajes entre las instancias del motor de base de datos mediante bloques de fragmentos de mensajes. Si hay varios fragmentos de mensajes con prioridades diferentes listos para enviarse a una instancia, Service Broker puede enviar todos los fragmentos en un bloque. Algunos de los fragmentos del final del bloque pueden tener un nivel de prioridad menor que los fragmentos del mensaje que esperan para transmitirse a otra instancia.

  • Service Broker incluye un mecanismo para impedir que una gran cantidad de mensajes de prioridad alta bloqueen los mensajes de prioridad baja. Un mensaje de prioridad baja que lleve esperando mucho tiempo se puede enviar aun cuando haya mensajes de prioridad más alta en la cola.

Aunque los mensajes individuales o los fragmentos de los mensajes se pueden enviar sin seguir el orden de prioridad, su efecto es mínimo cuando se envían muchos mensajes.