오프라인 데이터 동기화

오프라인 데이터 동기화는 Azure Mobile Apps의 SDK 기능입니다. 데이터는 로컬 저장소에 저장됩니다. 앱이 오프라인 상태인 경우에도 데이터를 만들고 수정하고 검색할 수 있습니다. 디바이스가 온라인 상태일 때 데이터는 Azure Mobile Apps 서비스와 동기화됩니다. SDK는 클라이언트와 서비스 모두에서 동일한 레코드가 변경될 때 충돌 해결을 지원합니다.

오프라인 동기화에는 다음과 같은 몇 가지 이점이 있습니다.

  • 앱 응답성 향상
  • 잘못된 네트워크 연결이 있을 때 앱 안정성 향상
  • 대기 시간이 긴 네트워크 또는 요금제 네트워크에서 네트워크 사용을 제한합니다.
  • 연결이 끊긴 사용을 지원합니다.

다음 자습서에서는 Azure Mobile Apps를 사용하여 모바일 클라이언트에 오프라인 동기화를 추가하는 방법을 보여 줍니다.

동기화 테이블이란?

Azure Mobile Apps SDK는 서비스에 직접 액세스하는 서비스를 제공합니다 IRemoteTable<T>. 디바이스에 네트워크 연결이 없으면 작업이 실패합니다. 동기화 테이블(제공)은 IOfflineTable<T>로컬 저장소에 대해 동일한 작업을 제공합니다. 그런 다음 로컬 저장소를 나중에 서비스와 동기화할 수 있습니다. 작업을 수행하기 전에 로컬 저장소를 초기화해야 합니다.

로컬 저장소란?

로컬 저장소는 클라이언트 디바이스의 데이터 지속성 계층입니다. 대부분의 플랫폼은 로컬 저장소에 SQLite를 사용하지만 iOS는 핵심 데이터를 사용합니다. 사용자 고유의 로컬 저장소를 구현할 수도 있습니다. 예를 들어 SQLCipher와 함께 SQLite 버전을 사용하여 암호화된 저장소를 생성합니다.

오프라인 동기화는 어떻게 작동하나요?

클라이언트 코드는 로컬 변경 내용이 데이터 동기화 서비스와 동기화되는 시기를 제어합니다. 로컬 변경 내용을 푸시할 때까지 서비스에 아무 것도 전송되지 않습니다. 마찬가지로 로컬 저장소는 데이터를 끌어올 때만 새 데이터 또는 업데이트된 데이터로 채워집니다.

모든 테이블, 테이블 목록 또는 하나의 테이블에 대해 보류 중인 작업을 푸시할 수 있습니다.

// All tables
await client.PushTablesAsync();

// A list of tables
var tablesToPush = new string[] { "table1", "table2" };
await client.PushTablesAsync(tablesToPush);

// A single table
await table.PushItemsAsync();

동기화

푸시 작업은 작업 큐의 보류 중인 모든 변경 내용을 서비스로 보냅니다. 보류 중인 변경 내용은 HTTP REST 호출을 통해 서비스로 전송되며, 이 호출은 데이터베이스를 수정합니다.

밀어넣기 작업은 끌어오기 작업 전에 수행됩니다. 끌어오기 작업은 서비스에서 변경된 데이터를 가져와서 로컬 저장소에 저장합니다.

암시적 푸시

보류 중인 로컬 업데이트가 있는 테이블에 대해 끌어오기를 실행하면 끌어오기에서 먼저 해당 테이블에 대한 푸시를 실행합니다. 이 푸시는 이미 큐에 대기 중인 변경 내용과 서버의 새 데이터 간의 충돌을 최소화하는 데 도움이 됩니다. 필요에 따라 다음에서 설정 PushOtherTables 하여 모든 테이블의 푸시를 구성할 수 있습니다.PullOptions

var pullOptions = new PullOptions { PushOtherTables = true };
await table.PullItemsAsync(pullOptions);

레코드 하위 집합 풀링

필요에 따라 오프라인 데이터베이스에 포함할 레코드를 결정하는 데 사용되는 쿼리를 지정할 수 있습니다. 예시:

var query = table.CreateQuery().Where(x => x.Color == "Blue");
await table.PullItemsAsync(query);

증분 동기화

Azure Mobile Apps는 증분 동기화를 구현합니다. 마지막 끌어오기 작업 이후 변경된 레코드만 끌어오기됩니다. 증분 동기화는 큰 테이블을 처리할 때 시간과 대역폭을 절약합니다.

각 고유 쿼리에 UpdatedAt 대해 마지막으로 성공적으로 전송된 레코드의 필드는 오프라인 저장소에 토큰으로 저장됩니다. 마지막 UpdatedAt 값은 델타 토큰 저장소에 저장됩니다. 델타 토큰 저장소는 오프라인 저장소에서 테이블로 구현됩니다.

성능 및 일관성

동기화가 조기에 중지되는 경우가 있습니다. 예시:

  • 동기화 프로세스 중에 동기화에 사용하는 네트워크를 사용할 수 없게 됩니다.
  • 동기화하는 동안 애플리케이션을 강제로 닫습니다.

오프라인 데이터베이스 내에서 일관성 문제의 위험을 최소화하기 위해 각 레코드는 수신되는 데이터베이스에 기록됩니다. 필요에 따라 일괄 처리로 데이터베이스에 레코드를 쓰도록 결정할 수 있습니다. 일괄 처리 작업은 끌어오기 작업 중에 오프라인 데이터베이스 쓰기의 성능을 향상합니다. 그러나 테이블 메타데이터와 테이블 내 데이터 간의 불일치 위험도 증가합니다.

다음과 같이 쓰기 사이의 간격을 조정할 수 있습니다.

var pullOptions = new PullOptions { WriteDeltaTokenInterval = 25 };
await table.PullItemsAsync(pullOptions);

이 코드는 25개의 레코드 일괄 처리로 쓰기를 수집합니다. 성능 테스트는 성능이 최대 25의 값으로 향상된다는 것을 시사합니다. WriteDeltaTokenInterval 25보다 큰 값은 성능을 크게 향상하지 않습니다.

제거

를 사용하여 IOfflineTable<T>.PurgeItemsAsync로컬 저장소의 내용을 지울 수 있습니다. 클라이언트 데이터베이스에 부실 데이터가 있거나 보류 중인 모든 변경 내용을 해제하려는 경우 제거가 필요할 수 카드. 제거는 로컬 저장소에서 테이블을 지웁니다. 테이블을 제거하려면 다음을 수행합니다.

await table.PurgeItemsAsync("", new PurgeOptions());

PurgeItemsAsync() 테이블에 보류 중인 변경 내용이 있으면 메서드에서 오류를 throw InvalidOperationException 합니다. 이 경우 제거를 강제로 수행할 수 있습니다.

await table.PurgeItemsAsync("", new PurgeOptions { DiscardPendingOperations = true });

제거는 캐시에서 모든 레코드를 초기화하고 다시 다운로드해야 하므로 오프라인 저장소에서 테이블을 클린 마지막 수단입니다.