Enrutamiento de Service Broker

En este tema se describen los detalles sobre cómo Service Broker enruta los mensajes. Para obtener información general, vea Rutas.

En la mayoría de las aplicaciones, una sencilla aproximación al enrutamiento de Service Broker es suficiente. En cada base de datos que contiene un servicio, se especifica una ruta para los servicios externos con los que se comunica el servicio. Sin embargo, Service Broker proporciona un sistema de enrutamiento sofisticado para controlar casos en los que una aplicación necesita un comportamiento más complejo. Para obtener más ejemplos que ilustren el proceso de enrutamiento, vea Ejemplos de enrutamiento de Service Broker.

Descripción del proceso de enrutamiento

SQL Server mantiene dos niveles distintos de información de enrutamiento. Cada base de datos contiene una tabla de enrutamiento local, sys.routes, para las conversaciones que se han iniciado en esa base de datos. En el caso de las conversaciones que se originan en la instancia de SQL Server, SQL Server busca la tabla de enrutamiento en la base de datos que ha creado la conversación. En el caso de las conversaciones que llegan desde fuera de la instancia, SQL Server busca msdb.sys.routes.

El proceso de coincidencia básico es idéntico tanto si la conversación se origina en la instancia como fuera de ella. El proceso pasa por alto las rutas que han caducado. El proceso de enrutamiento consta de tres pasos distintos:

  1. Buscar rutas coincidentes. Service Broker busca un conjunto de posibles rutas mediante la coincidencia del nombre de servicio y el identificador de Service Broker.

  2. Elegir una ruta. Service Broker elige una ruta entre un conjunto de posibles rutas.

  3. Localizar el servicio de destino. Cuando la ruta seleccionada especifica 'LOCAL' como la dirección de red, Service Broker busca el servicio en la instancia. Si el servicio no existe en la instancia, Service Broker puede volver al paso 2 y elegir otra ruta.

Cuando el mensaje se ha enviado desde el iniciador al destino y el iniciador ha recibido un mensaje de confirmación del destino, el iniciador usa el identificador de Service Broker en los mensajes de confirmación para enrutar los mensajes posteriores al mismo destino. Service Broker controla los mensajes de confirmación; el proceso resulta transparente para una aplicación que usa Service Broker. Para obtener más información sobre los mensajes de confirmación, vea Protocolos de comunicación de Service Broker.

Responder a mensajes de un servicio de destino

Cuando un mensaje que llega desde fuera de la instancia procede de un servicio de destino, SQL Server comprueba si la instancia actual contiene el identificador de Service Broker en el mensaje. Si es así, el mensaje se entrega en la instancia actual, tal como se describe en "Localizar el servicio de destino". De lo contrario, SQL Server sigue el proceso de coincidencia estándar.

Buscar rutas coincidentes

El siguiente procedimiento describe cómo SQL Server hace coincidir rutas. En cada paso, si una o más rutas coinciden, el proceso de coincidencia finaliza y Service Broker selecciona una de las rutas coincidentes de la siguiente manera:

  1. Si la conversación especifica un identificador de Service Broker, busca una ruta con una coincidencia exacta para el nombre de servicio y el identificador de Service Broker.

  2. Busca una coincidencia exacta del nombre de servicio entre las rutas que no especifican un identificador de Service Broker.

  3. Si la conversación no especifica un identificador de Service Broker, busca una coincidencia exacta del nombre de servicio entre las rutas que especifican un identificador de Service Broker. Si la tabla de enrutamiento contiene rutas que coinciden con el nombre del servicio y tienen identificadores de Service Broker diferentes, elija arbitrariamente un identificador de Service Broker. A continuación, elija sólo las rutas que usan dicho identificador de Service Broker.

  4. Si existe una ruta a un servicio de enrutamiento dinámico y no existe ninguna solicitud pendiente de una ruta al servicio, marca la conversación como DELAYED y solicita información de enrutamiento a ese servicio.

  5. Busque una ruta que no especifique ni el nombre del servicio ni el identificador de Service Broker.

  6. Si la conversación especifica un identificador de Service Broker y la instancia contiene una o más bases de datos que contienen servicios con nombres que coinciden con el nombre especificado en la conversación, enruta la conversación como si la tabla de enrutamiento contuviera una ruta con el nombre de servicio y la dirección de red 'LOCAL'.

  7. Marca la conversación como DELAYED.

Cuando una conversación se marca como DELAYED, Service Broker vuelve a realizar el proceso de coincidencia una vez transcurrido un período de tiempo de espera. Tenga en cuenta que cuando no se encuentra una ruta coincidente, no se considera un error.

Elegir una ruta

