COM+ CRM 운영 프로세스

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

COM+ CRM에 액세스하기 위해 CRM 작업자는 먼저 CRM 작업자가 지속성 로그에 레코드를 쓸 수 있도록 하는 ICrmLogControl 인터페이스를 가져옵니다. CRM 작업자는 CRM 클럭 구성 요소를 만들어 이 인터페이스를 가져옵니다.

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

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

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

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

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

참고

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

 

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

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+ 보상 Resource Manager 개념

COM+ CRM 시작 및 복구