Dialogkonversationen

Alle von Service Broker gesendeten Nachrichten sind Teil einer Konversation. Ein Dialog ist eine Konversation zwischen zwei Diensten. Ein Dialog ist ein zuverlässiger, dauerhafter bidirektionaler Datenstrom von Nachrichten zwischen zwei Diensten.

Dialoge stellen die EOIO-Nachrichtenübermittlung bereit, bei der jede Nachricht genau einmal übertragen wird, und zwar an der Reihenfolgeposition, an der sie gesendet wurde. Dialoge verwenden den Konversationsbezeichner und die Sequenznummern, die in jeder Nachricht enthalten sind, um verknüpfte Nachrichten zu identifizieren und die Nachrichten in der richtigen Reihenfolge zu übermitteln. Ein Dialog ist ein zuverlässiger, dauerhafter Datenstrom von Nachrichten zwischen zwei Diensten.

Eine Dialogkonversation hat zwei Teilnehmer. Der Initiator startet die Konversation. Das Ziel nimmt eine Konversation an, die vom Initiator begonnen wurde. Welche Nachrichten vom Teilnehmer gesendet werden können, richtet sich danach, ob ein Teilnehmer die Konversation startet, wie im Vertrag für die Konversation angegeben. Folgendes Diagramm stellt den Nachrichtenfluss eines Dialogs dar:

Nachrichtenfluss zwischen Initiator und Ziel

Anwendungen tauschen Nachrichten als Teil des Dialogs aus. Wenn SQL Server eine Nachricht für einen Dialog empfängt, stellt SQL Server die Nachricht in die Warteschlange für den Dialog. Die Anwendung empfängt die Nachricht von der Warteschlange und verarbeitet sie nach Bedarf. Als Teil der Verarbeitung kann die Anwendung Nachrichten an den anderen Teilnehmer im Dialog senden.

Zuverlässige Übermittlung

Dialoge enthalten automatische Nachrichtenempfangsbestätigungen, um eine zuverlässige Übermittlung zu gewährleisten. Service Broker speichert die ausgehenden Nachrichten so lange in der Übertragungswarteschlange, bis die Nachricht vom Remotedienst bestätigt wird. Diese automatischen Bestätigungen sparen Zeit und Ressourcen, da eine Anwendung nun nicht mehr jede Nachricht explizit bestätigen muss. Wo es möglich ist, sind Bestätigungsnachrichten als Teil von Antwortnachrichten für den Dialog enthalten.

HinweisHinweis

Service Broker verarbeitet die Bestätigungsnachrichten intern. Diese Nachrichten werden nicht in eine Warteschlange gestellt und keiner Anwendung übermittelt.

Service Broker stuft es nicht als Fehler eines Remotediensts ein, wenn dieser nicht mehr erreichbar ist. Wenn ein Remotedienst nicht erreichbar ist, speichert Service Broker Nachrichten für diesen Dienst so lange, bis der Dienst wieder erreichbar ist oder die Dialoglebensdauer abläuft.

Dialoglebensdauer

Während der Lebensdauer des Dialogs können Nachrichten zwischen den Anwendungen ausgetauscht werden. Die Lebensdauer eines Dialogs dauert von dem Zeitpunkt an, zu dem die lokale SQL Server-Instanz den Dialog erstellt, bis zu dem Zeitpunkt, an dem eine Anwendung entweder explizit den Dialog beendet oder eine Fehlermeldung zum Dialog empfängt. Jeder Teilnehmer ist dafür verantwortlich, die Konversation explizit zu beenden, wenn die Anwendung eine Nachricht empfängt, die auf einen Fehler oder auf das Ende der Konversation hinweist. Bei den meisten Diensten ist ein Teilnehmer dafür verantwortlich, anzugeben, dass die Konversation abgeschlossen und erfolgreich ist, indem er die Konversation ohne Fehler beendet. Ob dies durch das Ziel oder den Initiator geschieht, richtet sich nach dem Zweck der Konversation.

Der lokale Service Broker für eine initiierende Anwendung erstellt einen Konversationsendpunkt für den Dialog, wenn die Anwendung den Dialog startet. Der lokale Service Broker für eine Zielanwendung erstellt einen Konversationsendpunkt für den Dialog, wenn die Instanz die erste Nachricht zum Dialog empfängt.

Dialoge können auch sicherstellen, dass die Lebensdauer einer Konversation einen bestimmten Grenzwert nicht überschreitet. Die initiierende Anwendung kann optional eine maximale Lebensdauer für den Dialog angeben. Sowohl der lokale Service Broker als auch der Remote-Service Broker überwachen diese Lebensdauer. Wenn ein Dialog bei maximaler Lebensdauer aktiv bleibt, stellt jede Seite der Konversation eine Timeoutfehlermeldung in die Dienstwarteschlange und lehnt neue Nachrichten für den Dialog ab. Konversationen überdauern nie die maximale Lebensdauer, die beim Start des Dialogs erstellt wurde. Obwohl eine Anwendung weiterhin Nachrichten für die Konversation empfangen kann, nachdem die Konversation beendet wurde, können für diese Konversation keine neuen Nachrichten eintreffen. Die Anwendung kann keine Nachrichten über die Konversation senden.

Anwendungen sind dafür verantwortlich mitzuteilen, wann sie einen Dialog abgeschlossen haben, indem sie den Dialog explizit beenden. Service Broker beendet einen Dialog nie automatisch. Der Dialog bleibt so lange in der Datenbank, bis eine Anwendung die Konversation explizit beendet. Selbst wenn also das Timeout für den Dialog eintritt oder der Broker einen Fehler meldet, muss jeder Teilnehmer der Konversation die END CONVERSATION-Anweisung explizit ausgeben.

Konversationszeitgeber

Mithilfe des Konversationszeitgebers kann eine Anwendung eine Nachricht zu einem bestimmten Zeitpunkt empfangen. Wenn der Konversationszeitgeber abläuft, fügt SQL Server eine Nachricht für die Konversation in die Warteschlange für die Konversation ein, und zwar an dem Endpunkt, der den Konversationszeitgeber startete. Eine Anwendung kann einen Konversationszeitgeber für jeden Zweck verwenden. Er wird häufig verwendet, um auf Verzögerungen bei Antworten vom Remotedienst zu reagieren. Eine andere übliche Verwendung besteht im Erstellen eines Diensts, der in bestimmten Zeitabständen Nachrichten an den Remotedienst sendet. Ein Dienst kann z. B. einen Konversationszeitgeber verwenden, um den aktuellen Status von SQL Server im Abstand von wenigen Minuten zu melden. Anwendungen können auch einen Konversationszeitgeber verwenden, um zu einem bestimmten Zeitpunkt eine gespeicherte Prozedur zu aktivieren. So kann Service Broker geplante Aktivitäten unterstützen.

Jeder Teilnehmer in einer Konversation kann einen Konversationszeitgeber pro Konversation festlegen. Der Konversationszeitgeber wird für den anderen Teilnehmer nicht freigegeben und beeinträchtigt die Lebensdauer der Konversation nicht. Wenn der Zeitgeber abläuft, fügt der lokale Service Broker stattdessen der Warteschlange für den lokalen Dienst eine Timeoutnachricht hinzu. Eine Timeoutnachricht hat den Typnamen https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer