Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure 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.
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:
-
Instruções de linguagem de definição de dados para
CREATE
,ALTER
eDROP
instruções - Transact-SQL declarações
- Vistas do catálogo do Service Broker (Transact-SQL)
- Visões de gestão dinâmica relacionadas ao Service Broker (Transact-SQL)
- utilitário ssbdiagnose (Service Broker)
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.
-
CREATE ROUTE
: A porta especificada deve ser 4022. Consulte CREATE ROUTE (Transact-SQL). -
ALTER ROUTE
: A porta especificada deve ser 4022. Ver ALTER ROUTE (Transact-SQL).
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).