Problembehandlung bei Routing und Nachrichtenübermittlung

In diesem Abschnitt werden Vorschläge zum Beheben häufiger Probleme im Zusammenhang mit Routing und Nachrichtenübermittlung bereitgestellt.

Technik: Diagnostizieren der Nachrichtenübermittlung

Generieren Sie mithilfe des Dienstprogramms ssbdiagnose einen Laufzeitbericht für eine Konversation, wenn Nachrichten zwischen zwei Diensten nicht erfolgreich zugestellt werden. In diesem Bericht werden alle Fehler angezeigt, die von den Konversationsvorgängen festgestellt werden. Wenn Fehler festgestellt werden, analysiert ssbdiagnose auch die Konfiguration zwischen den Diensten und meldet alle gefundenen Konfigurationsprobleme. Weitere Informationen finden Sie unter Hilfsprogramm 'ssbdiagnose'.

Problem: Nachrichten bleiben in der Übermittlungswarteschlange

Stellen Sie sicher, dass die Service Broker-Nachrichtenübermittlung in der Datenbank aktiviert ist. Die is_broker_enabled-Spalte von sys.databases zeigt, ob die Brokernachrichtenübermittlung aktiviert ist, wie im folgenden Beispiel dargestellt:

SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;

Die Brokernachrichtenübermittlung kann deaktiviert werden, um zu verhindern, dass Nachrichten der falschen Datenbank übermittelt werden. Weitere Informationen zur Service Broker-Nachrichtenübermittlung finden Sie unter Verwalten von Service Broker-Identitäten. Weitere Informationen zum Aktivieren der Service Broker-Nachrichtenübermittlung finden Sie unter Vorgehensweise: Aktivieren von Service Broker-Nachrichtenübermittlung in Datenbanken (Transact-SQL).

Wenn die Service Broker-Nachrichtenübermittlung aktiviert ist, überprüfen Sie die transmission_status-Spalte in der sys.transmission_queue-Katalogsicht auf die Nachrichten. Zu den allgemeinen Fehlernachrichten zählen die folgenden:

Meldung

Beschreibung

Dem Zieldienstnamen für diese Konversation entspricht keine Route.

Von Service Broker wurde keine Route zum angegebenen Dienst gefunden.

Die Service Broker-Instanz des Ziels ist nicht erreichbar.

Service Broker konnte die Nachricht nicht an die Service Broker-Instanz des Ziels übermitteln.

Transportebene ist nicht verfügbar.

Es ist kein Service Broker-Endpunkt in der Instanz vorhanden, oder der Service Broker-Endpunkt wurde nicht erfolgreich gestartet.

Zielwarteschlange ist deaktiviert.

Die Warteschlange, die vom Zieldienst verwendet wird, weist den Status OFF auf. Einer Warteschlange mit dem Status OFF werden von Service Broker keine neuen Nachrichten hinzugefügt.

Fehler beim Empfangen von Daten: '10054(Eine vorhandene Verbindung wurde vom Remotehost geschlossen.)'.

Die Remoteseite der Konversation hat die TCP/IP-Verbindung angenommen, aber die Verbindung geschlossen, bevor eine Nachricht gesendet werden konnte.

(Keine)

Service Broker hat noch nicht versucht, die Nachricht zu senden. Wenn die enqueue_time-Spalte zeigt, dass die Nachricht schon lange in der Warteschlange liegt, ist die Service Broker-Nachrichtenübermittlung möglicherweise in der Datenbank nicht aktiviert.

Problem: Route ist vorhanden, Übertragungsfehler besagt: Dem Zieldienstnamen für diese Konversation entspricht keine Route

Dieses Problem hat häufig folgende Ursachen:

  • Die SEND-Anweisung hat die Nachricht erstellt, als keine Route vorhanden war, um die Nachricht erfolgreich zu übermitteln.

  • Die Route wurde dann erstellt, aber Service Broker hat noch nicht versucht, die Nachricht erneut zu übermitteln.

Weitere Informationen zu erneuten Versuchen finden Sie unter Service Broker-Routing und -Netzwerk.