Si el proceso de coincidencia encuentra más de una ruta coincidente, Service Broker elige una ruta entre las coincidentes. En este caso, las rutas que tienen el mismo identificador de Service Broker, el mismo nombre de servicio y la misma dirección de red se consideran idénticas. Service Broker usa el siguiente procedimiento para elegir la ruta exacta. En cada paso, el proceso continúa en el siguiente paso si no hay ninguna ruta que coincida con la especificación de dirección del paso.

  1. Elige una ruta entre las que especifican una dirección de reflejo.

  2. Elige una ruta entre las que especifican 'LOCAL' como dirección de red. Si esta instancia de SQL Server no contiene ningún servicio que coincida con el nombre especificado en la conversación, continúa en el paso 3.

  3. Elige una ruta entre las que especifican una dirección de red.

  4. Elige una ruta entre las que especifican 'TRANSPORT' como dirección de red.

Si el reenvío del broker no está activo, Service Broker quita el mensaje si la conversación no se origina en la instancia actual y la dirección de ruta elegida no es 'LOCAL'.

Localizar el servicio de destino

Como se ha descrito anteriormente, Service Broker entrega mensajes a un servicio de la instancia actual cuando la ruta coincidente especifica 'LOCAL' como dirección de red. En el caso de los mensajes que se originan fuera de la instancia, la ruta debe estar en msdb.sys.routes. En el caso de los mensajes que se originan en la instancia, la ruta coincidente debe estar en la tabla sys.routes de la base de datos que ha iniciado la conversación.

Cuando Service Broker determina que el servicio para el mensaje está en la instancia actual, Service Broker debe localizar el servicio en la instancia. Cuando existe un identificador de Service Broker para la conversación en la conversación o en la ruta, Service Broker entrega mensajes a la base de datos indicada por el identificador de Service Broker.

De lo contrario, Service Broker localiza el servicio buscando primero el nombre del servicio en la base de datos que contiene la conversación. A continuación, busca el nombre del servicio en las demás bases de datos de la instancia. Service Broker entrega el mensaje al primer servicio buscado. Sin embargo, tenga en cuenta que el orden en que Service Broker busca el resto de bases de datos en una instancia no está especificado y no se garantiza que se mantenga entre conversaciones. Esto significa que si existe más de una copia del servicio de destino en la instancia, Service Broker elige aleatoriamente el servicio de destino.

Otras consideraciones

Para mejorar la confiabilidad, el enrutamiento de Service Broker contiene medidas de seguridad contra bucles de enrutamiento. El enrutamiento de Service Broker reconoce el reflejo de base de datos y puede redirigir conversaciones de manera transparente a la instancia asociada activa de una base de datos reflejada.

Bucles de enrutamiento

El reenvío de mensajes de Service Broker realiza un seguimiento del número de veces que un mensaje se reenvía para protegerlo de bucles de enrutamiento infinitos. Para obtener más información, vea Reenvío de mensajes de Service Broker.

Si la ruta coincidente contiene una dirección de red que se resuelve en la instancia actual, SQL Server trata la conversación como si se originara fuera de la instancia. Service Broker enruta mensajes para la conversación con las rutas de msdb.sys.routes. El enrutamiento de estos mensajes es idéntico al de los mensajes externos a la instancia. En particular, el reenvío de mensajes debe estar activo para que Service Broker reenvíe el mensaje a una dirección de red distinta de 'LOCAL'.

Direcciones de reflejo

Las rutas con direcciones de reflejo tienen la mayor prioridad al elegir una ruta entre el conjunto inicial de rutas coincidentes. Sin embargo, Service Broker no presta especial atención a las direcciones de reflejo cuando encuentra rutas coincidentes para una conversación.

Cuando Service Broker elige una ruta que especifica una dirección de reflejo y no ha entregado previamente ningún mensaje con la ruta, envía una solicitud a ambas direcciones para determinar cuál de las instancias es actualmente la entidad de seguridad. Cuando Service Broker identifica la instancia entidad de seguridad, envía todos los mensajes que usan la ruta a esta instancia sin ponerse en contacto con la instancia de reflejo. Si no se puede obtener acceso a la entidad de seguridad o esta instancia indica que ya no es la entidad de seguridad, Service Broker envía mensajes a la otra dirección del par si la instancia de SQL Server en la otra dirección indica que es la nueva instancia entidad de seguridad.

En los casos en los que Service Broker no pueden alcanzar la entidad de seguridad pero el asociado no exige ser la nueva entidad de seguridad, Service Broker no envía mensajes al asociado. A continuación, Service Broker vuelve a intentar la dirección de la entidad de seguridad y la dirección del asociado hasta que se puede alcanzar la entidad de seguridad o el socio indica que ahora es la entidad de seguridad. Con este enfoque, Service Broker entrega mensajes de forma segura cuando la instancia entidad de seguridad y la asociada pueden comunicarse, pero la instancia que envía el mensaje no puede llegar a la instancia entidad de seguridad.