대화 그룹
대화 그룹이란 관련 대화의 그룹을 나타냅니다. 대화 그룹을 사용하면 응용 프로그램에서 특정 비즈니스 태스크에 관련된 대화를 쉽게 조정할 수 있습니다.
모든 대화는 하나의 대화 그룹에 속합니다. 모든 대화 그룹은 특정 서비스와 관련되어 있으며 그룹의 모든 대화는 해당 서비스 간의 대화입니다. 대화 그룹에 포함할 수 있는 대화 수에는 제한이 없습니다.
SQL Server에서는 대화 그룹을 사용하여 특정 비즈니스 태스크에 관련된 메시지에 대해 EOIO(Exactly-Once-In-Order) 방식으로 액세스를 제공합니다. 응용 프로그램이 메시지를 보내거나 받을 때 SQL Server에서 메시지가 속한 대화 그룹을 잠급니다. 그러면 한 번에 한 세션만 대화 그룹의 메시지를 받을 수 있습니다. 대화 그룹을 잠그면 응용 프로그램이 각 대화 그룹의 메시지가 EOIO 방식으로 처리됩니다. 대화 그룹에 둘 이상의 대화를 포함할 수 있으므로 응용 프로그램에서는 대화 그룹을 사용하여 같은 비즈니스 태스크에 관련된 메시지를 식별하고 해당 메시지를 함께 처리할 수 있습니다.
대화 참가자 간에 대화 그룹을 공유하지 않으므로 각 대화 참가자는 해당 대화를 알맞게 그룹화할 수 있습니다. 응용 프로그램은 서비스의 특별한 지원이 없어도 서비스 간의 복잡한 상호 작용을 관리할 수 있습니다.
대화 그룹 예
인사관리 응용 프로그램에는 급여 서비스의 정보와 복리후생 서비스의 정보를 조합하는 GetEmployeeInformation 서비스가 포함될 수 있습니다. GetEmployeeInformation 서비스는 각 서비스와 대화를 시작하고 특정 대화를 같은 대화 그룹의 다른 대화에 연결합니다. Service Broker는 메시지가 급여 서비스에서 오는지 복리후생 서비스에서 오는지에 관계없이 이러한 두 대화에서 들어오는 메시지마다 대화 그룹 식별자를 추가합니다. 대화가 같은 대화 그룹에 있으므로 Service Broker는 GetEmployeeInformation 서비스에서 진행 중인 요청 수에 관계없이 GetEmployeeInformation 서비스에서 복리후생 정보를 수당 정보와 일치시키는 데 필요한 모든 정보를 제공합니다.
급여 서비스로 보내는 메시지와 복리후생 서비스로 보내는 메시지에는 GetEmployeeInformation에서 만든 대화 그룹의 대화 그룹 정보가 포함되지 않습니다. 각 서비스는 독립적으로 작동하며 GetEmployeeInformation 서비스에서만 전체 비즈니스 태스크에 대한 정보를 유지 관리합니다. 서비스를 서로 독립적으로 유지하면 각 서비스에 대한 코딩이 간단해지고 유지 관리하기도 쉬울 뿐 아니라 서비스 중 하나를 사용할 수 없는 경우에도 다른 서비스는 계속 사용할 수 있다는 이점도 있습니다.
응용 프로그램 상태 구성
대화 그룹의 한 가지 이점은 대화 그룹 식별자가 응용 프로그램 상태를 식별하고 검색할 수 있는 편리한 키라는 사실입니다. 대화 그룹 식별자를 사용하면 데이터베이스에서 응용 프로그램 상태를 쉽게 유지 관리할 수 있습니다. 계속해서 메시지 교환과 관련된 태스크 수행이 증가할 경우 응용 프로그램 상태를 유지 관리하기 위해 응용 프로그램을 계속 실행하는 것은 비효율적입니다. 메시지 간에 작업 관련 데이터가 데이터베이스에 저장된 다음 같은 태스크에 관련된 다음 메시지가 수신될 때 검색되면 응용 프로그램이 원활하게 확장됩니다. 응용 프로그램 개발자가 제공하는 상태 테이블에서 대화 그룹 식별자를 기본 키로 사용하면 특정 태스크와 관련된 상태를 빠르게 검색할 수 있습니다. 대화 그룹 식별자를 사용하여 상태를 유지 관리하는 방법은 상태 관리를 참조하십시오.
SQL Server에서 응용 프로그램이 메시지를 보내거나 받을 때마다 대화 그룹을 잠그므로 응용 프로그램은 다른 프로그램이 동시에 같은 상태 데이터를 업데이트하지 않도록 명시적으로 방지할 필요가 없습니다. 응용 프로그램은 간단하게 대화 그룹을 잠그고 상태를 복원하고 메시지를 처리하며 상태를 업데이트한 다음 트랜잭션을 커밋합니다.
SQL Server에서는 편의를 위해 응용 프로그램이 메시지를 수신하지 않고도 다음에 사용할 수 있는 대화 그룹을 잠글 수 있습니다. GET CONVERSATION GROUP 문을 사용하면 응용 프로그램이 메시지를 처리하기 전에 대화 그룹을 잠그고 상태를 복원할 수 있습니다. 자세한 내용은 GET CONVERSATION GROUP(Transact-SQL) 문을 참조하십시오.
대화 그룹 수명
Service Broker가 대화 그룹 수명을 관리합니다. 대화 그룹을 명시적으로 만들거나 삭제할 필요가 없습니다. Service Broker는 다음 상황에서 새 대화 그룹을 만듭니다.
응용 프로그램이 기존 대화 그룹과 관련되지 않은 새 대화를 시작합니다. Service Broker는 새 대화 그룹을 만들어 대화 그룹에 새로운 식별자를 할당합니다.
응용 프로그램이 현재 존재하지 않는 대화 그룹 식별자와 관련된 대화를 시작합니다. 이 경우 Service Broker는 지정된 식별자를 가진 새 대화 그룹을 만듭니다. 그러면 대화 그룹 식별자에 원하는 값을 직접 할당할 수 있습니다.
Service Broker가 다른 서비스에서 시작한 새 대화의 첫 번째 메시지를 받습니다. 이 경우 Service Broker는 서비스 이름과 Broker 인스턴스 식별자(있을 경우)를 사용하여 다음을 수행합니다.
알맞은 큐를 찾습니다.
새 대화 그룹을 만들고 대화 그룹을 큐에 연결합니다.
새 대화 핸들을 만들어 새 대화 그룹에 추가합니다.
들어오는 메시지를 큐에 넣습니다.
Service Broker는 대화 그룹을 만든 대화의 메타데이터에 대화 그룹 식별자를 추가합니다. Service Broker가 대화 그룹과 관련된 대화에 대한 메시지를 받을 때마다 Service Broker는 해당 메시지에 대화 그룹 식별자를 추가한 후 메시지를 큐에 넣습니다.
대화 그룹 식별자는 Service Broker가 이 식별자를 만들 때부터 식별자와 관련된 모든 대화가 끝날 때까지 유효하므로 그룹의 대화가 활성화되어 있는 동안 대화 그룹 식별자가 유효합니다.
대화 그룹 식별자를 사용하여 응용 프로그램 상태를 관리하는 응용 프로그램은 개발자가 제공한 상태 테이블을 사용합니다. 상태가 더 이상 필요하지 않은 것으로 결정되면 응용 프로그램은 상태 테이블에서 해당 상태를 삭제해야 합니다. 대부분의 경우 응용 프로그램은 태스크아 완료된 후 또는 태스크를 완료할 수 없다는 내용의 오류가 발생한 후에 상태를 삭제합니다. 이러한 경우 응용 프로그램은 대개 마지막 응답 메시지를 보내고 대화를 끝내는 트랜잭션에 상태 삭제 명령을 포함합니다. 이 전략을 사용하면 응용 프로그램 상태와 대화 그룹 식별자의 수명이 같아집니다. 보내기 작업에 실패하면 삭제 작업이 롤백됩니다. 마찬가지로 삭제 작업이 실패하면 보내기 작업이 롤백되고 SQL Server에서 메시지를 보내지 않습니다. 두 경우 모두 응용 프로그램 상태와 대화 그룹 식별자는 계속 유효합니다. 두 작업 모두 성공하면 프로그램이 관련된 응용 프로그램 상태를 삭제하는 순간 대화 그룹 식별자 수명이 끝납니다.