Recent Posts

Archives

Categories

Meta

Service Broker

Emlékszem, mikor kaptam egy Sharp számológépet úgy kb. 25 éve és néztem mi lehet rajta az F1 – F7-es funkciók, kiderült, hogy egy 7 soros kis programozásra alkalmas, azóta direkt keresem az olyan dolgokat, amikről még nem hallottam. Az SB-vel is így voltam. Itt van egy valami, ami már az SQL 2005-ben is volt és franc tudja mit csinál? Elkezdtem foglaljozni vele, és rájöttem mennyi mindenre lehet használni.

Hogy működik?
Úgy kell elképzelni, mint egy levelezést. Küldök egy üzenetet és azt valaki fogadja, majd válaszol rá ha akar.
Ehhez persze definiálnunk kell egy postaládát ez a CREATE QUEUE. Ide dobáljuk a levelet SEND MESSAGE majd valaki kiveszi RECEIVE MESSAGE.
Hát ennyi.

Akkor mire is jó ez?

  • Evidens, hogy 2 alkalmazás közötti kommunikációra biztosan. A Queue-ba bedobálom az üzeneteimet, és azt a másik rendszer kiolvasgatja.
  • Felületről indítok egy sokáig tartó lekérdezést, és ha lefutott, megjelenítem. (Aszinkron feldolgozás)
  • Aszinkron adatbázis művelet. Pl. logolásnál a táblákra triggert teszek, ami a queue-ba belepakolja az információkat, és egy másik process ezt a queue-ból kiolvassa, majd megcsinálja a logot (elküldi e-mail-be, SMS-be vagy egy szövegfile-ba írja, esetleg egy másik alkalmazásnak küldi tovább, fantázia kérdése.)
  • Mivel az SB a feldolgozást több processzor között is el tudja osztani (beállítható, hogy hány processz dolgozza fel a queue-t), ezért a nagy tömegű adatok feldolgozását ezzel a technikával sokkal gyorsabban el lehet végezni. Pl. másodpercenként kell mondjuk 100 tételt feldolgozni, akkor lehet, hogy túlterheltté válik a feldolgozó alkalmazás. Viszont, ha csak a Queue-ba rakja a tételeket, akkor a queue-ra definiált eljárás, akár több process-t is rá tud állítani a feldolgozásra:CREATE QUEUE [dbo].[SBQueue] WITHACTIVATION (PROCEDURE_NAME = [dbo].[ExecQueueMsg] , MAX_QUEUE_READERS = 5)

SB elemek definiálása:

CREATE DATABASE ServiceBrokerTest
GO
USE ServiceBrokerTest
GO
-- Enable Service Broker
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER
GO
— Create Message Type
CREATE MESSAGE TYPE SBMessage VALIDATION = NONE
GO
-- Create Contract
CREATE CONTRACT SBContract (SBMessage SENT BY INITIATOR)
GO
— Create Send Queue
CREATE QUEUE SBSendQueue
GO
-- Create Receive Queue
CREATE QUEUE SBReceiveQueue
GO
-- Create Send Service on Send Queue
CREATE SERVICE SBSendService ON QUEUE SBSendQueue (SBContract) 
GO
-- Create Receive Service on Recieve Queue
CREATE SERVICE SBReceiveService ON QUEUE SBReceiveQueue (SBContract) 
GO

Egy egyszerű példa a fenti beállítások használatára:

-- Begin Dialog using service on contract
DECLARE @SBDialog uniqueidentifier
DECLARE @Message NVARCHAR(128)
BEGIN DIALOG CONVERSATION @SBDialog
FROM SERVICE SBSendService
TO SERVICE ‘SBReceiveService’
ON CONTRACT SBContract
WITH ENCRYPTION = OFF

-- Send messages on Dialog
SET @Message = N’Very First Message’;
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N’Second Message’;
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message)
SET @Message = N’Third Message’;
SEND ON CONVERSATION @SBDialog
MESSAGE TYPE SBMessage (@Message) 
GO
SELECT CONVERT(NVARCHAR(MAX), message_body) AS Message FROM SBSendQueue 
GO

-- Receive messages from Receive Queue
RECEIVE TOP(1) CONVERT(NVARCHAR(MAX), message_body) AS Message FROM SBReceiveQueue 
GO

Az első szakaszban megnyitjuk a beszélgetést a BEGIN DIALOG segítségével. A második szakaszban a SEND paranccsal elküldjük az üzeneteket. Végül a harmadik szakaszban a RECEIVE parancs kiolvassa ezeket. Az első két szakaszt a küldő program hajtja végre, míg a harmadikat a fogadó program.

Az alábbi ábra jól szemlélteti a működést:

sb
És egy remek példa aszinkron triggerre:

http://www.madeiradata.com/service-broker-asynchronous-triggers/

Leave a Reply