Szolgáltatásközvetítő

A következőkre vonatkozik:SQL ServerFelügyelt Azure SQL-példány

Az SQL Server Service Broker natív támogatást nyújt az üzenetkezeléshez és a sorba állításhoz az SQL Server adatbázismotorban, és Felügyelt Azure SQL-példány. A fejlesztők egyszerűen hozhatnak létre kifinomult alkalmazásokat, amelyek az adatbázismotor összetevőit használják a különálló adatbázisok közötti kommunikációhoz, valamint elosztott és megbízható alkalmazások létrehozásához.

Mikor érdemes használni a Service Brokert?

A Service Broker összetevőivel natív, adatbázison belüli aszinkron üzenetfeldolgozási funkciókat valósíthat meg. A Service Brokert használó alkalmazásfejlesztők összetett kommunikáció és üzenetkezelés belső programozása nélkül terjeszthetik az adatterheléseket több adatbázis között. A Service Broker csökkenti a fejlesztési és tesztelési munkát, mivel a Service Broker kezeli a beszélgetés kontextusában lévő kommunikációs útvonalakat. Emellett javítja a teljesítményt. A webhelyeket támogató előtér-adatbázisok például rögzíthetik az információkat, és folyamatigényes feladatokat küldhetnek a háttéradatbázisok üzenetsorába. A Service Broker biztosítja, hogy az összes feladat a tranzakciók kontextusában legyen kezelve, így biztosítva a megbízhatóságot és a műszaki konzisztenciát.

Áttekintés

A Service Broker egy üzenetkézbesítési keretrendszer, amellyel natív, adatbázison belüli szolgáltatásorientált alkalmazásokat hozhat létre. Ellentétben a klasszikus lekérdezésfeldolgozó funkciókkal, amelyek folyamatosan olvasnak adatokat a táblákból, és feldolgozzák őket a lekérdezési életciklus során, a szolgáltatásorientált alkalmazások adatbázis-szolgáltatásokkal rendelkeznek, amelyek az üzeneteket cserélik. Minden szolgáltatásnak van egy üzenetsora, ahol az üzenetek a feldolgozásukig lesznek elhelyezve.

A Service Broker folyamatfolyamatának diagramja.

Az üzenetsorokban lévő üzenetek lekérhetők a Transact-SQL RECEIVE paranccsal, vagy az üzenetsorba érkezésekor meghívott aktiválási eljárással.

Szolgáltatások létrehozása

Megjegyzés:

A célszolgáltatásnak egy vagy több szerződést kell elérhetővé tennie. Ha szerződés nélküli szolgáltatást hoz létre, az nem fog tudni üzeneteket fogadni. Az elküldött üzenetek sikeresnek tűnnek, de az üzenetek a kezdeményező sys.transmission_queue maradnak.

/*
In this example, the initiator must then use ON CONTRACT [DEFAULT] and a MESSAGE TYPE [DEFAULT]. [DEFAULT] is a delimited identifier for the built‑in contract and isn't a T‑SQL keyword, so it must be bracketed or quoted.
*/
CREATE QUEUE dbo.ExpenseQueue;
GO

CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue ([DEFAULT]);

Üzenetek küldése

A Transact-SQL utasítással SEND üzeneteket küldünk a szolgáltatások közötti beszélgetésre. A beszélgetés egy kommunikációs csatorna, amely a BEGIN DIALOG Transact-SQL utasítás használatával jön létre a szolgáltatások között.

-- Begin a dialog
DECLARE @dialog_handle AS UNIQUEIDENTIFIER;

BEGIN DIALOG @dialog_handle
    FROM SERVICE ExpensesClient
    TO SERVICE N'ExpensesService'
    ON CONTRACT [DEFAULT];

-- Send a message
SEND ON CONVERSATION (@dialog_handle)
    MESSAGE TYPE [DEFAULT] (N'<Expense ExpenseId="1" Amount="123.45" Currency="USD"/>');

Az üzenet el van küldve ide ExpensesService és el van helyezve ide dbo.ExpenseQueue. Mivel ehhez az üzenetsorhoz nincs aktiválási eljárás társítva, az üzenet addig marad az üzenetsorban, amíg valaki be nem olvassa.

Üzenetek feldolgozása

Az üzenetsorba helyezett üzenetek egy szabványos SELECT lekérdezéssel választhatók ki. Az SELECT utasítás nem módosítja az üzenetsort, és nem távolítja el az üzeneteket. Az üzenetek üzenetsorból való olvasásához és lekéréséhez használhatja a Transact-SQL utasítást RECEIVE .

RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO

Miután feldolgozta az üzenetsor összes üzenetét, a Transact-SQL utasítással zárja be a END CONVERSATION beszélgetést.

-- Drain any remaining target conversations for the from the queue
DECLARE @conversation_hdl AS UNIQUEIDENTIFIER;

WHILE EXISTS (SELECT 1 FROM dbo.ExpenseQueue)
    BEGIN
        RECEIVE TOP (1) @conversation_hdl = conversation_handle FROM dbo.ExpenseQueue;
        END CONVERSATION @conversation_hdl;
    END
GO

A Service Broker dokumentációja

A Service Broker szolgáltatással kapcsolatos további információkért lásd:

A Service Broker fogalmainak, valamint a fejlesztési és felügyeleti feladatoknak a korábban közzétett dokumentációjában is olvashat.

A Service Broker újdonságai

Service Broker és felügyelt Azure SQL-példány

Az Azure SQL Managed Instance példányai közötti Service Broker-üzenetváltás, valamint az SQL Server és az Azure SQL Managed Instance közötti üzenetváltás jelenleg nyilvános előzetes verzióban érhető el:

Az átviteli biztonság támogatott, míg a párbeszédes biztonság nem.

  • CREATE REMOTE SERVICE BINDING nem támogatott.

A Service Broker alapértelmezés szerint engedélyezve van, és nem tiltható le. A következő ALTER DATABASE beállítások nem támogatottak:

  • ENABLE_BROKER
  • DISABLE_BROKER

Az SQL Server 2019-ben (15.x) nem történt jelentős változás. Az SQL Server 2012-ben (11.x) a következő módosítások jelentek meg.

Az üzenetek több célszolgáltatásnak is elküldhetők (csoportos küldés)

A SEND utasítás szintaxisa kibővült a több beszélgetésazonosító támogatásával, lehetővé téve a multicast használatát.

Az üzenetsorok az üzenet lekérdezett idejét teszik elérhetővé

Az üzenetsorok új oszlopot tartalmaznak, amely azt mutatja, message_enqueue_timehogy egy üzenet mennyi ideig volt az üzenetsorban.

A méregüzenetek kezelése letiltható lehet

Az CREATE QUEUE és ALTER QUEUE az utasítások mostantól engedélyezhetik vagy letilthatják a méregüzenetek kezelését a záradék hozzáadásával. POISON_MESSAGE_HANDLING (STATUS = ON | OFF) A katalógusnézetben sys.service_queues most már látható az oszlop is_poison_message_handling_enabled , amely jelzi, hogy a mérgező üzenet engedélyezve van-e vagy le van-e tiltva.

Rendelkezésre állási csoport támogatása a Service Brokerben

További információért lásd a Szolgáltatásközvetítőt az Always On rendelkezésre állási csoportokkal (SQL Server).