Konversationsprioritäten

Konversationsprioritäten sind eine Reihe benutzerdefinierter Regeln, von denen jede eine Prioritätsstufe und die Kriterien angibt, mit denen festgelegt wird, welche Service Broker-Konversationen der Prioritätsstufe zugewiesen werden sollen. Nachrichten aus Konversationen mit hohen Prioritätsstufen werden in der Regel vor Nachrichten aus Konversationen mit niedrigen Prioritätsstufen gesendet oder empfangen.

Einsatzmöglichkeiten von Konversationsprioritäten

Konversationsprioritäten können zu folgenden Zwecken verwendet werden:

  • Ermitteln von Konversationen, die Vorrang gegenüber anderen haben

  • Unterstützen unterschiedlicher Dienstebenen, bei denen Nachrichten von Kunden, die höhere Gebühren zahlen, vor Nachrichten von Kunden gesendet werden, die niedrigere Gebühren zahlen

  • Vorziehen von Kundenanforderungen vor Hintergrundtasks. Neukundenanmeldungen sollten beispielsweise eine höhere Priorität haben als das Versenden von Geschäftstransaktionsübersichten an ein Data Warehouse.

Konversationsprioritäten und Konversationsendpunkte

Konversationsprioritäten werden in jeder Datenbank mit der CREATE BROKER PRIORITY-Anweisung erstellt. Jede Konversationspriorität definiert Folgendes:

  • Einen Namen für die Konversationspriorität

  • Eine Prioritätsstufe, die Service Broker-Konversationen zugewiesen wird. Die Stufen werden als ganze Zahlen von 1 (niedrigste Stufe) bis 10 (höchste Stufe) angegeben. Der Standardwert ist 5.

  • Die Kriterien, die festlegen, welche Konversationen die Prioritätsstufe für Folgendes übernimmt:

    • Ein Vertragsname oder ANY

    • Ein lokaler Dienstname oder ANY

    • Ein Remotedienstname oder ANY

Service Broker weist die Prioritätsstufen Konversationsendpunkten zu, wenn die Endpunkte erstellt werden. Jede Konversation verfügt über zwei Konversationsendpunkte:

  • Der Konversationsendpunkt für den Initiator ordnet eine Seite der Konversation dem Initiatordienst und der Initiatorwarteschlange zu. Der Konversationsendpunkt für den Initiator wird beim Ausführen der BEGIN DIALOG-Anweisung erstellt. Dem Konversationsendpunkt für den Initiator sind folgende Vorgänge zugeordnet:

    • Sendevorgänge vom Initiatordienst

    • Empfangsvorgänge von der Initiatorwarteschlange

    • Das Abrufen der nächsten Konversationsgruppe aus der Initiatorwarteschlange

  • Der Konversationsendpunkt für das Ziel ordnet die andere Seite der Konversation dem Zieldienst und der Warteschlange zu. Der Konversationsendpunkt für das Ziel wird erstellt, wenn die erste Nachricht aus dem Initiator in der Zielwarteschlange abgelegt wird. Dem Konversationsendpunkt für das Ziel sind folgende Vorgänge zugeordnet:

    • Empfangsvorgänge von der Zielwarteschlange

    • Sendevorgänge vom Zieldienst

    • Das Abrufen der nächsten Konversationsgruppe aus der Zielwarteschlange

Welcher Dienst als lokaler Dienst oder Remotedienst ausgewertet wird, hängt vom Typ des Konversationsendpunkts ab:

  • Für den Konversationsendpunkt für den Initiator ist der Initiatordienst der lokale Dienst und der Zieldienst der Remotedienst.

  • Für den Konversationsendpunkt für das Ziel ist der Zieldienst der lokale Dienst und der Initiatordienst der Remotedienst.

So weist Service Broker Prioritätsstufen zu

In Service Broker werden Konversationsprioritätsstufen beim Erstellen von Endpunkten zugeordnet. Der Konversationsendpunkt behält die Prioritätsstufe bei, bis die Konversation beendet ist. Neue Prioritäten oder Änderungen an vorhandenen Prioritäten werden nicht für vorhandene Konversationen übernommen.

