Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              gäller för:SQL Server
Azure SQL Managed Instance
SQL Server Service Broker ger inbyggt stöd för meddelanden och köer i SQL Server Database Engine och Azure SQL Managed Instance. Utvecklare kan enkelt skapa avancerade program som använder databasmotorkomponenterna för att kommunicera mellan olika databaser och skapa distribuerade och tillförlitliga program.
När du ska använda Service Broker
Använd Service Broker-komponenter för att implementera inbyggda funktioner för asynkron meddelandebearbetning i databasen. Programutvecklare som använder Service Broker kan distribuera dataarbetsbelastningar över flera databaser utan att programmera komplex kommunikation och meddelanden internt. Service Broker minskar utvecklingen och testarbetet eftersom Service Broker hanterar kommunikationsvägarna i kontexten för en konversation. Det förbättrar också prestandan. Till exempel kan klientdatabaser som stöder webbplatser registrera information och skicka processintensiva uppgifter till kö i serverdatabaser. Service Broker säkerställer att alla uppgifter hanteras i samband med transaktioner för att säkerställa tillförlitlighet och teknisk konsekvens.
Överblick
Service Broker är ett ramverk för meddelandeleverans som gör att du kan skapa inbyggda tjänstorienterade program i databasen. Till skillnad från klassiska funktioner för frågebearbetning som ständigt läser data från tabellerna och bearbetar dem under frågelivscykeln, har tjänstorienterade program databastjänster som utbyter meddelandena. Varje tjänst har en kö där meddelandena placeras tills de bearbetas.
              
               
              
              
            
Meddelandena i köerna kan hämtas med hjälp av kommandot Transact-SQL RECEIVE eller genom aktiveringsproceduren som anropas när meddelandet kommer till kön.
Skapa tjänster
Anmärkning
En måltjänst måste exponera ett eller flera kontrakt. Om du skapar en tjänst utan kontrakt kan den inte ta emot meddelanden. Meddelanden som skickas verkar lyckas, men meddelandena finns kvar på initierarens sys.transmission_queue
/*
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]);
Skicka meddelanden
Meddelanden skickas i konversationen mellan tjänsterna med hjälp av instruktionen SEND Transact-SQL. En konversation är en kommunikationskanal som upprättas mellan tjänsterna med hjälp av instruktionen BEGIN DIALOG Transact-SQL.
-- 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"/>');
Meddelandet skickas till ExpensesService och placeras i dbo.ExpenseQueue. Eftersom ingen aktiveringsprocedur är associerad med den här kön finns meddelandet kvar i kön tills någon läser det.
Bearbeta meddelanden
De meddelanden som placeras i kön kan väljas med hjälp av en standardfråga SELECT. Instruktionen SELECT ändrar inte kön och tar bort meddelandena. Om du vill läsa och hämta meddelandena från kön kan du använda instruktionen RECEIVE Transact-SQL.
RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO
När du har bearbetat alla meddelanden från kön bör du stänga konversationen med hjälp av instruktionen END CONVERSATION Transact-SQL.
-- 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
Dokumentation om Service Broker
Mer information om Service Broker finns i:
- 
              Språkinstruktioner för datadefinitioner för CREATE,ALTERochDROP-instruktioner
- Transact-SQL-instruktioner
- katalogvyer för Service Broker (Transact-SQL)
- Service Broker-relaterade dynamiska hanteringsvyer (Transact-SQL)
- ssbdiagnose-verktyget (Service Broker)
Du kan också läsa den tidigare publicerade dokumentationen för Service Broker-begrepp och för utvecklings- och hanteringsuppgifter.
Nyheter i Service Broker
Service Broker och Azure SQL Managed Instance
Service Broker-meddelandeutbyte mellan instanser av Azure SQL Managed Instance och meddelandeutbyte mellan SQL Server och Azure SQL Manage Instance är för närvarande i offentlig förhandsversion:
- 
              CREATE ROUTE: Den angivna porten måste vara 4022. Se CREATE ROUTE (Transact-SQL).
- 
              ALTER ROUTE: Den angivna porten måste vara 4022. Se ALTER ROUTE (Transact-SQL).
Transportsäkerhet stöds, medan dialogsäkerhet inte är:
- 
              CREATE REMOTE SERVICE BINDINGstöds inte.
Service Broker är aktiverat som standard och kan inte inaktiveras. Följande ALTER DATABASE alternativ stöds inte:
- ENABLE_BROKER
- DISABLE_BROKER
Inga betydande ändringar infördes i SQL Server 2019 (15.x). Följande ändringar introducerades i SQL Server 2012 (11.x).
Meddelanden kan skickas till flera måltjänster (multicast)
Syntaxen för SEND-instruktionen utökades för att aktivera multicast genom stöd för flera konversationshandtag.
Köer exponerar den köade tiden för meddelandet
Köer har en ny kolumn, message_enqueue_time, som visar hur länge ett meddelande har legat i kön.
Hantering av giftmeddelanden kan inaktiveras
Uttrycken CREATE QUEUE och ALTER QUEUE har nu möjlighet att aktivera eller inaktivera hantering av giftmeddelanden genom att lägga till satsen . POISON_MESSAGE_HANDLING (STATUS = ON | OFF) Katalogvyn sys.service_queues har nu kolumnen is_poison_message_handling_enabled för att ange om giftmeddelande är aktiverat eller inaktiverat.
Stöd för tillgänglighetsgrupp i Service Broker
Mer information finns i Service Broker med AlwaysOn-tillgänglighetsgrupper (SQL Server).