Konversationsgrupper

gäller för:SQL ServerAzure SQL Managed Instance

En konversationsgrupp identifierar en grupp med relaterade konversationer. Med en konversationsgrupp kan ett program enkelt samordna konversationer som ingår i en specifik affärsuppgift.

Varje konversation tillhör en konversationsgrupp. Varje konversationsgrupp är associerad med en specifik tjänst och alla konversationer i gruppen är konversationer till eller från den tjänsten. En konversationsgrupp kan innehålla valfritt antal konversationer.

SQL Server använder konversationsgrupper för att ge exakt en gång i ordningen (EOIO) åtkomst till meddelanden som är relaterade till en specifik affärsuppgift. När ett program skickar eller tar emot ett meddelande låser SQL Server den konversationsgrupp som meddelandet tillhör. Därför kan endast en session i taget ta emot meddelanden för konversationsgruppen. Konversationsgruppens lås garanterar att ett program kan bearbeta meddelanden i varje konversation exakt en gång i ordning (EOIO). Eftersom en konversationsgrupp kan innehålla mer än en konversation kan ett program använda konversationsgrupper för att identifiera meddelanden som är relaterade till samma affärsuppgift och bearbeta dessa meddelanden tillsammans.

En konversationsgrupp delas inte mellan deltagare i en konversation. Därför är varje deltagare i en konversation fri att gruppera den konversationen efter behov. Ett program kan hantera komplexa interaktioner mellan tjänster utan att kräva särskilt stöd från tjänsterna.

Exempel på konversationsgrupper

Ett personalprogram kan ha en GetEmployeeInformation tjänst som kombinerar information från en lönetjänst och information från en förmånstjänst. Tjänsten GetEmployeeInformation inleder en konversation med varje tjänst och relaterar en konversation till den andra i samma konversationsgrupp. Service Broker lägger till konversationsgruppidentifieraren till varje inkommande meddelande i dessa två konversationer, oavsett om meddelandet kommer från lönetjänsten eller förmånstjänsten. Eftersom konversationerna finns i samma konversationsgrupp tillhandahåller Service Broker all information som krävs för GetEmployeeInformation att tjänsten ska matcha förmånsinformationen med löneinformationen, oavsett hur många begäranden som pågår i GetEmployeeInformation tjänsten.

Meddelandena till lönetjänsten och meddelandena till förmånstjänsten innehåller inte konversationsgruppsinformation för konversationsgruppen som skapats av GetEmployeeInformation. Varje tjänst fungerar oberoende av varandra och endast tjänsten GetEmployeeInformation har information om hela affärsuppgiften. Att hålla tjänsterna oberoende av varandra gör varje tjänst enkel att koda och lätt att underhålla. En annan fördel med att upprätthålla detta oberoende är att om en tjänst inte är tillgänglig kan den andra tjänsten fortsätta att fungera.

Ordna programtillstånd

En fördel med konversationsgruppen är att konversationsgruppens identifierare är en praktisk nyckel för att identifiera och hämta programtillstånd. Konversationsgruppidentifieraren gör det enkelt att underhålla programtillståndet i databasen. Om du utför en uppgift genom att utbyta många meddelanden över tid är det ineffektivt att hålla en instans av programmet igång bara för att behålla programtillståndet. Ett program skalar bättre om, mellan meddelanden, data som är associerade med uppgiften lagras i databasen och sedan hämtas när nästa meddelande som är associerat med den uppgiften tas emot. Konversationsgruppidentifieraren kan användas som primärnyckel i en tillståndstabell som tillhandahålls av en programutvecklare för att möjliggöra snabb hämtning av tillståndet som är associerat med en viss uppgift. Mer information om hur du använder konversationsgruppidentifieraren för att underhålla tillstånd finns i Tillståndshantering.

Eftersom SQL Server låser konversationsgruppen varje gång ett program skickar eller tar emot ett meddelande behöver ett program inte uttryckligen förhindra att ett annat program uppdaterar samma tillståndsdata samtidigt. Programmet låser helt enkelt konversationsgruppen, återställer tillstånd, bearbetar meddelanden, uppdaterar tillstånd och genomför sedan transaktionen.

För enkelhetens skull tillåter SQL Server att ett program låser nästa tillgängliga konversationsgrupp utan att ta emot ett meddelande. Med hjälp av -instruktionen GET CONVERSATION GROUP kan ett program låsa en konversationsgrupp och återställa tillstånd innan meddelanden bearbetas. Mer information finns i GET CONVERSATION GROUP-instruktionen .

Livslängd för konversationsgrupp

Service Broker hanterar konversationsgruppens livslängd. Du behöver inte uttryckligen skapa eller förstöra en konversationsgrupp. Service Broker skapar en ny konversationsgrupp under följande omständigheter:

  • Ett program påbörjar en ny konversation som inte är relaterad till en befintlig konversationsgrupp. Service Broker skapar en ny konversationsgrupp och tilldelar en ny identifierare till konversationsgruppen.

  • Ett program påbörjar en konversation relaterad till en konversationsgruppsidentifierare som för närvarande inte finns. I det här fallet skapar Service Broker en ny konversationsgrupp med den angivna identifieraren. Det innebär att du kan tilldela ett eget värde till en konversationsgruppsidentifierare.

  • Service Broker tar emot det första meddelandet i en ny konversation som startas av en annan tjänst. I det här fallet använder Service Broker namnet på tjänsten och koordinatorinstansidentifieraren (om det finns någon) för att göra följande:

    1. Leta rätt kö.
    2. Skapa en ny konversationsgrupp och associera konversationsgruppen med kön.
    3. Skapa ett nytt konversationshandtag och lägg till konversationshandtaget i den nya konversationsgruppen.
    4. Placera det inkommande meddelandet i kön.

Service Broker lägger till konversationsgruppidentifieraren i metadata för konversationen som skapade konversationsgruppen. När Service Broker tar emot ett meddelande för alla konversationer som är associerade med konversationsgruppen lägger Service Broker till konversationsgruppidentifieraren i meddelandet innan meddelandet anges i kön.

En konversationsgruppsidentifierare är giltig från den tidpunkt då Service Broker skapar den tills alla konversationer som är associerade med identifierarens slut. Det vill: konversationsgruppens identifierare är garanterat giltig medan alla konversationer i gruppen är aktiva.

Ett program som använder konversationsgruppidentifieraren för att hantera programtillstånd använder en tillståndstabell som tillhandahålls av utvecklaren. Programmet måste ta bort tillståndet från tillståndstabellen när programmet fastställer att tillståndet inte längre är nödvändigt. I många fall tar programmet bort tillståndet när aktiviteten har slutförts, eller efter fel anger att aktiviteten inte kan slutföras. I dessa fall innehåller programmet vanligtvis kommandot för att ta bort tillståndet i transaktionen som skickar det slutliga svarsmeddelandet och avslutar konversationen. Den här strategin säkerställer att programtillståndet och konversationsgruppidentifieraren har samma livslängd. Om sändningsåtgärden misslyckas återställs borttagningsåtgärden. På samma sätt återställs sändningsåtgärden om borttagningen misslyckas och SQL Server skickar inte meddelandet. I båda fallen är programtillståndet och konversationsgruppens identifierare giltiga. Om båda åtgärderna lyckas upphör livslängden för konversationsgruppens identifierare samtidigt som programmet tar bort det associerade programtillståndet.