Service Broker weist dem Konversationsendpunkt die Prioritätsstufe aus der Konversationspriorität zu, deren Vertrags- und Dienstkriterien die größte Übereinstimmung mit den Eigenschaften des Endpunkts aufweisen. In der folgenden Tabelle wird die Rangfolge bei Übereinstimmungen angezeigt:

Endpunktvertrag

Lokaler Dienst des Endpunkts

Remotedienst des Endpunkts

Vorrangiger Vertrag

Vorrangiger lokaler Dienst

Vorrangiger Remotedienst

Vorrangiger Vertrag

Vorrangiger lokaler Dienst

ANY

Vorrangiger Vertrag

ANY

Vorrangiger Remotedienst

Vorrangiger Vertrag

ANY

ANY

ANY

Vorrangiger lokaler Dienst

Vorrangiger Remotedienst

ANY

Vorrangiger lokaler Dienst

ANY

ANY

ANY

Vorrangiger Remotedienst

ANY

ANY

ANY

Service Broker sucht zuerst nach einer Priorität, bei der der angegebene Vertrag, der lokale Dienst und der Remotedienst dem Vertrag, dem lokalen Dienst und dem Remotedienst des Konversationsendpunkts entsprechen. Wird keine entsprechende Priorität gefunden, sucht Service Broker nach einer Priorität, bei der der Vertrag und der lokale Dienst dem Vertrag und dem lokalen Dienst des Endpunkts entsprechen und für die der Remotedienst als ANY angegeben wurde. Dieser Vorgang wird für alle Varianten fortgesetzt, die in der Rangfolgentabelle aufgeführt werden. Wenn keine Übereinstimmung gefunden wird, wird dem Endpunkt die Standardpriorität 5 zugewiesen.

Die Service Broker-Kommunikationsprotokolle übertragen keine Prioritätsstufen zwischen Konversationsendpunkten. Service Broker weist jedem Endpunkt unabhängig voneinander eine Prioritätsstufe zu. Damit Service Broker dem Konversationsendpunkt für den Initiator und das Ziel Prioritätsstufen zuordnet, müssen Sie sicherstellen, dass beide Endpunkte von Konversationsprioritäten abgedeckt werden. Wenn sich die Konversationsendpunkte für den Initiator und das Ziel in verschiedenen Datenbanken befinden, müssen Sie in jeder Datenbank Konversationsprioritäten erstellen. Wenn sich die Endpunkte für den Initiator und das Ziel in derselben Datenbank befinden, gilt Folgendes:

  • Sie können beide Konversationsendpunkte mit einer Konversationspriorität abdecken, die den von der Konversation verwendeten Vertragsnamen und ANY für den Namen des lokalen Diensts und des Remotediensts angibt.

  • Sie können jeden Konversationsendpunkt mit zwei Konversationsprioritäten separat abdecken:

    • Eine Konversation für den Endpunkt für den Initiator, die den Initiatordienstnamen für LOCAL_SERVICE_NAME und den Zieldienstnamen für REMOTE_SERVICE_NAME angibt.

    • Eine Konversation für den Endpunkt für das Ziel, die den Zieldienstnamen für LOCAL_SERVICE_NAME und den Initiatordienstnamen für REMOTE_SERVICE_NAME angibt.

In der Regel wird die gleiche Prioritätsstufe für beide Konversationsendpunkte einer Konversation angegeben. Sie können zwar verschiedene Prioritätsstufen für jeden Endpunkt angeben. Das bedeutet jedoch nicht, dass Nachrichten in eine Richtung schneller gesendet werden als in die andere. Nachrichten werden von einem Konversationsendpunkt gesendet und beim anderen Endpunkt empfangen. Deshalb wird jede Nachrichtenübertragung von den Prioritätsstufen, die beiden Endpunkten zugewiesen sind, beeinflusst. Sie können eine Konversation beispielsweise so konfigurieren, dass der Konversationsendpunkt für den Initiator die Prioritätsstufe 10 und der Zielendpunkt die Prioritätsstufe 1 aufweist. In diesem Fall gilt Folgendes:

  • Nachrichten, die mit Prioritätsstufe 10 vom Initiatordienst übertragen werden, werden von der Zielwarteschlange mit Prioritätsstufe 1 empfangen.

  • Nachrichten, die vom Zieldienst mit Prioritätsstufe 1 übertragen werden, werden von der Initiatorwarteschlange mit Prioritätsstufe 10 empfangen.

