Introdução ao Service Broker – Parte 1 – Monólogo
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