라우팅 및 메시지 배달 문제 해결

이 섹션에서는 라우팅과 메시지 배달에 관련된 일반적인 문제를 해결하기 위한 제안 사항을 설명합니다.

방법: 메시지 배달 진단

두 서비스 간에 메시지가 성공적으로 배달되지 않는 경우 ssbdiagnose 유틸리티를 사용하여 대화의 런타임 보고서를 생성하십시오. 런타임 보고서에서 대화 작업에서 발생한 오류를 볼 수 있습니다. 오류가 발생하면 ssbdiagnose는 서비스 간의 구성도 분석하여 발견한 모든 구성 문제를 보고합니다. 자세한 내용은 ssbdiagnose 유틸리티를 참조하십시오.

문제: 전송 큐에 메시지가 남아 있음

Service Broker 메시지 배달이 데이터베이스에서 활성화되었는지 확인합니다. sys.databasesis_broker_enabled 열은 다음 예제에서 볼 수 있듯이 Broker 메시지 배달이 활성화되었는지 여부를 보여 줍니다.

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

메시지가 잘못된 데이터베이스로 배달되는 것을 방지하기 위해 Broker 메시지 배달을 비활성화할 수 있습니다. Service Broker 메시지 배달에 대한 자세한 내용은 Service Broker ID 관리를 참조하십시오. Service Broker 메시지 배달을 활성화하는 방법은 방법: 데이터베이스에서 Service Broker 메시지 배달 활성화(Transact-SQL)를 참조하십시오.

Service Broker 메시지 배달이 활성화되어 있으면 메시지의 sys.transmission_queue 카탈로그 뷰에 있는 transmission_status 열을 확인합니다. 일반 오류 메시지는 다음과 같습니다.

메시지

설명

서비스에 대한 경로가 없습니다.

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 라우팅을 참조하십시오.

메시지가 Broker 인스턴스 식별자를 지정하는 경우 경로가 동일한 Broker 인스턴스 식별자를 지정하는지 아니면 경로가 Broker 인스턴스 식별자를 아예 지정하지 않는지 확인합니다.

경로가 만료되지 않았는지 확인합니다. sys.routes 카탈로그 뷰의 수명 열에는 경로에 대한 만료 날짜와 시간이 포함됩니다.

문제: 전송 상태에 대상 Service Broker에 연결할 수 없음이 표시됨

대상이 메시지를 수락하지 않았습니다. 이는 지정된 서비스 이름이 대상 SQL Server 인스턴스가 호스팅하는 서비스의 이름과 일치하지 않거나 대상에 서비스에 대한 경로가 없음을 의미할 수 있습니다. 이 문제를 해결하려면 대상에 대한 라우팅 및 서비스 구성을 확인합니다.

문제: 전송 상태에 전송 계층을 사용할 수 없음이 표시됨

Service Broker 끝점이 있는지 확인합니다. 끝점이 없으면 새로 만듭니다. 끝점이 있으면 끝점의 상태가 STARTED인지 확인합니다. 자세한 내용은 Service Broker 끝점을 참조하십시오. 끝점을 만드는 방법은 방법: Service Broker 네트워킹 활성화(Transact-SQL)를 참조하십시오.

문제: 전송 상태에 “현재 연결은 원격 호스트에 의해 강제로 끊겼습니다”가 표시됨

전송 보안이 잘못 구성되었거나 경로에 대한 TCP/IP 주소가 Service Broker가 아닌 다른 서비스에서 사용 중인 포트를 지정합니다.

[!참고]

경로에 지정된 포트는 원격 데이터베이스 엔진 인스턴스의 Service Broker 끝점에 사용되는 포트에 해당해야 합니다. Service Broker는 Transact-SQL 일괄 처리 및 결과를 전송하는 데 사용되는 Tabular Data Stream 프로토콜이 아닌 Service Broker 통신 프로토콜을 사용하여 메시지를 전송합니다. 따라서 Service Broker 끝점에 사용되는 포트는 Transact-SQL을 전송하는 데 사용되는 포트와 다릅니다.

Service Broker 끝점 구성을 검사하여 두 인스턴스의 네트워크 보안 설정이 호환되는지 확인합니다. 한 인스턴스에 대한 Service Broker 끝점이 REQUIRED 또는 ENABLED를 지정하는 경우 다른 인스턴스에 대한 Service Broker 끝점은 NONE을 지정할 수 없습니다.

Service Broker 전송 보안에 대한 인증서, 사용자 및 사용 권한을 확인합니다. 자세한 내용은 Service Broker 전송 보안을 참조하십시오.