Einer Konversationsgruppe wird dieselbe Prioritätsstufe zugewiesen wie die höchste einer Konversation zugewiesene Prioritätsstufe, wenn folgende Bedingungen erfüllt sind:

  • Die Konversation ist ein Element der Gruppe.

  • Die Konversation verfügt derzeit über Nachrichten in der Dienstwarteschlange.

Allen Konversationsendpunkten in einer Datenbank sind Standardprioritäten von 5 zugewiesen, wenn keine Konversationsprioritäten in der Datenbank erstellt wurden.

Konversationsprioritäten wirken sich nicht auf die Nachrichtenweiterleitung aus, die immer auf der Standardprioritätsstufe 5 erfolgt.

Beispiel für die Konversationspriorität

Betrachten Sie ein System mit Folgendem:

  • InitiatorDB mit einem InitiatorService und einer InitiatorQueue

  • TargetDB mit einem TargetService und einer TargetQueue

  • Ein Vertrag mit dem Namen SimpleContract, der angibt, dass RequestMessages vom InitiatorService zum TargetService gesendet werden. Außerdem gibt der Vertrag an, dass ReplyMessages vom TargetService zum InitiatorService gesendet werden.

Dieses Skript gibt die Prioritätsstufe für den Konversationsendpunkt für den Initiator und die zugehörigen Vorgänge an:

  • Der SEND-Vorgang der RequestMessage vom InitiatorService zur TargetQueue

  • Der RECEIVE-Vorgang der ReplyMessage von der InitiatorQueue

USE InitiatorDB;
GO
CREATE BROKER PRIORITY InitiatorToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = InitiatorSerivce,
         REMOTE_SERVICE_NAME = N'TargetService',
         PRIORITY_LEVEL = 3);
GO

Dieses Skript gibt die Prioritätsstufe für den Konversationsendpunkt für das Ziel und die zugehörigen Vorgänge an:

  • Der RECEIVE-Vorgang der RequestMessage von der TargetQueue

  • Der SEND-Vorgang der RequestMessage vom TargetService zur InitiatorQueue

USE TargetDB;
GO
CREATE BROKER PRIORITY TargetToInitiatorPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = TargetService,
         REMOTE_SERVICE_NAME = N'InitiatorService',
         PRIORITY_LEVEL = 3);
GO

So funktionieren Prioritäten

Normalerweise sendet und empfängt Service Broker Nachrichten für Konversationen mit hoher Priorität vor dem Senden und Empfangen von Konversationen mit niedriger Priorität. Nachrichten aus Konversationen mit hoher Priorität verbringen weniger Zeit in Warteschlangen als Nachrichten aus Konversationen mit niedriger Priorität.

Empfangsprioritätsstufen

Prioritätsstufen werden immer für Vorgänge übernommen, die Nachrichten oder Konversationsgruppenbezeichner aus einer Warteschlange empfangen.

Die Prioritätsstufe ist einer der Faktoren, die festlegen, welche Nachrichten in welcher Reihenfolge durch einen RECEIVE-Vorgang abgerufen werden.

  • Jede RECEIVE-Anweisung ruft immer Nachrichten aus einer Konversationsgruppe ab:

    • Eine RECEIVE-Anweisung ohne WHERE-Klausel ruft Nachrichten ab, die zur freigegebenen Konversationsgruppe mit der höchsten Priorität gehören, die Nachrichten in der Warteschlange enthält.

    • Eine RECEIVE-Anweisung mit WHERE-Klausel ruft die Nachrichten für die in der WHERE-Klausel angegebene Konversationsgruppe ab.

  • Innerhalb einer Konversationsgruppe ruft die RECEIVE-Anweisung Nachrichten je nach der Prioritätsstufe der Konversationen in der Gruppe ab. Alle Nachrichten aus der Konversation mit der höchsten Prioritätsstufe werden zuerst abgerufen, gefolgt von den Nachrichten für die Konversation mit der nächsthöchsten Prioritätsstufe usw.

  • Innerhalb einer Konversation werden die Nachrichten in derselben Reihenfolge abgerufen, in der sie gesendet wurden.

GET CONVERSATION GROUP gibt die Gruppe mit der höchsten Prioritätsstufe aus dem Satz der freigegebenen Gruppen zurück, die Nachrichten in der Warteschlange haben.

