Konversationsgruppen

Eine Konversationsgruppe identifiziert eine Gruppe zusammengehöriger Konversationen. Eine Konversationsgruppe ermöglicht einer Anwendung die Koordinierung von an einer bestimmten Geschäftsaufgabe beteiligten Konversationen.

Jede Konversation gehört zu einer Konversationsgruppe. Jede Konversationsgruppe ist einem bestimmten Dienst zugeordnet, und alle Konversationen in der Gruppe sind Konversationen zu oder von diesem Dienst. Eine Konversationsgruppe kann eine beliebige Anzahl von Konversationen enthalten.

SQL Server verwendet Konversationsgruppen, um Zugriff auf Nachrichten im Zusammenhang mit einer bestimmten Geschäftsaufgabe genau einmal zu gewähren, und zwar an der Reihenfolgeposition, an der sie gesendet werden. Wenn eine Anwendung eine Nachricht sendet oder empfängt, sperrt SQL Server die Konversationsgruppe, zu der die Nachricht gehört. So können jeweils nur in einer Sitzung Nachrichten für die Konversationsgruppe empfangen werden. Durch die Sperrung von Konversationsgruppen wird sichergestellt, dass eine Anwendung Nachrichten in jeder Konversation genau einmal in der richtigen Reihenfolge verarbeiten kann. Da eine Konversationsgruppe mehr als eine Konversation enthalten kann, kann eine Anwendung Konversationsgruppen verwenden, um Nachrichten im Zusammenhang mit derselben Geschäftsaufgabe zu identifizieren, und diese Nachrichten zusammen verarbeiten.

Eine Konversationsgruppe wird für die Teilnehmer einer Konversation nicht freigegeben. Deshalb kann jeder Teilnehmer einer Konversation diese nach Bedarf einer Gruppe zuordnen. Eine Anwendung kann komplexe Interaktionen zwischen Diensten verwalten, ohne dass eine besondere Unterstützung durch diese Dienste erforderlich ist.

Beispiele für Konversationsgruppen

Eine Personalabteilungsanwendung kann einen Dienst GetEmployeeInformation nutzen, durch den Informationen von einem Lohnbuchhaltungsdienst und Informationen von einem Lohnzuschlägedienst kombiniert werden. Der Dienst GetEmployeeInformation beginnt einen Dialog mit jedem Dienst und ordnet eine Konversation der anderen in derselben Konversationsgruppe zu. Service Broker fügt jeder eingehenden Nachricht in diesen zwei Konversationen den Konversationsgruppenbezeichner hinzu, unabhängig davon, ob die Nachricht vom Lohnbuchhaltungs- oder Lohnzuschlägedienst eingeht. Da sich die Konversationen in derselben Konversationsgruppe befinden, stellt Service Broker alle Informationen bereit, die notwendig sind, damit der Dienst GetEmployeeInformation die Zuschlagsinformationen den Lohnbuchhaltungsinformationen zuordnen kann. Dies erfolgt unabhängig von der Anzahl aktiver Anforderungen im Dienst GetEmployeeInformation.

Die Nachrichten zum Lohnbuchhaltungsdienst und die Nachrichten zu den Lohnzuschlägen enthalten keine Konversationsgruppeninformationen für die von GetEmployeeInformation erstellte Konversationsgruppe. Jeder Dienst führt Vorgänge eigenständig aus, und nur vom Dienst GetEmployeeInformation werden Informationen über die gesamte Geschäftsaufgabe verwaltet. Eigenständige Dienste vereinfachen die Codierung und Wartung. Ein weiterer Vorteil dieser Eigenständigkeit besteht darin, dass bei Nichtverfügbarkeit eines Diensts der andere weiter verwendet werden kann.

Verwalten des Anwendungsstatus

Ein Vorteil der Konversationsgruppe besteht darin, dass der Konversationsgruppenbezeichner ein praktischer Schlüssel zum Identifizieren und Abrufen des Anwendungsstatus ist. Der Konversationsgruppenbezeichner vereinfacht die Verwaltung des Anwendungsstatus in der Datenbank. Wenn das Ausführen der Aufgabe den Austausch zahlreicher Nachrichten im Zeitverlauf erfordert, ist es ineffizient, eine Instanz der Anwendung auszuführen, nur um den Anwendungsstatus zu verwalten. Die Skalierbarkeit einer Anwendung zwischen Nachrichten ist besser, wenn der Aufgabe zugeordnete Daten in der Datenbank gespeichert und dann abgerufen werden, wenn die nächste dieser Aufgabe zugeordnete Nachricht empfangen wird. Der Konversationsgruppenbezeichner kann als Primärschlüssel in einer Statustabelle verwendet werden, die von einem Anwendungsentwickler bereitgestellt wird, um die schnellere Abfrage des einer bestimmten Aufgabe zugeordneten Status zu ermöglichen. Weitere Informationen zum Verwenden des Konversationsgruppenbezeichners zur Verwaltung des Status finden Sie unter Zustandsverwaltung.

