다음을 통해 공유


오래된 복제본 복구

Microsoft Sync Framework에서는 변경 내용을 적용하기 전에 원본 복제본의 잊어버린 정보와 대상 복제본의 현재 정보를 비교합니다. 대상 정보에 잊어버린 정보가 포함되지 않은 경우 Sync Framework에서는 대상 복제본을 오래된 것으로 확인하고 복구 동기화를 시작합니다.

Sync Framework에서는 복구 동기화를 수행하기 위해 다음 단계를 수행합니다.

  • 응용 프로그램에서 알림을 받도록 등록한 경우 Sync Framework에서 복구 동기화가 필요함을 응용 프로그램에 알립니다. 응용 프로그램에서는 원본 복제본의 모든 항목을 전체적으로 열거하거나 부분 동기화를 수행하거나 동기화를 취소하도록 선택할 수 있습니다. 기본 작업은 전체 열거를 수행하는 것입니다.

  • 응용 프로그램에서 전체 열거를 지정하는 경우 Sync Framework에서는 현재 일괄 변경 내용을 삭제하고 원본 복제본의 모든 항목을 전체적으로 열거한 다음 대상 복제본에 적용합니다.

  • 응용 프로그램에서 부분 동기화를 지정하는 경우 Sync Framework에서는 원본 변경 내용을 계속 열거하며, 배운 정보에 대한 변경 내용이 단일 항목 예외로 적용되는 점을 제외하고 일반 동기화의 경우와 마찬가지로 대상 복제본에 원본 변경 내용을 적용합니다.

복구 동기화 이해

Sync Framework 동기화 커뮤니티에서 각 복제본에는 복제본의 항목에 대한 메타데이터가 들어 있습니다. 메타데이터는 복제본에 저장된 항목의 생성, 수정 및 삭제에 대한 정보를 추적합니다. 일반적으로 저장 공간이 부족해지지 않도록 복제본에서 삭제된 항목의 메타데이터를 주기적으로 정리해야 합니다. 복제본에서 삭제된 항목의 메타데이터를 제거한 경우 해당 삭제 내용을 더 이상 열거할 수 없으며 동기화 중에 변경 내용으로 보낼 수 없습니다. 메타데이터가 정리되기 전에 모든 동기화 커뮤니티의 모든 복제본에서 해당 삭제 내용을 동기화하면 모든 삭제 내용이 제대로 전파되고 문제가 발생하지 않습니다.

그러나 복제본이 다른 복제본의 메타데이터가 정리된 후까지 데이터를 동기화하지 않으면 오래된 복제본이 됩니다. 이 경우 정리를 수행한 복제본에서는 정리된 변경 내용을 더 이상 열거할 수 없으므로 오래된 복제본에 해당 변경 내용을 보낼 수 없습니다. 이러한 경우에 복구하기 위해 Sync Framework에서는 메타데이터 정리를 수행한 원본 복제본과 오래된 대상 복제본 간에 동기화가 시도될 때 복구 동기화를 사용하여 대상 복제본을 복원해야 합니다. 복구 동기화는 동기화 커뮤니티에서 삭제된 항목이 오래된 복제본에 다시 추가되지 않도록 하는 데 필요합니다.

Sync Framework에서는 원본 복제본의 잊어버린 정보를 사용하여 대상 복제본이 오래된 경우를 검색합니다. 복제본에서 삭제된 항목의 메타데이터를 제거하는 경우 복제본의 잊어버린 정보에 해당 삭제 버전을 기록합니다. 이러한 잊어버린 정보를 사용하여 복제본에 알려지고 삭제되었으며 메타데이터가 제거된 항목을 식별할 수 있습니다. 잊어버린 정보는 메타데이터가 제거된 항목을 여유 있게 예측한 것입니다. 따라서 잊어버린 정보에는 메타데이터에 정보가 들어 있는 항목도 포함될 수 있습니다.

복구 동기화 알림에 응답

응용 프로그램에서 복구 동기화가 필요하다는 알림을 받도록 등록할 수 있습니다. 응용 프로그램에서는 이 알림을 통해 전체 열거를 시작하거나 현재 세션을 계속 진행하거나 중지할 수 있습니다. 기본적으로 응용 프로그램에서 이 알림을 받도록 등록하지 않은 경우 Sync Framework에서 전체 열거를 시작합니다.

관리 코드를 사용하여 복구 동기화 알림에 응답

