Não se trata da feature que mais me agrada do SQL Server 2005+, mas possui um potencial interessante, visto que se trata de uma feature nativa de mensageria, onde é possível basicamente enviar mensagens para um mesmo banco de dados, para bancos de dados diferentes (no mesmo servidor ou mais servidores) com pouca complexidade, e por meio destas mensagens executar processos assíncronos e de forma escalável.
Para um exemplo simples, vou tratar um monólogo (1), onde enviaremos uma mensagem para uma fila de mensagens, e em algum momento esta mensagem poderá ser recuperada para ser processada por alguma aplicação que trate estas mensagens.
(1): Na verdade, se tratada de um pseudo-monólogo, pois a comunicação do Service Broker permite um dialogo onde os serviços de origem e de destino sejam o mesmo serviço.
Primeiro, o que seriam estas mensagens? As mensagens podem ter dados dos mais variados tipos, com a finalidade de quem a receber, possa realizar alguma ação com ela.
Para haver uma comunicação é necessário definir formatos adequados para estas mensagens, assim possibilitando que quem a receber consiga saber o que fazer com ela. No caso do Service Broker, definimos tipos de mensagens, permitindo a validação se o que estamos comunicando esta de acordo com o esperado.
Na definição do tipo de mensagem, podemos utilizar um dos tipos de validações possíveis:
- NONE: Sem validação
- EMPTY: Mensagens devem ser vazias (NULL)
- WELL_FORMED_XML: Mensagens devem ser no formato XML
- VALID_XML WITH SCHEMA COLLECTION: Mensagens devem ser no formato XML obedecendo a um determinado XML Schema (XSD).
Para um exemplo simples, utilizaremos mensagens no formato XML:
USE [master];
--Criando o banco de dados
CREATE DATABASE DB01;
GO
--Habilitando o service broker
ALTER DATABASE DB01
SET ENABLE_BROKER;
GO
USE DB01;
--Criando a master key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '2u93r23nh4';
GO
USE DB01;
--Criando o tipo de mensagem
CREATE MESSAGE TYPE Requisicao
VALIDATION = WELL_FORMED_XML;
GO
Para definir qual tipo de mensagem será enviada e qual tipo de mensagem será recebida, criaremos um contrato. No caso do monologo, definiremos somente qual o tipo da mensagens que iniciará a comunicação.
CREATE CONTRACT Contrato (
Requisicao SENT BY INITIATOR
);
Definimos a seguir a fila de mensagens (caixa de correio) onde as mensagens serão armazenadas:
CREATE QUEUE FilaRequisicao
WITH STATUS = ON;
E por fim criamos nosso serviço de mensageria (carteiro), onde definimos nossa fila e o que será armazenado nela por meio dos contratos.
CREATE SERVICE ServicoRequisicao
ON QUEUE FilaRequisicao (Contrato);
GO
Agora que a estrutura esta completa, enviamos uma mensagem:
DECLARE @Mensagem XML = 'Requisição'
, @MensagemId UNIQUEIDENTIFIER;
--Criando uma conversa
BEGIN DIALOG CONVERSATION @MensagemId
FROM SERVICE ServicoRequisicao
TO SERVICE 'ServicoRequisicao'
ON CONTRACT Contrato;
--Enviando a mensagem
SEND ON CONVERSATION @MensagemId
MESSAGE TYPE Requisicao(@Mensagem);
GO
E em outro momento, a recebemos:
DECLARE @Mensagem XML
, @MensagemId UNIQUEIDENTIFIER;
--Recebendo a mensagem
RECEIVE TOP(1)
@Mensagem = [message_body],
@MensagemId = [conversation_handle]
FROM FilaRequisicao;
--Exbindo a mensagem
SELECT @MensagemId, @Mensagem;
--Finalizando a conversa
IF @MensagemId IS NOT NULL
END CONVERSATION @MensagemId
GO
Como este foi um exemplo simples, é possível que você esteja se perguntando “para que vou usar isso?”, mas fique tranquilo pois com os próximos artigos ficará mais claro os cenários onde é possível usar esta feature.
Mais informações:
Vantagens do Service Broker
http://msdn.microsoft.com/pt-br/library/ms166063.aspx
Qual a função do Service Broker?
http://msdn.microsoft.com/pt-br/library/ms166049.aspx