סנכרון יעיל של משאבים

במדריך הזה מוסבר איך להטמיע 'סנכרון מצטבר' של נתוני היומן. באמצעות השיטה הזו, אפשר לשמור על סנכרון הנתונים בכל אוספי היומנים תוך חיסכון ברוחב פס.

תוכן עניינים

סקירה כללית

סנכרון מצטבר מורכב משני שלבים:

  1. סנכרון מלא ראשוני מתבצע פעם אחת בהתחלה כדי לסנכרן באופן מלא את מצב הלקוח עם מצב השרת. הלקוח יקבל טוקן סנכרון שהוא צריך לשמור.

  2. סנכרון מצטבר מתבצע שוב ושוב ומעדכן את הלקוח בכל השינויים שקרו מאז הסנכרון הקודם. בכל פעם, הלקוח מספק את טוקן הסנכרון הקודם שהוא קיבל מהשרת ושומר את טוקן הסנכרון החדש מהתגובה.

סנכרון מלא ראשוני

הסנכרון המלא הראשוני הוא הבקשה המקורית לכל המשאבים באוסף שרוצים לסנכרן. אם רוצים לסנכרן רק קבוצת משנה ספציפית של משאבים, אפשר להשתמש בפרמטרים של בקשות כדי להגביל את הבקשה לרשימה.

בתגובה לפעולת הרשימה, יופיע שדה בשם nextSyncToken שמייצג אסימון סנכרון. תצטרכו לשמור את הערך של nextSyncToken. אם קבוצת התוצאות גדולה מדי והתשובה מחולקת לדפים, השדה nextSyncToken מופיע רק בדף האחרון.

סנכרון מצטבר

סינכרון מצטבר מאפשר לכם לאחזר את כל המשאבים שעברו שינוי מאז בקשת הסינכרון האחרונה. כדי לעשות זאת, צריך לבצע בקשת רשימה עם אסימון הסנכרון האחרון שצוין בשדה syncToken. חשוב לזכור שהתוצאה תמיד תכיל רשומות שנמחקו, כדי שהלקוחות יוכלו להסיר אותן מהאחסון.

במקרים שבהם מספר גדול של משאבים השתנו מאז הבקשה האחרונה לסנכרון מצטבר, יכול להיות שבמקום syncToken יופיע pageToken בתוצאת הרשימה. במקרים כאלה, צריך לבצע את אותה שאילתת רשימה ששימשה לאחזור הדף הראשון בסנכרון המצטבר (עם אותו 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 כדי לאחזר אירועים מעודכנים. הגישה הזו כבר לא מומלצת כי היא יותר מועדת לשגיאות בהקשר של עדכונים שהוחמצו (לדוגמה, אם לא נאכפות הגבלות על שאילתות). בנוסף, האפשרות הזו זמינה רק לאירועים.