Übertragungsprioritätsstufen

Nachrichten in den Übertragungswarteschlangen für eine Instanz werden anhand folgender Kriterien der Reihe nach übertragen:

  • Prioritätsstufe ihres zugeordneten Konversationsendpunkts

  • Innerhalb der Prioritätsstufe die Sendereihenfolge in der Konversation

Service Broker koordiniert Prioritätsstufen in allen Übertragungswarteschlangen in einer Instanz des Datenbankmoduls. Zunächst überträgt Service Broker Nachrichten aus den Konversationen mit Priorität 10 in alle Übertragungswarteschlangen, gefolgt von Konversationen mit Priorität 9 usw.

Der relative Unterschied in der Nachrichtenleistung nimmt mit dem Unterschied der Prioritätsstufen zu. In einem System, das zwei benachbarte Prioritätsstufen verwendet, wie z. B. 9 und 10, haben die Nachrichten mit der höheren Prioritätsstufe einen geringfügigen Leistungsvorteil. In einem System, das zwei weit auseinander liegende Prioritätsstufen verwendet, wie z. B. 1 und 10, haben die Nachrichten mit der höheren Prioritätsstufe einen größeren Leistungsvorteil. In Systemen, die mehrere Prioritätsstufen verwenden, wird der Großteil der Verarbeitung den höchsten zwei oder drei Prioritätsstufen zugeordnet.

Prioritätsstufen, die in Konversationsprioritäten angegeben werden, gelten nur für Nachrichten in der Übertragungswarteschlange, wenn die HONOR_BROKER_PRIORITY-Datenbankoption auf ON festgelegt wird. Wenn HONOR_BROKER_PRIORITY auf OFF festgelegt wird, werden alle Nachrichten in der Übertragungswarteschlange für diese Datenbank mit der Standardprioritätsstufe 5 gesendet. Wenn die Nachricht mit sys.transmission_queue angezeigt wird, zeigt sie immer noch die vom Endpunkt empfangene Prioritätsstufe, jedoch wird zum Übertragen der Nachricht die Standardprioritätsstufe verwendet.

Da Prioritätsstufen für Nachrichten in der Übertragungswarteschlange gelten, wirken sie sich normalerweise nicht auf Nachrichten aus, die zwischen Diensten in derselben Instanz des Datenbankmoduls gesendet werden. Nachrichten, die an einen Dienst in derselben Instanz gesendet werden, werden direkt in der Warteschlange des Diensts abgelegt, ohne eine Übertragungswarteschlange zu durchlaufen. Einige Bedingungen können dazu führen, dass lokale Nachrichten in der Übertragungswarteschlange abgelegt werden, wie z. B. einige Fehlertypen oder die Inaktivität der Zielwarteschlange. Wenn die Nachricht in der Übertragungswarteschlange gespeichert wird, wird die relevante Prioritätsstufe übernommen.

Nachrichten und Nachrichtenfragmente werden in einer Reihenfolge gesendet, die nicht der Priorität entspricht:

  • Service Broker sendet Nachrichten zwischen Instanzen des Datenbankmoduls mit Blöcken von Nachrichtenfragmenten. Wenn mehrere Nachrichtenfragmente mit unterschiedlichen Prioritäten vorliegen und bereit für das Senden an eine Instanz sind, sendet Service Broker möglicherweise alle Fragmente in einem Block. Einige der Fragmente am Ende des Blocks haben unter Umständen eine niedrigere Prioritätsstufe als Nachrichtenfragmente, die auf die Übertragung an eine andere Instanz warten.

  • Service Broker enthält einen Ausschlussverhinderungsmechanismus, damit hohe Anzahlen von Nachrichten mit hoher Priorität keine Nachrichten mit niedriger Priorität blockieren. Eine Nachricht mit niedriger Priorität, die schon lange in der Warteschlange liegt, kann auch gesendet werden, wenn die Warteschlange Nachrichten mit höherer Priorität enthält.

Obwohl einzelne Nachrichten oder Nachrichtenfragmente in einer Reihenfolge gesendet werden können, die nicht der Priorität entspricht, sollten die Auswirkungen bei Betrachtung zahlreicher Sendevorgänge eher gering sein.