Introdução ao Service Broker – Resumo

Uma feature do SQL Server que tive que aprender “na marra” para trabalhar em alguns projetos de SOA, mas que me permitiu construir soluções incríveis é o Service Broker, que no início pode parecer uma tentativa de reinventar a roda para quem já trabalha com SOA em plataformas de desenvolvimento (.NET, Java), mas para a vida do DBA é uma solução muito prática, flexível e estável, que pode até surpreender muitos desenvolvedores.

No blog, trabalhei esta feature em três situações:

Introdução ao Service Broker – Parte 1 – Monólogo

Introdução ao Service Broker – Parte 2 – Diálogo e Permissões

Introdução ao Service Broker – Processos assíncronos

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:

  1. NONE: Sem validação
  2. EMPTY: Mensagens devem ser vazias (NULL)
  3. WELL_FORMED_XML: Mensagens devem ser no formato XML
  4. 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