Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Sql Server Service Broker-Gesprächsgruppen

Konversationsgruppen sind ein lokales Primitiv, das zum Sperren verwendet wird. Nachrichten innerhalb einer Konversationsgruppe haben keine Reihenfolgegarantien und Konversationsgruppen werden nicht über die Leitung übertragen.

Die Nachrichtenreihenfolge wird von Service Broker innerhalb einer Konversation garantiert. Um also die Reihenfolge der korrelierten Nachrichten bei der Verarbeitung beizubehalten, senden Sie sie in derselben Konversation.

Konversationsgruppen werden benötigt, um eine Reihe von Konversationen zu gruppieren, die miteinander in Beziehung stehen. Beide GET CONVERSATION GROUP und RECEIVE Verben garantieren, dass sie eine ganze Konversationsgruppe sperren, wodurch andere Threads daran gehindert werden, verwandte Nachrichten zu verarbeiten. Betrachten Sie zum Beispiel eine reisende Website. Es erhält eine Nachricht mit der Bitte, ein Urlaubspaket zu buchen. Als Ergebnis initiiert er ein Gespräch mit einem Hotelbuchungsdienst und sendet eine Anfrage zur Reservierung eines Zimmers, er initiiert ein Gespräch mit einem Fluglinienreservierungsdienst und fragt nach einer Reisereservierung, er initiiert ein Gespräch mit einem Mietwagenagenturdienst und fragt nach einem Autoreservierung. Diese drei neu erstellten Konversationen befinden sich alle in derselben Gruppe wie die ursprüngliche Konversation, in der die Anfrage empfangen wurde (die Anwendung hat den WITH RELATED_CONVERSATION verwendet Klausel von BEGIN DIALOG auf allen 3). Anschließend wird die Nachricht festgeschrieben und mit der Verarbeitung der Nachrichten in der Warteschlange fortgefahren. Spätere Antworten von diesen 3 korrelierten Anfragen kommen zu ziemlich zufälligen Zeiten herein. Angenommen, die Antwort des Hotels kommt zuerst. Die Nachricht wird von der Anwendung abgeholt und aktualisiert den Status der Anfrage mit der Antwort des Hotels. Gleichzeitig kommt die Antwort der Fluggesellschaft herein. Wenn es einem anderen Thread erlaubt wäre, ihn aufzunehmen, würde er versuchen, den Status des selben zu aktualisieren Anfrage, was zu einer Blockierung oder sogar einem Deadlock des Threads führt, der die Hotelantwort verarbeitet. Wenn die Antwort des Hotels verarbeitet wird, wird der Thread übergeben und damit die gesamte Konversationsgruppe entsperrt, sodass jeder Thread (einschließlich sich selbst) die Antwort der Fluggesellschaft aufnehmen und verarbeiten kann.