Partilhar via


Intermediário de Serviços

Aplica-se a:SQL ServerAzure SQL Managed Instance

O SQL Server Service Broker fornece suporte nativo para mensagens e enfileiramento no Mecanismo de Banco de Dados do SQL Server e Instância Gerenciada SQL do Azure. Os desenvolvedores podem criar facilmente aplicativos sofisticados que usam os componentes do Mecanismo de Banco de Dados para se comunicar entre bancos de dados diferentes e criar aplicativos distribuídos e confiáveis.

Quando usar o Service Broker

Use os componentes do Service Broker para implementar funcionalidades nativas de processamento assíncrono de mensagens no banco de dados. Os desenvolvedores de aplicativos que usam o Service Broker podem distribuir cargas de trabalho de dados em vários bancos de dados sem programar comunicações complexas e mensagens internas. O Service Broker reduz o trabalho de desenvolvimento e teste porque o Service Broker lida com os caminhos de comunicação no contexto de uma conversa. Também melhora o desempenho. Por exemplo, os bancos de dados de interface que suportam sites podem registrar informações e enviar tarefas intensivas em processamento para filas em bancos de dados backend. O Service Broker garante que todas as tarefas sejam gerenciadas no contexto de transações para garantir confiabilidade e consistência técnica.

Visão geral

O Service Broker é uma estrutura de entrega de mensagens que permite criar aplicativos nativos orientados a serviços no banco de dados. Ao contrário das funcionalidades clássicas de processamento de consultas que lêem constantemente os dados das tabelas e os processam durante o ciclo de vida da consulta, os aplicativos orientados a serviços têm serviços de banco de dados que estão trocando as mensagens. Cada serviço tem uma fila onde as mensagens são colocadas até serem processadas.

Diagrama do fluxo de processo do Service Broker.

As mensagens nas filas podem ser obtidas usando o comando RECEIVE Transact-SQL ou pelo procedimento de ativação que é chamado sempre que uma mensagem chega na fila.

Criar serviços

Observação

Um serviço de destino deve expor um ou mais contratos. Se você criar um serviço sem contratos, ele não poderá receber mensagens. As mensagens enviadas parecerão bem-sucedidas, mas permanecerão na sys.transmission_queue do 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 mensagens

As mensagens são enviadas na conversa entre os serviços usando a declaração SEND Transact-SQL. Uma conversa é um canal de comunicação que se estabelece entre os serviços utilizando a declaração BEGIN DIALOG 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"/>');

A mensagem é enviada para o ExpensesService e colocada em dbo.ExpenseQueue. Como não há nenhum procedimento de ativação associado a essa fila, a mensagem permanece na fila até que alguém a leia.

Processar mensagens

As mensagens colocadas na fila podem ser selecionadas usando uma consulta SELECT padrão. A SELECT instrução não modifica a fila e remove as mensagens. Para ler e extrair as mensagens da fila, você pode usar a instrução RECEIVE 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

Depois de processar todas as mensagens da fila, você deve fechar a conversa usando a instrução END CONVERSATION 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

Documentação do Service Broker

Para obter mais informações sobre o Service Broker, consulte:

Você também pode consultar a documentação publicada anteriormente para obter conceitos do Service Broker e tarefas de desenvolvimento e gerenciamento.

O que há de novo no Service Broker

Service Broker e Instância Gerenciada SQL do Azure

A troca de mensagens do Service Broker entre instâncias da Instância Gerenciada SQL do Azure e a troca de mensagens entre o SQL Server e a Instância Gerenciada SQL do Azure estão atualmente em visualização pública.

A segurança de transporte é suportada, enquanto a segurança de diálogo não é:

  • CREATE REMOTE SERVICE BINDING não é suportado.

O Service Broker está habilitado por padrão e não pode ser desabilitado. As seguintes ALTER DATABASE opções não são suportadas:

  • ENABLE_BROKER
  • DISABLE_BROKER

Nenhuma alteração significativa foi introduzida no SQL Server 2019 (15.x). As seguintes alterações foram introduzidas no SQL Server 2012 (11.x).

As mensagens podem ser enviadas para vários serviços de destino (multicast)

A sintaxe da instrução SEND foi estendida para permitir o multicast ao suportar múltiplos handles de conversa.

As filas mostram o tempo de enfileiramento da mensagem

As filas têm uma nova coluna, message_enqueue_time, que mostra há quanto tempo uma mensagem está na fila.

O tratamento de mensagens suspeitas pode ser desativado

As instruções CREATE QUEUE e ALTER QUEUE agora têm a capacidade de habilitar ou desabilitar o tratamento de mensagens suspeitas adicionando a cláusula, POISON_MESSAGE_HANDLING (STATUS = ON | OFF). A visualização do catálogo sys.service_queues agora tem a coluna is_poison_message_handling_enabled para indicar se a mensagem envenenada está habilitada ou desabilitada.

Suporte ao grupo de disponibilidade no Service Broker

Para obter mais informações, consulte o Service Broker com os Grupos de Disponibilidade Always On (SQL Server).