3. SQL Server Service Broker
Fournir la prise en charge native des applications de messagerie et de mise en file
d'attente
Existe depuis SQL Server 2005
SQL Server Service Broker est utilisé par le service de Messagerie de bases de
données et par la fonctionnalité de Notification d’événements
Fonctionne avec les éditions Express, Standard et Enterprise. Par contre, deux
éditions Express ne peuvent pas communiquer ensemble.
N’est pas disponible dans Azure SQL Database
4. SQL Server Service Broker : quelques usages
Déclenchements asynchrones
Collecte de données fiable
Traitement distribué côté serveur pour des applications clientes
Traitement de lots à grande échelle
5. SQL Server Service Broker : ses avantages
Distribuer les charges de données sur plusieurs bases de données sans
développer des mécanismes de messagerie et de communication complexes
Réduire le travail de développement et de test puisque Service Broker gère les
chemins de communication dans le contexte d'une conversation
Obtenir de bonnes performances
Garantir que toutes les tâches sont gérées dans le contexte des transactions
6. Service Broker
Ce n’est pas un EAI type Biztalk
Ce n’est pas un ETL type SSIS
Ce n’est pas tout à fait un service de réplication
C’est un « Broker » type MSMQ
Service Broker est intégré à la base de données
7. SQL Server Service Broker
Deux partie à distinguer :
L’infrastructure à mettre en place : la tuyauterie
La partie fonctionnelle : les conversations
8. Pour un bon Service Broker, il faut :
Pour deux serveurs distants :
Des types de messages
Un contrat
Deux files d’attente
Deux services
Quatre itinéraires
Deux liaisons de service distant
Trois certificats
Deux points de terminaison
Quelques droits
9. Infrastructure
Points de terminaison
Serveur partenaire
Serveur
source
Un contexte unique :
un contrat et des types de message
Service
source
Service
partenaire
Émetteur de
messages
Consommateur de
messages
File
d’attenteItinéraire
Communication cryptée
par certificats
10. Les types de messages
Sont définis par un nom et un format (libre, XML et XML validé par un schéma)
CREATE MESSAGE TYPE
[//BrokerSource_BrokerPartenaire/Process1/Envoi]
AUTHORIZATION [BrokerUser] VALIDATION = WELL_FORMED_XML;
11. Les contrats
Sont définis par un nom
Définissent les types de messages pris en charge et les émetteurs associés
CREATE CONTRACT [//BrokerSource_BrokerPartenaire/Process1]
AUTHORIZATION [BrokerUser] (
[//BrokerSource_BrokerPartenaire/Process1/Envoi] SENT BY
INITIATOR,
[//BrokerSource_BrokerPartenaire/Process1/Retour] SENT BY
INITIATOR);
12. Les files d’attente / queues
Sont définies par un nom et un schéma
Contiennent les messages, sont interrogés comme des tables ou par une commande RECEIVE (dépile le
message)
Peuvent appeler une procédure stockée et peuvent prendre en charge les messages incohérents (poison)
CREATE QUEUE [BrokerUser].[ServeurSource_Process1_Queue]
WITH STATUS = ON,
RETENTION = OFF,
ACTIVATION (STATUS = ON, PROCEDURE_NAME = [BrokerUser].[ServeurSource_TraiteMessages],
MAX_QUEUE_READERS = 1, EXECUTE AS OWNER),
POISON_MESSAGE_HANDLING (STATUS = ON)
ON [DEFAULT];
13. Les services
Sont définis par un nom
Sont associés à une file d’attente et prennent en charge un ou plusieurs
contrats
CREATE SERVICE [//BrokerSource/Process1/Service]
AUTHORIZATION [BrokerUser]
ON QUEUE [BrokerUser].[ServeurSource_Process1_Queue]
([//BrokerSource_BrokerPartenaire/Process1]);
14. Les routes
Sont définies par un nom
Permettent de définir l’accès aux services locaux ou distants et donc aux files d’attente
associées
Pour les services distants, utilisent des points de terminaisons
CREATE ROUTE [//BrokerSource/Process1/Route]
AUTHORIZATION [BrokerUser]
WITH SERVICE_NAME = N'//BrokerSource/Process1/Service', ADDRESS = N'LOCAL';
CREATE ROUTE [//BrokerPartenaire/Process1/Route]
AUTHORIZATION [BrokerUser]
WITH SERVICE_NAME = N'//BrokerPartenaire/Process1/Service', ADDRESS =
N'TCP://sqlserver2016-2.northeurope.cloudapp.azure.com:4022';
15. Les liaisons de service distant
Sont définies par un nom
Pour les services distants, permettent de définir l’utilisateur qui portera le
certificat de cryptage
CREATE REMOTE SERVICE BINDING [//BrokerPartenaire/Process1/Binding]
AUTHORIZATION [BrokerUser]
TO SERVICE N'//BrokerPartenaire/Process1/Service'
WITH USER = [BrokerUser],
ANONYMOUS = OFF;
19. Envoi d’un message
Ouvrir une conversation avec le service local, le service distant et le contrat
Récupérer l’identifiant
Envoyer le message en incluant le type de message
Le tout dans une transaction
20. Envoi d’un message
BEGIN TRANSACTION;
DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
DECLARE @MsgToSend VARBINARY(MAX);
SET @MsgToSend = CAST(@MsgXML AS VARBINARY(MAX));
BEGIN DIALOG @InitDlgHandle
FROM SERVICE [//BrokerSource/Process1/Service]
TO SERVICE N'//BrokerPartenaire/Process1/Service'
ON CONTRACT [//BrokerSource_BrokerPartenaire/Process1]
WITH ENCRYPTION = ON,
LIFETIME = 1800;
SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//BrokerSource_BrokerPartenaire/Process1/Envoi]
(@MsgToSend);
COMMIT TRANSACTION;
21. Recevoir un message
Utiliser la commande RECEIVE
Éventuellement compléter par la commande WAITFOR pour limiter l’attente à
un laps de temps
Utiliser la file d’attente
22. Recevoir un message
WAITFOR (RECEIVE TOP(1)
@Handle = [conversation_handle],
@MessageType = [message_type_name],
@Message = [message_body]
FROM
[BrokerUser].[ServeurSource_Process1_Queue]),
TIMEOUT 1000;
24. Mettre fin à une conversation
IF (@MessageType = N'//BrokerSource_BrokerPartenaire/Process1/Retour') BEGIN
EXEC [dbo].[Traitement ici] @Values = @MessageXML;
COMMIT;
END CONVERSATION @Handle;
END;
ELSE IF (@MessageType = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog') BEGIN
COMMIT;
END CONVERSATION @Handle;
END
25. Un exemple
Dans une table, j’insère un nombre
Un déclencheur envoi ce nombre dans un second serveur via un message
En retour, je reçois un nouveau nombre qui est le double du premier
Je mets à jour ce nombre double dans la table
Comme j’ai stocké l’heure initiale et l’heure finale, je connais combien de temps
les deux messages ont voyagé