ซิงค์ทรัพยากรอย่างมีประสิทธิภาพ

คู่มือนี้จะอธิบายวิธีใช้ "การซิงค์แบบเพิ่ม" ข้อมูลปฏิทิน เมื่อใช้วิธีนี้ คุณจะซิงค์ข้อมูลของคอลเล็กชันปฏิทินทั้งหมดได้ในขณะที่ประหยัดแบนด์วิดท์

เนื้อหา

ภาพรวม

การซิงค์แบบเพิ่มทีละน้อยประกอบด้วย 2 ระยะ ดังนี้

  1. ระบบจะทำการซิงค์เต็มรูปแบบครั้งแรกเพียงครั้งเดียวในตอนต้นเพื่อซิงค์สถานะของไคลเอ็นต์กับสถานะของเซิร์ฟเวอร์อย่างสมบูรณ์ ไคลเอ็นต์จะได้รับโทเค็นการซิงค์ที่ต้องเก็บไว้

  2. ระบบจะทำการซิงค์แบบเพิ่มทีละรายการซ้ำๆ และอัปเดตไคลเอ็นต์ด้วยการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นนับตั้งแต่การซิงค์ครั้งก่อน ทุกครั้งที่ดำเนินการ ไคลเอ็นต์จะระบุโทเค็นการซิงค์ก่อนหน้าที่ได้รับจากเซิร์ฟเวอร์และจัดเก็บโทเค็นการซิงค์ใหม่จากการตอบกลับ

การซิงค์ทั้งหมดครั้งแรก

การซิงค์ทั้งหมดครั้งแรกคือคําขอเริ่มต้นสําหรับทรัพยากรทั้งหมดของคอลเล็กชันที่คุณต้องการซิงค์ คุณเลือกจำกัดคำขอรายการได้โดยใช้พารามิเตอร์คำขอ หากต้องการซิงค์เฉพาะชุดย่อยของทรัพยากร

ในการตอบกลับการดำเนินการแสดงรายการ คุณจะเห็นช่องชื่อ nextSyncToken ซึ่งแสดงโทเค็นการซิงค์ คุณจะต้องจัดเก็บค่าของ nextSyncToken หากชุดผลลัพธ์มีขนาดใหญ่เกินไปและการตอบกลับแบ่งหน้า ช่อง nextSyncToken จะปรากฏเฉพาะในหน้าสุดท้ายเท่านั้น

การซิงค์แบบเพิ่ม

การซิงค์แบบเพิ่มข้อมูลช่วยให้คุณเรียกข้อมูลทรัพยากรทั้งหมดที่มีการแก้ไขนับตั้งแต่คําขอซิงค์ครั้งล่าสุดได้ โดยคุณต้องดำเนินการตามคำขอรายการโดยใช้โทเค็นการซิงค์ล่าสุดที่ระบุในช่อง syncToken โปรดทราบว่าผลลัพธ์จะมีรายการที่ลบไปแล้วเสมอ เพื่อให้ลูกค้ามีโอกาสนำรายการเหล่านั้นออกจากพื้นที่เก็บข้อมูล

ในกรณีที่มีการเปลี่ยนแปลงทรัพยากรจํานวนมากนับตั้งแต่คําขอซิงค์เพิ่มเติมครั้งล่าสุด คุณอาจเห็น pageToken แทน syncToken ในผลการค้นหารายการ ในกรณีเหล่านี้ คุณจะต้องดำเนินการค้นหารายการแบบเดียวกันกับที่ใช้ดึงข้อมูลหน้าแรกในการซิงค์แบบเพิ่มทีละรายการ (โดยใช้ 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 ซึ่งจะทริกเกอร์การล้างข้อมูลร้านค้าของลูกค้าทั้งหมด และการซิงค์แบบเต็มครั้งใหม่

โค้ดตัวอย่าง

ข้อมูลโค้ดตัวอย่างด้านล่างแสดงวิธีใช้โทเค็นการซิงค์กับไลบรารีไคลเอ็นต์ Java เมื่อเรียกใช้เมธอด 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 เพื่อดึงข้อมูลเหตุการณ์ที่อัปเดต เราไม่แนะนําให้ใช้แนวทางนี้อีกต่อไปเนื่องจากมีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้นเกี่ยวกับการอัปเดตที่พลาดไป (เช่น ไม่บังคับใช้ข้อจํากัดการค้นหา) นอกจากนี้ ฟีเจอร์นี้ใช้ได้กับกิจกรรมเท่านั้น