Compartir a través de


Intermediario de Servicios

Se aplica a:SQL ServerAzure SQL Managed Instance

SQL Server Service Broker proporciona compatibilidad nativa con la mensajería y la puesta en cola de Motor de base de datos de SQL Server y Azure SQL Managed Instance. Los desarrolladores pueden crear fácilmente aplicaciones complejas que usan los componentes de Motor de base de datos para comunicarse entre distintas bases de datos y compilar aplicaciones distribuidas y confiables.

Cuándo utilizar Service Broker

Utilice componentes de Service Broker para implementar funcionalidades nativas de procesamiento de mensajes asincrónicos en bases de datos. Los desarrolladores de aplicaciones que usan Service Broker pueden distribuir las cargas de trabajo de datos en varias bases de datos sin tener que programar complejas funciones internas de comunicación y mensajería. Service Broker reduce el trabajo de desarrollo y realización de pruebas, ya que Service Broker controla las vías de comunicación del contexto de una conversación. También aumenta el rendimiento. Por ejemplo, las bases de datos front-end que admiten sitios web pueden grabar información y enviar tareas con muchos procesos a colas de bases de datos back-end. Service Broker asegura que todas las tareas se administran en el contexto de transacciones para garantizar confiabilidad y coherencia técnica.

Información general

Service Broker es un marco de trabajo de entrega de mensajes que le permite crear aplicaciones nativas orientadas a servicios en bases de datos. A diferencia de las funcionalidades clásicas de procesamiento de consultas que leen constantemente datos de las tablas y los procesan durante el ciclo de vida de las consultas, las aplicaciones orientadas a servicios tienen servicios de base de datos que intercambian los mensajes. Cada servicio tiene una cola donde se colocan los mensajes hasta que se procesan.

Diagrama del flujo de proceso de Service Broker.

Los mensajes de las colas se pueden extraer mediante el comando Transact-SQL RECEIVE o por el procedimiento de activación que se activa cada vez que llega el mensaje a la cola.

Creación de servicios

Nota:

Un servicio de destino debe exponer uno o varios contratos. Si crea un servicio sin contratos, no podrá recibir mensajes. Los mensajes enviados parecerán haber tenido éxito, pero los mensajes permanecerán en el sys.transmission_queue del iniciador

/*
In this example, the initiator must then use ON CONTRACT [DEFAULT] and a MESSAGE TYPE [DEFAULT]. [DEFAULT] is a delimited identifier for the built‑in contract and isn't a T‑SQL keyword, so it must be bracketed or quoted.
*/
CREATE QUEUE dbo.ExpenseQueue;
GO

CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue ([DEFAULT]);

Enviar mensajes

Los mensajes se envían en la conversación entre los servicios con la instrucción SEND de Transact-SQL. Una conversación es un canal de comunicación que se establece entre los servicios con la instrucción BEGIN DIALOG de Transact-SQL.

-- Begin a dialog
DECLARE @dialog_handle AS UNIQUEIDENTIFIER;

BEGIN DIALOG @dialog_handle
    FROM SERVICE ExpensesClient
    TO SERVICE N'ExpensesService'
    ON CONTRACT [DEFAULT];

-- Send a message
SEND ON CONVERSATION (@dialog_handle)
    MESSAGE TYPE [DEFAULT] (N'<Expense ExpenseId="1" Amount="123.45" Currency="USD"/>');

El mensaje se envía a ExpensesService y se coloca en dbo.ExpenseQueue. Dado que no hay ningún procedimiento de activación asociado a esta cola, el mensaje permanece en la cola hasta que alguien lo lee.

Procesar mensajes

Los mensajes que están colocados en la cola se pueden seleccionar mediante una consulta SELECT estándar. La SELECT instrucción no modifica la cola y quita los mensajes. Para leer y extraer los mensajes de la cola, puede usar la instrucción RECEIVE de Transact-SQL.

RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO

Una vez que procesa todos los mensajes de la cola, debe cerrar la conversación con la instrucción END CONVERSATION de Transact-SQL.

-- Drain any remaining target conversations for the from the queue
DECLARE @conversation_hdl AS UNIQUEIDENTIFIER;

WHILE EXISTS (SELECT 1 FROM dbo.ExpenseQueue)
    BEGIN
        RECEIVE TOP (1) @conversation_hdl = conversation_handle FROM dbo.ExpenseQueue;
        END CONVERSATION @conversation_hdl;
    END
GO

Documentación de Service Broker

Para obtener más información sobre Service Broker, consulte:

También puede consultar la documentación publicada anteriormente para conocer los conceptos de Service Broker y para las tareas de desarrollo y administración.

Novedades de Service Broker

Service Broker e Instancia administrada de Azure SQL

El intercambio de mensajes del Service Broker entre instancias de Azure SQL Managed Instance y entre SQL Server y Azure SQL Managed Instance se encuentra actualmente en versión preliminar pública.

Se admite la seguridad de transporte, mientras que no se admite la seguridad de diálogo.

  • CREATE REMOTE SERVICE BINDING no se admite.

Service Broker está habilitado de forma predeterminada y no se puede deshabilitar. No se admiten las siguientes ALTER DATABASE opciones:

  • ENABLE_BROKER
  • DISABLE_BROKER

En SQL Server 2019 (15.x), no se introduce ningún cambio significativo. Los siguientes cambios se incluyeron por primera vez en SQL Server 2012 (11.x).

Se pueden enviar mensajes a varios servicios de destino (multidifusión)

La sintaxis de la instrucción SEND se ha ampliado para habilitar la multidifusión admitiendo varios identificadores de conversación.

Las colas exponen la hora de puesta en cola del mensaje

Las colas tienen una nueva columna, message_enqueue_time, que muestra cuánto tiempo ha estado un mensaje en la cola.

El control de mensajes dudosos se puede deshabilitar

Las instrucciones CREATE QUEUE y ALTER QUEUE ahora tienen la capacidad de habilitar o deshabilitar el manejo de mensajes envenenados agregando la cláusula, POISON_MESSAGE_HANDLING (STATUS = ON | OFF). La vista sys.service_queues de catálogo ahora tiene la columna is_poison_message_handling_enabled para indicar si el mensaje dudoso está habilitado o deshabilitado.

Soporte para grupos de disponibilidad en Service Broker

Para más información, vea Service Broker con grupos de disponibilidad AlwaysOn (SQL Server).