Share via


메시지 보존

큐에서 메시지 보존을 지정하면 Service Broker에서는 대화가 종료될 때까지 큐의 메시지를 삭제하지 않습니다. 또한 나가는 메시지도 큐에 복사합니다. 이렇게 하면 해당 서비스에서는 들어오는 메시지와 나가는 메시지의 정확한 레코드를 유지 관리할 수 있습니다.

메시지 보존을 사용하면 대화가 활성 상태인 동안 큐에 대한 정확한 대화 레코드를 유지 관리할 수 있습니다. 세부적인 감사가 필요한 응용 프로그램이나 대화가 실패할 경우 보정 트랜잭션을 수행해야 하는 응용 프로그램의 경우에는 대화가 진행 중일 때 각 메시지를 상태 테이블에 복사하는 것보다 메시지 보존을 사용하는 것이 더 편리할 수 있습니다.

메시지 보존을 사용하면 활성 대화에 대한 큐에 포함되는 메시지 수가 늘어나고 메시지를 보낼 때 SQL Server에서 수행하는 작업이 많아집니다. 따라서 메시지 보존을 사용하면 성능이 저하됩니다. 성능에 미치는 정확한 영향은 큐를 사용하는 서비스의 통신 패턴에 따라 다릅니다. 일반적으로 응용 프로그램이 올바르게 작동하기 위해 메시지 보존이 필요한 경우에는 항상 메시지 보존을 사용해야 합니다. 대화가 활성 상태인 동안 보내고 받은 모든 메시지의 정확한 레코드가 필요하지 않은 응용 프로그램의 경우에는 상태 테이블에서 상태를 관리하면 성능을 향상시킬 수 있습니다. 대화가 종료되면 보존된 메시지가 큐에서 제거되므로 감사용으로 보존을 사용하는 경우에는 대화를 종료하기 전에 해당 메시지를 영구 저장소에 복사해야 합니다.

[!참고]

메시지 보존을 사용하면 성능이 저하될 수 있습니다. 따라서 응용 프로그램의 서비스 수준 계약에 따라 응용 프로그램에서 보내고 받은 정확한 메시지를 보존해야 하는 경우에만 이 설정을 사용해야 합니다.

받을 준비가 된 큐의 메시지는 status가 1입니다. RECEIVE 문은 status가 1인 메시지를 반환합니다. RECEIVE 문이 메시지를 반환한 후 메시지 보존이 설정되어 있는 경우 status는 0으로 설정되고 메시지는 큐에 그대로 남습니다. 메시지 보존이 설정되어 있지 않으면 RECEIVE 문은 메시지를 큐에서 제거합니다. 큐를 사용하는 모든 서비스는 들어오는 메시지와 나가는 메시지를 모두 저장합니다. 이 경우 SEND 명령은 메시지의 status3으로 설정하여 메시지를 서비스의 큐에 복사할 뿐 아니라 해당 메시지를 전송 큐에 추가합니다. 대화가 종료되면 큐에서는 해당 대화의 모든 메시지를 삭제합니다.

응용 프로그램에서는 동일한 메시지를 두 번 받거나 큐에 나가는 메시지로 추가된 메시지를 받을 수 없습니다. 보존된 메시지에 대한 작업을 수행하려면 SELECT 문을 사용하여 큐를 쿼리합니다. 감사를 위해 응용 프로그램에서는 대화를 종료하기 전에 보존된 메시지를 감사 테이블에 삽입합니다. 또한 보정 트랜잭션을 위해서는 일반적으로 처리된 메시지를 역방향으로 검사하여 모든 메시지가 처리될 때까지 각 메시지의 작업을 차례로 취소합니다.

SELECT 문을 사용하여 큐에 액세스하는 방법은 큐 쿼리를 참조하십시오.