9 Stimmen

Sql Server Service Broker-Gesprächsgruppen

Kann jemand Konversationsgruppen in Service Broker erklären?

Derzeit verwende ich Service Broker, um Nachrichten von einem SQL-Server zu einem anderen zu senden. Auf dem sendenden Server versuche ich, die Nachrichten zu korrelieren, damit sie auf der empfangenden Seite in Serie verarbeitet werden. Ausgehend von der Dokumentation scheinen Konversationsgruppen perfekt dafür geeignet zu sein, aber auf dem Empfangsserver werden die Nachrichten einer anderen Konversationsgruppe zugewiesen als der, die ich beim Senden der Nachricht angegeben habe.

Ich habe mich im Internet umgesehen und gesehen, dass dieses Verhalten beabsichtigt zu sein scheint ( http://social.msdn.microsoft.com/forums/en-US/sqlservicebroker/thread/baf48074-6804-43ab-844a-cb28a6dce02b/ ), aber dann bin ich verwirrt über die Nützlichkeit der Syntax von ( http://msdn.microsoft.com/en-us/library/ms178624.aspx )

WAITFOR( 
  GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[ReceiveQueue]
)

Wenn die Konversationsgruppe nicht mit der Nachricht des Absenders übermittelt wird und Nachrichten, die mit der gleichen Konversationsgruppenkennung gesendet werden, nicht die gleiche Konversationsgruppenkennung auf der Empfangsseite haben, was ist dann der Sinn des obigen Codes?

27voto

Remus Rusanu Punkte 280155

Gesprächsgruppen sind ein lokales Primitivum, das zum Abschließen verwendet wird. Nachrichten innerhalb einer Gesprächsgruppe haben keine Ordnungsgarantie, und Gesprächsgruppen fließen nicht über die Leitung.

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

Gesprächsgruppen werden benötigt, um eine Reihe von Gesprächen zu gruppieren, die miteinander in Beziehung stehen. Beide GET CONVERSATION GROUP y RECEIVE Verben garantieren, dass sie eine ganze Konversionsgruppe sperren und damit verhindern, dass andere Threads damit zusammenhängende Nachrichten bearbeiten. Nehmen wir zum Beispiel eine reisende Website. Sie erhält eine Nachricht mit einer Anfrage zur Buchung eines Urlaubspakets. Daraufhin leitet sie eine Konversation mit einem Hotelbuchungsdienst ein und sendet eine Anfrage zur Reservierung eines Zimmers, sie leitet eine Konversation mit einem Flugbuchungsdienst ein und bittet um eine Reisebuchung, sie leitet eine Konversation mit einem Autovermietungsdienst ein und bittet um eine Fahrzeugreservierung. Diese drei neu erstellten Konversationen befinden sich alle in der gleichen Gruppe wie die ursprüngliche Konversation, in der die Anfrage eingegangen ist (die Anwendung hat die WITH RELATED_CONVERSATION Klausel von DIALOG BEGINNEN bei allen 3). Anschließend wird die Verarbeitung der Nachrichten in der Warteschlange fortgesetzt. Später treffen die Antworten dieser 3 korrelierten Anfragen zu ziemlich zufälligen Zeiten ein. Nehmen wir an, die Antwort des Hotels kommt zuerst. Die Nachricht wird von der Anwendung aufgegriffen und der Status der Anfrage wird mit der Antwort des Hotels aktualisiert. Zur gleichen Zeit kommt die Antwort der Fluggesellschaft herein. Wenn ein anderer Thread die Möglichkeit hätte, sie abzuholen, würde er versuchen, den Status der Anfrage zu aktualisieren. dieselbe Anfrage, so dass der Thread, der die Hotelantwort verarbeitet, blockiert wird oder sogar in eine Sackgasse gerät. Wenn die Hotelantwort verarbeitet ist, wird der Thread festgeschrieben und damit die gesamte Konversationsgruppe entsperrt, so dass jeder Thread (auch er selbst) die Antwort der Fluggesellschaft abholen und verarbeiten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X