Weil SQL Server die Konversationsgruppe stets sperrt, wenn eine Anwendung eine Nachricht sendet oder empfängt, muss eine Anwendung ein anderes Programm nicht explizit daran hindern, dieselben Statusdaten gleichzeitig zu aktualisieren. Die Anwendung sperrt die Konversationsgruppe, stellt den Status wieder her, verarbeitet die Nachrichten, aktualisiert den Status und führt dann einen Commit für die Transaktion aus.

SQL Server ermöglicht einer Anwendung, die nächste verfügbare Konversationsgruppe zu sperren, ohne eine Nachricht zu empfangen. Mithilfe der GET CONVERSATION GROUP-Anweisung kann eine Anwendung eine Konversationsgruppe sperren und den Status wiederherstellen, bevor die Nachrichten verarbeitet werden. Weitere Informationen finden Sie unter GET CONVERSATION GROUP (Transact-SQL).

Lebensdauer von Konversationsgruppen

Service Broker verwaltet die Lebensdauer der Konversationsgruppe. Sie müssen eine Konversationsgruppe nicht explizit erstellen oder löschen. Service Broker erstellt eine neue Konversationsgruppe unter den folgenden Umständen:

  • Eine Anwendung beginnt eine neue Konversation, die sich nicht auf eine vorhandene Konversationsgruppe bezieht. Service Broker erstellt eine neue Konversationsgruppe und weist der Konversationsgruppe einen neuen Bezeichner zu.

  • Eine Anwendung beginnt eine Konversation mit einem Konversationsgruppenbezeichner, der derzeit nicht vorhanden ist. In diesem Fall erstellt Service Broker eine neue Konversationsgruppe mit dem angegebenen Bezeichner. Dies bedeutet, dass Sie einem Konversationsgruppenbezeichner einen eigenen Wert zuweisen können.

  • Service Broker empfängt die erste Nachricht in einer von einem anderen Dienst gestarteten neuen Konversation. In diesem Fall verwendet Service Broker den Namen des Diensts und gegebenenfalls den Brokerinstanzbezeichner, um Folgendes auszuführen:

    1. Suchen der entsprechenden Warteschlange.

    2. Erstellen einer neuen Konversationsgruppe und Zuordnen dieser Konversationsgruppe zur Warteschlange.

    3. Erstellen eines neuen Konversationshandles und Hinzufügen des Handles zur neuen Konversationsgruppe.

    4. Einfügen der eingehenden Nachricht in die Warteschlange.

Service Broker fügt den Konversationsgruppenbezeichner den Metadaten für die Konversation hinzu, durch die die Konversationsgruppe erstellt wurde. Jedes Mal, wenn Service Broker eine Nachricht für eine der Konversationsgruppe zugeordnete Konversation empfängt, wird dieser Nachricht der Konversationsgruppenbezeichner hinzugefügt, bevor sie in die Warteschlange eingegeben wird.

Ein Konversationsgruppenbezeichner ist vom Zeitpunkt seiner Erstellung durch Service Broker gültig bis zu dem Zeitpunkt, zu dem alle dem Bezeichner zugeordneten Konversationen enden. Der Konversationsgruppenbezeichner ist also gültig, solange eine Konversation in der Gruppe aktiv ist.

Eine Anwendung, die den Konversationsgruppenbezeichner zur Verwaltung des Anwendungsstatus verwendet, verwendet eine vom Entwickler bereitgestellte Statustabelle. Die Anwendung muss diesen Status aus der Statustabelle löschen, wenn sie ermittelt, dass der Status nicht mehr notwendig ist. In vielen Fällen löscht die Anwendung den Status, nachdem die Aufgabe erfolgreich abgeschlossen wurde oder nachdem Fehler darauf hinweisen, dass sie nicht ausgeführt werden kann. In diesen Fällen schließt die Anwendung normalerweise den Befehl zum Löschen des Status innerhalb der Transaktion ein, mit der die letzte Antwortnachricht gesendet und die Konversation beendet wird. Diese Strategie stellt sicher, dass der Anwendungsstatus und der Konversationsgruppenbezeichner dieselbe Lebensdauer aufweisen. Wenn der Sendevorgang einen Fehler erzeugt, wird ein Rollback für den Löschvorgang ausgeführt. Wenn der Löschvorgang einen Fehler erzeugt, wird ein Rollback für den Sendevorgang ausgeführt, und SQL Server sendet die Nachricht nicht. In jedem Fall bleiben der Anwendungsstatus und der Konversationsgruppenbezeichner gültig. Wenn beide Vorgänge erfolgreich sind, endet die Lebensdauer des Konversationsgruppenbezeichners zur gleichen Zeit, zu der das Programm den zugeordneten Anwendungsstatus löscht.