효율적인 리소스 동기화

이 가이드에서는 '증분 동기화'를 구현하고 캘린더 데이터입니다. 사용 사용하여 모든 캘린더 컬렉션의 데이터를 동기화 상태로 유지하는 동시에 할 수 있습니다.

목차

개요

증분 동기화는 다음 두 단계로 구성됩니다.

  1. 처음에 전체 동기화를 한 번만 실행하면 클라이언트 상태와 서버 상태를 동기화합니다. 고객은 유지되어야 하는 동기화 토큰

  2. 증분 동기화가 반복적으로 수행되며 모든 클라이언트 이전 동기화 이후 발생한 변경사항을 표시합니다. 매번 클라이언트가 서버에서 가져온 이전 동기화 토큰을 제공하고 응답에서 새 동기화 토큰을 저장합니다.

초기 전체 동기화

초기 전체 동기화는 선택합니다. 원하는 경우 목록을 제한할 수 있습니다. 한 개의 특정 쿼리만 동기화하려면 요청 매개변수를 사용하여 리소스 하위 집합입니다

list 작업에 대한 응답에서 nextSyncToken는 동기화 토큰을 나타냅니다. 이때 nextSyncToken 결과 세트가 너무 크고 페이지로 나누기 다음 nextSyncToken 필드가 맨 마지막 페이지에만 있습니다.

증분 동기화

증분 동기화를 사용하면 마지막 동기화 요청 이후 수정됨 이렇게 하려면 syncToken 필드에 지정된 최신 동기화 토큰으로 요청을 전송합니다. 결과에는 항상 삭제된 항목이 포함되므로 클라이언트는 스토리지에서 삭제할 수 있습니다.

첫 번째 배포 이후 많은 수의 리소스가 변경된 경우 증분 동기화 요청을 실행하면 목록 결과에 syncToken 대신 pageToken가 표시될 수 있습니다. 이 경우 증분 동기화의 첫 페이지를 가져오는 데 사용된 list 쿼리 (정확히 동일한 syncToken 포함) pageToken를 추가합니다. 마지막 페이지에서 다른 syncToken를 찾을 때까지 다음 요청을 모두 페이지로 나눕니다. 다음 동기화를 위해 이 syncToken을(를) 저장하세요. 요청할 수도 있습니다

다음은 페이지로 나눈 증분 동기화가 필요한 경우에 대한 쿼리의 예입니다.

원래 검색어

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

다음 페이지 검색

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageToken=CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA

서버에서 전체 동기화 필요

다양한 이유로 서버에서 동기화 토큰을 무효화할 수 있음 토큰 만료 또는 관련 ACL 변경 등의 문제를 해결할 수 있습니다 이러한 경우 서버는 증분 요청에 응답하며 응답 코드 410입니다. 이렇게 하면 클라이언트 스토어 전체 초기화가 트리거됩니다. 완전히 동기화할 수 있습니다.

샘플 코드

아래 샘플 코드 스니펫은 자바 클라이언트 라이브러리. 처음 run 메서드가 호출되면 전체 동기화를 수행하고 동기화 토큰을 저장합니다. 이후에 실행할 때마다 저장된 동기화 토큰을 로드하고 증분 동기화를 지원합니다.

  private static void run() throws IOException {
    // Construct the {@link Calendar.Events.List} request, but don't execute it yet.
    Calendar.Events.List request = client.events().list("primary");

    // Load the sync token stored from the last execution, if any.
    String syncToken = syncSettingsDataStore.get(SYNC_TOKEN_KEY);
    if (syncToken == null) {
      System.out.println("Performing full sync.");

      // Set the filters you want to use during the full sync. Sync tokens aren't compatible with
      // most filters, but you may want to limit your full sync to only a certain date range.
      // In this example we are only syncing events up to a year old.
      Date oneYearAgo = Utils.getRelativeDate(java.util.Calendar.YEAR, -1);
      request.setTimeMin(new DateTime(oneYearAgo, TimeZone.getTimeZone("UTC")));
    } else {
      System.out.println("Performing incremental sync.");
      request.setSyncToken(syncToken);
    }

    // Retrieve the events, one page at a time.
    String pageToken = null;
    Events events = null;
    do {
      request.setPageToken(pageToken);

      try {
        events = request.execute();
      } catch (GoogleJsonResponseException e) {
        if (e.getStatusCode() == 410) {
          // A 410 status code, "Gone", indicates that the sync token is invalid.
          System.out.println("Invalid sync token, clearing event store and re-syncing.");
          syncSettingsDataStore.delete(SYNC_TOKEN_KEY);
          eventDataStore.clear();
          run();
        } else {
          throw e;
        }
      }

      List<Event> items = events.getItems();
      if (items.size() == 0) {
        System.out.println("No new events to sync.");
      } else {
        for (Event event : items) {
          syncEvent(event);
        }
      }

      pageToken = events.getNextPageToken();
    } while (pageToken != null);

    // Store the sync token from the last request to be used during the next execution.
    syncSettingsDataStore.set(SYNC_TOKEN_KEY, events.getNextSyncToken());

    System.out.println("Sync complete.");
  }

레거시 동기화

이벤트 컬렉션의 경우 여전히 이벤트 목록에서 업데이트된 필드의 값을 보존하여 기존 방식 요청한 후 modifiedSince 필드를 사용하여 업데이트된 이벤트를 검색합니다. 이 방법은 오류가 발생하기 쉽기 때문에 더 이상 권장되지 않습니다. 누락 업데이트 (예: 쿼리 제한을 적용하지 않는 경우) 또한 이벤트에 대해서만 사용할 수 있습니다.