Compartilhar via


Agente de Serviço

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

O SQL Server Agente de Serviço fornece suporte nativo a mensagens e enfileiramento no Mecanismo de Banco de Dados do SQL Server e na Instância Gerenciada de SQL do Azure. Dessa maneira, fica mais fácil para os desenvolvedores a criação de aplicativos sofisticados que usam os componentes do Mecanismo de Banco de Dados para comunicação entre bancos de dados díspares e a criação de aplicativos distribuídos confiáveis.

Quando usar o Service Broker

Use componentes do Service Broker para implementar funcionalidades de processamento de mensagens assíncronas no banco de dados nativo. Os desenvolvedores de aplicativos que usam o Agente de Serviço podem distribuir cargas de trabalho de dados por vários bancos de dados sem programação de comunicação complexa e mensagens internas. O Service Broker reduz o trabalho de desenvolvimento e teste porque o Agente de Serviço controla os caminhos de comunicação no contexto de uma conversa. Isso também melhora o desempenho. Por exemplo, bancos de dados front-end que oferecem suporte a sites podem gravar informações e enviar tarefas intensivas de processamento para enfileiramento em bancos de dados back-end. Agente de Serviço garante que todas as tarefas sejam gerenciadas no contexto de transações para assegurar a confiabilidade e a consistência técnica.

Visão geral

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

Diagrama do fluxo de processo do Service Broker.

As mensagens nas filas podem ser buscadas usando o comando Transact-SQL RECEIVE ou pelo procedimento de ativação que é chamado sempre que a 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 as mensagens permanecerão no 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 por meio da instrução Transact-SQL SEND. Uma conversa é um canal de comunicação estabelecido entre os serviços por meio da instrução Transact-SQL BEGIN DIALOG.

-- 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 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 por meio de uma consulta SELECT padrão. A SELECT instrução não modifica a fila e remove as mensagens. Para ler e efetuar pull das mensagens da fila, use a instrução Transact-SQL RECEIVE.

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

Após processar todas as mensagens da fila, feche a conversa com a instrução Transact-SQL END CONVERSATION.

-- 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 conceitos do Service Broker e para tarefas de desenvolvimento e gerenciamento.

Novidades no Service Broker

Service Broker e Instância Gerenciada de SQL do Azure

A troca de mensagens entre instâncias do Service Broker entre instâncias da Instância Gerenciada de SQL do Azure e a troca de mensagens entre o SQL Server e a Instância de Gerenciamento de SQL do Azure está atualmente em versão prévia pública:

Há suporte para a segurança do transporte, enquanto a segurança de diálogo não é suportada.

  • CREATE REMOTE SERVICE BINDING não é compatível.

O Service Broker está habilitado por padrão e não pode ser desabilitado. Não há suporte para as seguintes ALTER DATABASE opções:

  • ENABLE_BROKER
  • DISABLE_BROKER

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

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

A sintaxe da instrução SEND foi estendida para habilitar o multicast, dando suporte a vários identificadores de conversa.

Filas expõem o tempo de enfileiramento da mensagem

As filas têm uma nova coluna, message_enqueue_timeque mostra por quanto tempo uma mensagem está na fila.

A manipulação de mensagens suspeitas pode estar desabilitada

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 exibição sys.service_queues do catálogo agora tem a coluna is_poison_message_handling_enabled para indicar se a mensagem de veneno está habilitada ou desabilitada.

Suporte ao grupo de disponibilidade no Service Broker

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