Поделиться через


Устранение неполадок маршрутизации и доставки сообщений

В этом разделе содержатся предложения по устранению распространенных неполадок, связанных с маршрутизацией и доставкой сообщений.

Метод: диагностика доставки сообщений

Если доставка сообщений между двумя службами выполняется неуспешно, используйте программу ssbdiagnose для формирования отчета о диалоге во время выполнения. Отчет времени выполнения отобразит любые ошибки, возникшие при выполнении операций диалога. В случае возникновения ошибок программа ssbdiagnose также проанализирует конфигурацию взаимодействия служб и сообщит о выявленных проблемах конфигурации. Дополнительные сведения см. в разделе Программа ssbdiagnose.

Причина: сообщения остаются в очереди передачи

Убедитесь, что в базе данных активирована доставка сообщений с помощью компонента Service Broker. Столбец is_broker_enabled таблицы sys.databases показывает, активирована ли доставка сообщений с помощью компонента Service Broker, как демонстрируется в следующем образце.

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

Доставка сообщений с помощью компонента Service Broker может быть отключена, чтобы предотвратить доставку их в неверную базу данных. Дополнительные сведения о доставке сообщений компонентом Service Broker см. в разделе Управление идентификационными данными компонента Service Broker. Дополнительные сведения об активации доставки сообщений компонентом Service Broker см. в разделе Как активировать доставку сообщений компонента Service Broker в базах данных (Transact-SQL).

Если доставка сообщений компонентом Service Broker активна, проверьте столбец transmission_status в представлении каталога sys.transmission_queue для сообщений. В число самых распространенных сообщений об ошибках входят следующие.

Сообщение

Описание

Отсутствует маршрут для службы.

Компоненту Service Broker не удается найти маршрут к заданной службе.

Целевой компонент Service Broker недоступен.

Компоненту Service Broker не удалось доставить сообщение целевому экземпляру компонента Service Broker.

Транспортный уровень недоступен.

В экземпляре отсутствует конечная точка компонента Service Broker, или не удалось запустить конечную точку компонента Service Broker.

Целевая очередь отключена.

Для очереди, которая использует целевую службу, параметр STATUS установлен в OFF. Компонент Service Broker не добавляет новых событий в очередь со значением STATUS, равным OFF.

Ошибка при получении данных: «10054 (Существующее соединение было принудительно закрыто удаленным узлом.)».

Удаленная сторона диалога приняла соединение TCP/IP, но закрыла его, прежде чем удалось отправить сообщение.

(Нет)

Компонент Service Broker еще не пытался отправить сообщение. Если в столбце enqueue_time содержится сообщение, находившееся в очереди длительное время, вероятно, доставка сообщений компонента Service Broker не активирована в базе данных.

Причина: маршрут существует, состояние передачи показывает отсутствие маршрута для службы

В число наиболее часто встречающихся причин этой проблемы входят следующие.

  • Инструкцией SEND создано сообщение, однако доставить его не удалось, так как маршрут не существует.

  • Маршрут был создан, однако компонент Service Broker еще не пытался повторить отправку сообщения.

Дополнительные сведения о повторных отправках см. в разделе Маршрутизация и работа в сети компонента Service Broker.

Убедитесь, что имя службы, заданное в сообщении, точно соответствует имени службы, заданному в маршруте. Компонент Service Broker использует побайтное бинарное сравнение имен служб. Если маршрут, указывающий имя службы, существует, можно сравнить имена, выполнив следующий запрос.

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) ;
ПримечаниеПримечание

Некоторые имена служб могут отобразиться в результирующем наборе даже при совпадении с именем, указанным в маршруте. Маршрут, в котором не указано имя службы (remote_service_name = NULL), рассматривается как совпадающий с именем службы, использованным в любом сообщении.

Дополнительные сведения о маршрутах компонента Service Broker см. в разделе Маршрутизация компонента Service Broker.

Если в сообщении указывается идентификатор экземпляра компонента Service Broker, проверьте, чтобы маршрут указывал тот же идентификатор экземпляра компонента Service Broker или не указывал его вообще.

Убедитесь, что не истек срок действия маршрута. Столбец времени действия представления каталога sys.routes содержит дату и время истечения срока действия маршрута.

Причина: состояние передачи показывает недоступность целевого экземпляра компонента Service Broker

Целевая служба не приняла сообщение. Это может означать, что указанное имя службы не соответствует имени службы, выполняющейся на целевом экземпляре SQL Server. Это может также означать, что целевой экземпляр не содержит маршрут для службы. Чтобы устранить эту неполадку, проверьте конфигурацию маршрутизации и служб для назначения.

Причина: состояние передачи показывает недоступность транспортного уровня

Убедитесь в том, что конечная точка компонента Service Broker существует. Если конечная точка не существует, ее необходимо создать. Если конечная точка существует, убедитесь в том, что она находится в состоянии STARTED. Дополнительные сведения см. в разделе Конечные точки компонента Service Broker. Дополнительные сведения о создании конечной точки см. в разделе Как активировать поддержку сети компонента Service Broker (Transact-SQL).

Причина: состояние передачи показывает: «Существующее соединение было принудительно закрыто удаленным узлом»

Возможно, неправильно настроена безопасность транспорта, или TCP/IP-адрес маршрута указывает порт, который используется любой другой службой, кроме компонента Service Broker.

ПримечаниеПримечание

Порт, указанный в маршруте, должен соответствовать порту, используемому конечной точкой компонента Service Broker на удаленном экземпляре компонента Database Engine. Компонент Service Broker использует протоколы обмена данными Service Broker для передачи сообщений, а не протокол Tabular Data Stream, используемый для передачи пакетов и результатов Transact-SQL. Таким образом, порт, используемый конечной точкой компонента Service Broker, отличен от порта, используемого для передачи Transact-SQL.

Проверьте конфигурацию конечной точки компонента Service Broker, чтобы убедиться, что оба экземпляра имеют совместимые сетевые настройки безопасности. Если в конечной точке компонента Service Broker для одного экземпляра указан параметр REQUIRED или ENABLED, конечная точка компонента Service Broker другого экземпляра не может указывать значение NONE.

Проверьте сертификаты, пользователей и разрешения для безопасности транспорта компонента Service Broker. Дополнительные сведения см. в разделе Безопасность транспорта компонента Service Broker.