다음을 통해 공유


COM+ CRM 운영 프로세스

정상적인 작업에서 서버 애플리케이션 프로세스에서 실행되는 애플리케이션 구성 요소는 CRM 작업자를 만들어 COM+ CRM을 사용합니다. CRM 작업자는 수행하도록 설계된 작업과 관련된 COM 인터페이스를 구현합니다. 애플리케이션 구성 요소가 트랜잭션 내에서 운영되어야 CRM 작업자가 애플리케이션 구성 요소의 트랜잭션을 상속받을 수 있습니다. CRM 작업자는 항상 트랜잭션이 필요합니다.

COM+ CRM에 액세스하기 위해 CRM 작업자는 먼저 ICrmLogControl 인터페이스를 가져오며, 이를 통해 CRM 작업자는 지속성 로그에 레코드를 쓸 수 있습니다. CRM 작업자는 CRM 사무원 구성 요소를 만들어 이 인터페이스를 가져옵니다.

다음으로 CRM 작업자는 CRM 서기에게 사용하려는 CRM Compensator의 이름을 알려야 합니다. 이 작업은 ICrmLogControl::RegisterCompensator 메서드를 호출하여 수행합니다. 이 메서드가 호출되면 트랜잭션이 완료되면 CRM 인프라에서 CRM Compensator를 만듭니다.

CRM 작업자가 CRM Compensator를 등록한 후에는 ICrmLogControl사용하여 CRM 로그에 레코드를 쓸 수 있습니다. CRM 작업자는 작성해야 합니다. 즉, 작업을 완료한 직후 크래시가 발생하는 경우 작업을 실제로 수행하기 전에 작업을 설명하는 레코드를 로그에 기록해야 합니다. 이러한 미리 쓰기 로그 레코드가 없으면 작업을 수정할 방법이 없습니다.

또한 미리 쓰기는 복구 시 로그 레코드를 수신하는 구성 요소인 CRM Compensator가 로그 레코드가 작성되었지만 실제로 동작이 발생하지 않은 경우를 처리해야 한다는 것을 의미합니다. CRM Compensator의 작업은 멱등이어야 합니다. 즉, 여러 번 수행하더라도 동일한 결과를 가져와야 합니다. 예를 들어 계정 잔액을 $100 값으로 설정하는 것은 멱등원 작업입니다. 계정 잔액에 $100를 추가하는 것은 아닙니다.

ICrmLogControl 인터페이스는 로그 레코드를 작성하기 위한 다음 두 가지 메서드를 제공합니다.

  • WriteLogRecordVariants는 Variants의 컬렉션으로 구성된 구조적 로그 레코드를 작성할 때 사용됩니다. 주로 Microsoft Visual Basic에서 CRM을 개발할 때 사용합니다.
  • WriteLogRecord 구조화되지 않은 로그 레코드를 바이트의 BLOB으로 작성하는 데 사용됩니다. 주로 Microsoft Visual C++에서 CRM을 개발할 때 사용합니다. C의 레코드 구조는 종종 메모리에 분산될 수 있는 헤더 및 필드 집합으로 구성되기 때문에 WriteLogRecord 메서드는 데이터 복사를 줄이는 수집 기능을 구현합니다.

메모

로그 레코드의 데이터 구조 내에서 사용자 포인터 형식을 사용하면 안 됩니다. CRM Compensator가 로그 레코드를 작성한 CRM 작업자의 프로세스와 다른 프로세스에서 실행되므로 복구 단계 중에 포인터가 더 이상 유효하지 않습니다. 로그 레코드에 포인터 형식을 포함하면 복구 중에 애플리케이션이 충돌하거나 손상될 수 있습니다.

 

이러한 두 쓰기 메서드는 모두 디스크에 로그 레코드를 작성하지만 레코드의 내구성을 보장하지는 않습니다. 성능을 향상시키기 위해 지연 쓰기가 디스크에 강제 적용되기 전에 누적되도록 허용할 수 있지만, 오류 복구에 중요하기 때문에 모든 CRM 쓰기가 디스크에서 지속되도록 보장하려면 ICrmLogControl::ForceLog 메서드를 대신 사용할 수 있습니다.

CRM 작업자가 작업을 완료하고 로그에 레코드 작성 및 강제 적용을 마친 후에는 ICrmLogControl를 해제해야 합니다. 트랜잭션이 완료되면(일반적으로 SetComplete 또는 SetAbort호출하는 애플리케이션 구성 요소로 인해) CRM 인프라는 ICrmCompensator 인터페이스 또는 ICrmCompensatorVariants 인터페이스를 구현하는 CRM Compensator 구성 요소를 만듭니다. 이러한 인터페이스는 트랜잭션 결과 알림과 함께 비정형(Visual C++) 또는 구조적(Visual Basic) 레코드를 CRM Compensator에 전달하는 데 사용됩니다.

CRM Compensator는 먼저 트랜잭션 완료 준비 단계에 대한 알림을 받고 준비 요청에 예 또는 아니요로 투표할 수 있습니다. CRM 보상자가 투표하지 않으면 더 이상 중단 알림을 받지 않습니다. 준비 요청에 '예'로 투표하면 커밋 또는 중단 알림이 수신됩니다. 클라이언트가 중단된 경우 준비 알림이 수신되지 않고 중단 알림만 수신됩니다. CRM Compensator는 이러한 모든 사례를 처리할 준비가 되어 있어야 하며 CRM 작업자가 로그 레코드를 성공적으로 기록하지 않은 경우에도 처리해야 합니다. CRM Compensator는 동일한 CRM Compensator 인스턴스가 복구에 의해 중단될 수 있으므로 1단계(준비) 및 2단계(커밋 또는 중단) 알림을 모두 수신한다고 가정해서는 안 됩니다.

일반적으로 CRM Compensator는 중단 알림을 사용하여 CRM 작업자가 수행한 작업을 역방향으로 처리합니다. CRM 작업자는 작업을 취소해야 하는 경우 일부 상태를 사용 가능한 상태로 둘 수 있습니다. 해당 상태는 로그 레코드에 완전히 포함될 수 있으며, 그렇지 않은 경우 트랜잭션이 커밋되는 경우 CRM Compensator가 해당 상태를 정리해야 합니다. 이것이 CRM Compensator가 커밋 알림을 받는 이유입니다. CRM Compensator는 DTC 트랜잭션에서 실행되지 않습니다.

CRM Compensator는 생성될 때 수신하는 ICrmLogControl를 사용하여, 필요할 경우 새 레코드를 기록할 수 있습니다. CRM 작업자와 CRM Compensator 모두 불필요한 복구를 방지하기 위해 필요할 수 있는 마지막 로그 레코드를 잊어버릴 수도 있습니다.

COM+ 보상 리소스 관리자 개념

COM+ CRM 시작 및 복구