아래는 'Microsoft Sync Framework에 대한 고찰'이라는 제목의 글입니다.

http://blog.powerumc.kr/214

 

여기서는 MSF의 동기화 알고리즘과 위의 글에서 '당신이 원하는 것은 뭐야?'에 대해서 살펴보도록 하겠습니다.

 


이해를 돕기 위해서 위의 그림을 실제 코드로 나타내면 아래와 같습니다.

SyncOperationStatistics stats;

SyncOrchestrator agent = new SyncOrchestrator();

agent.Direction = direction;

agent.LocalProvider = providerNameA;

agent.RemoteProvider = providerNameB;

stats = agent.Synchronize();

=> MSF에서 제공해주는 SyncOrchestrator클래스를 생성하고 Direction를 지정해주는데 Direction에서는 Upload, Download, UploadAndDownload, DownloadAndUpload가 있습니다. 그리고 로컬과 원격 Provider를 지정해주고 Synchronize 메소드를 호출해줌으로써 동기화를 수행합니다.

Source는 파일, DB 등이 될 수 있습니다. 대상 소스, 원본 소스라고도 표현을 하는데 이 표현이 헷갈려 좀 더 일반적인(?) Client Server라고 표현했습니다.

MSF에서 제공해주는 Provider를 상속받아서 Client Server Provider를 구현해주고 위의 코드와 같이 호출만 해주면 동기화를 수행하는 것입니다.

MSF에서 제공해주는 Provider의 중요 메소드들은 아래와 같습니다.

메소드명

역할

Source

BeginSession

항목과 항목에 대한 메타데이터를 가져옵니다.

Client(2),
Server(1)

GetChangeBatch

Sever측의 항목 변경에 대한 메타데이터를 Client Provider에게 제공합니다.

Server(3)

ProcessChangeBatch

각 항목 변경에 대해서 SaveItemChange()를 호출합니다.

Client(4)

SaveItemChange

변경된 항목에 대해서 자신의 메타데이터에 기록합니다.

Client(5)

EndSession

변경된 항목을 저장해주고 메타데이터를 닫아줍니다.

Client(6),
Server(7)

=> Direction Download로 주고 Synchronize()메소드를 실행하면 위의 표에서()안에 넣은 순서대로 Provider의 메소드가 실행이 됩니다. MSF에서는 위의 과정을 통해서 단방향 동기화됩니다. 설명의 편의상 Client Server로 표현했을 뿐 만약에 Direction의 방향이 Upload로 변경된다면 Client->Server가 되고 Server->Client가 되어 동기화 과정을 수행하게 됩니다. 마지막으로 Direction DownloadAndUpload UploadAndDownload로 처리하였을 경우에는 위의 과정이 두 번 실행되는 것을 의미합니다.

 

그럼 이제 '당신이 원하는 것이 뭐야?'에 대해서 알아보도록 하겠습니다. 

여기서 설명하는 모든 과정은 아래의 예제에 해당하는 것입니다.

Sync101 RCA with Metadata Store(WCF)

http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=sync&ReleaseId=1713

 

위의 예제의 아키텍처를 간단히 그려본 것입니다. 'Microsoft Sync Framework에 대한 고찰'이라는 글에서도 나오지만 파일로 동기화를 하려면 원격 서버의 폴더를 공유해야하고 노출된 폴더의 사용자 권한 문제 라던지 공유가 되더라도 파일이 10,000개 까지만 공유되는 문제도 있다고 합니다. 이러한 문제들이 WCF를 사용하여 해결할 수 있습니다.

 

먼저 Server측에서는 기존에 만들어 놓은 Provider를 멤버로 하여 메소드들을 WCF의 오퍼레이션(메소드)으로 노출시켜주는 것입니다. 그러면 동기화를 수행할 때마다 위의 표에서 나온 메소드들이 순차적으로 실행이 됩니다. Client측에서는 RemoteProviderProxy라는 프록시 클래스를 만들어서 WCF를 호출해줍니다. 이 과정을 조금 더 자세히 설명하면 WCF에 노출된 클래스의 Client 클래스가 만들어지는데 System.ServiceModel.ClientBase<T>를 상속받는 클래스입니다. 이 클래스를 MSF Provider에 넣을 수 없기 때문에 RemoteProviderProxy라는 클래스를 만들어 MSF에서 제공해주는 Provider를 상속받고 이 안에서 WCF Client클래스를 멤버로 하여 메소드들을 노출해주는 것입니다.

 

Posted by resisa
,