Stellen Sie sicher, dass der in der Nachricht angegebene Dienstname genau mit dem in der Route angegebenen Dienstnamen übereinstimmt. Von Service Broker wird ein byteweiser binärer Vergleich für den Abgleich von Dienstnamen verwendet. Wenn eine Route vorhanden ist, in der der Dienstname angegeben ist, können Sie die Namen durch Ausführen der folgenden Abfrage vergleichen:

SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
    (SELECT remote_service_name
     FROM sys.routes AS routes
     WHERE tq.to_service_name = routes.remote_service_name) ;
HinweisHinweis

Einige Dienstnamen werden möglicherweise im Resultset angezeigt, obwohl mit einer Route übereinstimmen. Eine Route, in der kein Dienstname angegeben ist (remote_service_name = NULL), entspricht dem mit einer beliebigen Nachricht verwendeten Dienstnamen.

Weitere Informationen zu Service Broker-Routen finden Sie unter Service Broker-Routing.

Wenn in der Nachricht ein Brokerinstanzbezeichner angegeben ist, überprüfen Sie, ob durch die Route derselbe Brokerinstanzbezeichner oder gar kein Brokerinstanzbezeichner angegeben wird.

Überprüfen Sie, ob die Route abgelaufen ist. Die Lebensdauerspalte der sys.routes-Katalogsicht enthält Ablaufdatum und -zeit für die Route.

Problem: Übertragungsfehler besagt, dass die Service Broker-Instanz des Ziels nicht erreichbar ist

Das Ziel hat die Nachricht nicht angenommen. Dies kann darauf hinweisen, dass der angegebene Dienstname nicht mit dem Namen eines Diensts übereinstimmt, den die SQL Server-Instanz des Ziels hostet. Zudem kann dies darauf hinweisen, dass das Ziel keine Route für den Dienst enthält. Überprüfen Sie zur Problembehandlung die Routing- und Dienstkonfiguration für das Ziel.

Problem: Übertragungsfehler besagt, dass die Transportebene nicht verfügbar ist

Überprüfen Sie, ob ein Service Broker-Endpunkt vorhanden ist. Erstellen Sie einen Endpunkt, wenn keiner vorhanden ist. Wenn ein Endpunkt vorhanden ist, stellen Sie sicher, dass der Status des Endpunkts STARTED ist. Weitere Informationen finden Sie unter Service Broker-Endpunkte. Weitere Informationen zum Erstellen eines Endpunkts finden Sie unter Vorgehensweise: Aktivieren des Service Broker-Netzwerks (Transact-SQL).

Problem: Übertragungsfehler besagt: Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Die Transportsicherheit kann falsch konfiguriert sein, oder in der TCP/IP-Adresse für die Route ist ein Port angegeben, der von einem anderen Dienst als Service Broker verwendet wird.

HinweisHinweis

Der für die Route angegebene Port muss mit dem Port übereinstimmen, der von dem Service Broker-Endpunkt auf der Remoteinstanz von Database Engine (Datenbankmodul) verwendet wird. Service Broker verwendet die Service Broker-Kommunikationsprotokolle zum Übertragen von Nachrichten, nicht das Tabular Data Stream-Protokoll, mit dem Transact-SQL-Batches und -Ergebnisse übertragen werden. Daher unterscheidet sich der Port, der von einem Service Broker-Endpunkt verwendet wird, von dem Port, der zum Übertragen von Transact-SQL verwendet wird.

Überprüfen Sie die Service Broker-Endpunktkonfiguration, um sicherzustellen, dass die beiden Instanzen kompatible Netzwerksicherheitseinstellungen aufweisen. Wenn vom Service Broker-Endpunkt für eine Instanz REQUIRED oder ENABLED angegeben wird, darf beim Service Broker-Endpunkt für die andere Instanz nicht NONE angegeben sein.

Überprüfen Sie Zertifikate, Benutzer und Berechtigungen auf die Service Broker-Transportsicherheit. Weitere Informationen finden Sie unter Service Broker-Transportsicherheit.