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

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

เนื้อหา

ภาพรวม

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

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