복구 동기화가 필요하다는 알림을 받기 위해 응용 프로그램에서는 이벤트 처리기를 구현하여 FullEnumerationNeeded 이벤트를 받도록 등록합니다. 이 이벤트가 발생하면 이벤트 처리기가 FullEnumerationNeededEventArgs 개체의 Action 속성을 다음 작업 중 하나로 설정하여 응답합니다.

  • Full로 설정하면 Sync Framework에서 현재 일괄 변경 내용을 삭제하고 다음과 같은 메서드를 호출하여 전체 열거를 시작합니다.

  • Partial로 설정하면 Sync Framework에서 현재 일괄 변경 내용을 적용하며, 배운 정보에 대한 모든 변경 내용이 단일 항목 예외로 적용되는 점을 제외하고 일반 동기화의 경우와 마찬가지로 세션을 계속 진행합니다.

  • Abort로 설정하면 Sync Framework에서 현재 세션을 중지합니다.

비관리 코드를 사용하여 복구 동기화 알림에 응답

복구 동기화가 필요하다는 알림을 받기 위해 응용 프로그램에서는 ISyncCallback 인터페이스를 구현하고 ISyncSession::RegisterCallback을 사용하여 등록합니다. 복구 동기화가 시작되기 전에 Sync Framework에서는 ISyncCallback::OnFullEnumerationNeeded를 호출합니다. 이 메서드는 다음 작업 중 하나를 반환합니다.

  • SFEA_FULL_ENUMERATION을 반환하면 Sync Framework에서 현재 일괄 변경 내용을 삭제하고 다음과 같은 메서드를 호출하여 전체 열거를 시작합니다.

  • SFEA_PARTIAL_SYNC를 반환하면 Sync Framework에서 현재 일괄 변경 내용을 적용하며, 배운 정보에 대한 모든 변경 내용이 단일 항목 예외로 적용되는 점을 제외하고 일반 동기화의 경우와 마찬가지로 세션을 계속 진행합니다.

  • SFEA_ABORT를 반환하면 Sync Framework에서 현재 세션을 중지합니다.

원본 복제본에서 모든 변경 내용 전체 열거

Sync Framework에서는 전체 열거 중에 원본 공급자가 모든 변경 내용을 열거하게 하며 또한 Sync Framework에서는 공급자의 변경 내용을 대상 복제본의 항목과 비교합니다. 원본 공급자의 변경 내용에 해당하지 않는 대상 복제본의 모든 항목은 원본 복제본에서 삭제된 것으로 간주되고 대상 복제본에서 삭제됩니다. 이 때문에 원본 공급자가 원본 복제본의 모든 항목을 제대로 열거하게 해야 합니다. 이렇게 하지 않으면 대상 복제본에서 항목이 잘못 삭제됩니다.

관리 코드를 사용하여 변경 내용 전체 열거

원본 공급자의 변경 내용을 전체적으로 열거하기 위해 Sync Framework에서는 GetChangeBatch 대신 GetFullEnumerationChangeBatch를 호출합니다. 이 메서드가 호출되면 원본 공급자가 FullEnumerationChangeBatch 개체를 반환합니다. 이 일괄 변경 내용을 작성하려면 다음 단계를 수행하십시오.

  1. BeginOrderedGroup을 사용하여 정렬된 그룹을 엽니다. 그룹을 시작하는 데 사용된 항목 ID가 열거되는 첫 번째 ID여야 하고 GetFullEnumerationChangeBatch에 지정된 열거 하한보다 작거나 같아야 합니다.

  2. 항목 ID가 열거 하한보다 작고 대상 정보에 포함되지 않은 변경 내용을 항목 ID순으로 일괄 변경 내용에 선택적으로 추가합니다.

  3. 항목 ID가 열거 하한보다 크거나 같은 변경 내용을 항목 ID순으로 일괄 변경 내용에 추가합니다.

  4. EndOrderedGroup을 사용하여 정렬된 그룹을 닫습니다. 열거 상한을 그룹에 추가된 마지막 변경 내용의 ID로 지정합니다. 마지막 일괄 변경 내용인 경우 열거 상한을 Infinity로 지정합니다.

  5. 마지막 일괄 변경 내용인 경우 SetLastBatch;를 호출합니다. 이렇게 하지 않으면 Sync Framework에서 GetFullEnumerationChangeBatch를 다시 호출합니다.

비관리 코드를 사용하여 변경 내용 전체 열거

원본 공급자의 변경 내용을 전체적으로 열거하기 위해 Sync Framework에서는 IKnowledgeSyncProvider::GetChangeBatch 대신 IKnowledgeSyncProvider::GetFullEnumerationChangeBatch를 호출합니다. 이 메서드가 호출되면 원본 공급자가 ISyncFullEnumerationChangeBatch 개체를 반환합니다. 이 일괄 변경 내용을 작성하려면 다음 단계를 수행하십시오.

  1. IProviderSyncServices::CreateFullEnumerationChangeBatch를 사용하여 일괄 변경 내용 개체를 만듭니다.

  2. ISyncChangeBatchBase::BeginOrderedGroup을 사용하여 정렬된 그룹을 엽니다. 그룹을 시작하는 데 사용된 항목 ID가 열거되는 첫 번째 ID여야 하고 GetFullEnumerationChangeBatch에 지정된 열거 하한보다 작거나 같아야 합니다.

  3. 항목 ID가 열거 하한보다 작고 대상 정보에 포함되지 않은 변경 내용을 항목 ID순으로 일괄 변경 내용에 선택적으로 추가합니다.

  4. 항목 ID가 열거 하한보다 크거나 같은 변경 내용을 항목 ID순으로 일괄 변경 내용에 추가합니다.

  5. ISyncChangeBatchBase::EndOrderedGroup을 사용하여 정렬된 그룹을 닫습니다. 열거 상한을 그룹에 추가된 마지막 변경 내용의 ID로 지정합니다. 마지막 일괄 변경 내용인 경우 열거 상한을 NULL로 지정합니다.

  6. 마지막 일괄 변경 내용인 경우 ISyncChangeBatchBase::SetLastBatch를 호출합니다. 이렇게 하지 않으면 Sync Framework에서 GetFullEnumerationChangeBatch를 다시 호출합니다.

복구 동기화 중 변경 내용 처리

대상 복제본에서 삭제할 항목을 결정하기 위해 Sync Framework에서 대상 공급자는 항목 ID가 각 일괄 변경 내용의 열거 하한과 상한 사이에 있는 대상 복제본의 모든 항목을 항목 ID순으로 열거해야 합니다. 원본 공급자에서 열거된 변경 내용에 해당하지 않는 대상 복제본의 항목은 삭제됩니다.

대상 공급자는 이 대상 항목 목록을 변경 내용 적용자에 전달합니다. 변경 내용 적용자는 각 변경 내용을 처리하는 방법을 결정하고 적절한 대상 공급자 메서드를 호출하여 변경 내용을 대상 복제본에 적용합니다.

관리 코드를 사용하여 변경 내용 처리

복구 동기화 중에 변경 내용을 처리하기 위해 Sync Framework에서는 대상 공급자의 ProcessFullEnumerationChangeBatch 메서드를 호출합니다. 이 메서드는 원본 공급자의 변경 내용이 포함된 FullEnumerationChangeBatch 개체를 제공합니다.

대상 공급자는 Sync Framework에서 제공한 NotifyingChangeApplier 개체를 사용하는 경우 ApplyFullEnumerationChanges 메서드를 호출하여 변경 내용을 적용해야 합니다. 이 메서드에는 항목 ID가 원본 일괄 변경 내용의 DestinationVersionEnumerationRangeLowerBoundDestinationVersionEnumerationRangeUpperBound 속성 사이에 있는 모든 대상 변경 내용의 컬렉션이 필요합니다. 이 컬렉션은 항목 ID를 기준으로 정렬되어야 합니다. 변경 내용을 적용하기 위해 NotifyingChangeApplier 개체는 일반적인 동기화를 수행하는 경우와 동일하게 INotifyingChangeApplierTarget 메서드를 호출합니다.

비관리 코드를 사용하여 변경 내용 처리

복구 동기화 중에 변경 내용을 처리하기 위해 Sync Framework에서는 대상 공급자의 IKnowledgeSyncProvider::ProcessFullEnumerationChangeBatch 메서드를 호출합니다. 이 메서드는 원본 공급자의 변경 내용이 포함된 ISyncFullEnumerationChangeBatch 개체를 제공합니다.

대상 공급자는 Sync Framework에서 제공한 ISynchronousNotifyingChangeApplier 개체를 사용하는 경우 ISynchronousNotifyingChangeApplier::ApplyFullEnumerationChanges 메서드를 호출하여 변경 내용을 적용해야 합니다. 이 메서드에는 항목 ID가 원본 일괄 변경 내용의 ISyncFullEnumerationChangeBatch::GetClosedLowerBoundItemIdISyncFullEnumerationChangeBatch::GetClosedUpperBoundItemId 속성 사이에 있는 모든 대상 변경 내용의 컬렉션이 필요합니다. 이 컬렉션은 항목 ID를 기준으로 정렬되어야 합니다. 변경 내용을 적용하기 위해 ISynchronousNotifyingChangeApplier 개체는 일반적인 동기화를 수행하는 경우와 동일하게 ISynchronousNotifyingChangeApplierTarget 인터페이스 메서드를 호출합니다.

참고 항목

개념

동기화 공급자
변경 내용 열거
변경 내용 적용