שיטות מומלצות לשליחת הודעות FCM בקנה מידה נרחב

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

מונחים ומושגים מרכזיים

בקשת הודעה: בקשת הודעה ב-FCM. המונח משמש לסירוגין עם 'בקשה', 'הודעה' או 'שאילתה'.

Requests-per-second (RPS): מדד שמתאר את קצב הבקשות הנכנסות ל-FCM. משתמשים בו לסירוגין עם Queries-per-second (QPS).

טוקנים של מכסות, מאגרי טוקנים ומילויים: כששולחים הודעות באמצעות FCM HTTP v1 API, כל בקשה צורכת טוקן מכסה שהוקצה לה בחלון זמן נתון. החלון הזה, שנקרא Token Bucket, מתמלא מחדש עד הסוף בסוף חלון הזמן. לדוגמה: ב-API‏ HTTP v1 מוקצים 600,000 אסימוני מכסה לכל דלי אסימונים של דקה אחת, והוא מתמלא מחדש בסוף כל חלון זמן של דקה אחת.

ויסות בצד השרת: כשנפח התנועה חורג מהקיבולת של שירות FCM, בקשות שחורגות מקיבולת ההצגה נדחות כדי להגביל את קצב הזרימה של התנועה הנכנסת. יכול להיות שיוחזרו תגובות שגיאה מסוג 429 עם כותרות retry-after, כדי לציין שצריך להמתין פרק זמן מסוים לפני שמנסים שוב לשלוח את הבקשה.

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

השהיה מעריכית לפני ניסיון חוזר (exponential backoff): כשמנסים שוב לתקן שגיאות, מוסיפים השהיות שהולכות וגדלות באופן אקספוננציאלי. לדוגמה: 1s,‏ 2s,‏ 4s,‏ 8s,‏ 16s,‏ 32s וכן הלאה.

Jittering: הימנעות מניסיון חוזר לשלוח בקשות במרווחי זמן מדויקים. בשיטת ה-jittering, משנים את ההשהיות בין הניסיונות באמצעות תהליך אקראי כדי לפזר אותן באופן אחיד לאורך זמן (לדוגמה: 0.9 שניות, 2.3 שניות, 4.1 שניות, 8.5 שניות, 17.9 שניות, 34.7 שניות).

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

הבעיה: עליות חדות בתנועת הגולשים

מערכת FCM מעבדת מיליוני בקשות בשנייה (RPS). הגורם שהכי תורם לעומס יתר במערכת, לבעיות בזמן האחזור ולהפסקות שירות הוא עליות חדות בתעבורה.

תרשים קו שבו רואים עליות חדות בתנועה במרווחי זמן לא סדירים.

מהי תנועה עם עליות חדות?

יש כמה סוגים שונים של עליות פתאומיות בתנועה.

עליות פתאומיות בתנועה בתחילת כל שעה: מערכת FCM מקבלת יותר מפי שניים תנועה במהלך 30 השניות הראשונות עד 2 הדקות של כל שעה. עלייה דומה, אם כי פחות חדה, נצפית גם בנקודות של חצי שעה ורבע שעה (דוגמאות: 00:15, ‏ 00:30, ‏ 00:45)

תרשים קו שמציג מגמות של עליות חדות בנתונים כל חצי שעה וכל רבע שעה.

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

תרשים קו שמראה דפוסים של עליות חדות.

שינויים פתאומיים בדפוסי התנועה: הפניית תנועה חדשה ל-FCM או העברת תנועה ל-FCM באזורים שונים ללא גורמי החלקה כמו הגדלה הדרגתית עלולה לגרום לעליות חדות.

תרשים קו שבו רואים עלייה חדה אחת.

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

תרשים קו שבו מוצג זינוק חד מאוד.

אירועים מיוחדים: עליות חדות בתנועה במהלך חגים (ערב השנה החדשה) או אירועי ספורט (מונדיאל פיפ"א).

תרשים קו שבו מוצגים כמה שיאים חוזרים.

איך אפשר לטפל בעליות חדות בתנועה באמצעות "השטחת העקומה"

בקטע הזה מתוארות אסטרטגיות להפחתת העלייה החדה בתנועה, ככל האפשר – אסטרטגיות ל'השטחת העקומה'.

שימוש במשתנה FCM רק בתרחישים מתאימים

יש כמה תרחישי שימוש שבהם אין צורך או שאין זה מתאים להשתמש ב-FCM כדי להעביר התראה.

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

הימנעות מעליות חדות

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

  • האם כל הלקוחות שלכם צריכים לקבל את אותה הודעה בתוך חלון זמן של דקה אחת? לדוגמה, האם חלון זמן של 5 דקות למשלוח עדיין יתאים לצרכים העסקיים שלכם?
  • האם אפשר לפלח את הלקוחות לפי סדר עדיפויות כדי להפחית את העליות החדות?
  • האם אפשר לתזמן מראש את ההתראות?

בכל מקום שאפשר: כדאי להימנע משיטות שגורמות לניצול מיידי של מכסת השליחה של FCM, ואז לחזרה על התבנית ברגע שהמכסה מתמלאת מחדש. דפוס הגישה הזה יוצר בעיות באיזון העומסים ב-FCM ובמערכות התלויות בו. הגדילו את נפח התנועה בהדרגה ככל האפשר. לפחות, צריך להגדיל את מספר הבקשות לשנייה מ-0 למספר המקסימלי במהלך חלון זמן של 60 שניות. כדאי להשתמש בחלונות ארוכים יותר כדי להשיג ערך גבוה יותר של בקשות לשנייה.

הימנעות מפקקים בשעות עגולות

אם אפשר: מומלץ להימנע משליחת הודעות בטווח של 2 דקות לפני או אחרי כל אחת מהנקודות הבאות: 00:00, ‏00:15, ‏00:30 ו-00:45.

הטמעה של ויסות בצד השרת

הטמעת הגבלת קצב בצד השרת כדי לעקוב אחרי תנועת הנתונים אל FCM ולנהל אותה.

טיפול בניסיונות חוזרים

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

זמנים קצובים לתפוגה

מגדירים לפחות 10 שניות של פסק זמן לבקשות שליחה לפני שמנסים שוב. רוב הקריאות הפנימיות של FCM לפרוצדורות מרוחקות (RPC) משתמשות בערך הזמן הקצוב לתפוגה של 10 שניות.

שגיאות

  • בשגיאות 400, 401, 403 ו-404: מבטלים את הפעולה ולא מנסים שוב.
  • לשגיאות 429: צריך לנסות שוב אחרי שמחכים את משך הזמן שמוגדר בכותרת retry-after. אם לא מוגדר כותר retry-after, ברירת המחדל היא 60 שניות.
  • שגיאות 500: צריך לנסות שוב עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff).

השהיה מעריכית לפני ניסיון חוזר (exponential backoff)

כדי להימנע מהגברה של ניסיונות חוזרים, צריך להטמיע השהיה מעריכית לפני ניסיון חוזר (exponential backoff) עם רעידות כדי לנסות שוב את הבקשות. לדוגמה, ב-Firebase Admin SDK מיושם מנגנון של נסיגה אקספוננציאלית.

הנה עוד הגדרות מומלצות:

  • מרווח מינימלי: אל תנסו מיד לשלוח מחדש בקשה שנכשלה באמצעות FCM. ממתינים לפחות 10 שניות לפני שמנסים שוב לשלוח בקשה שנכשלה.
  • מרווח מקסימלי: הגדרת מרווח מקסימלי להפסקת בקשות שכבר לא רלוונטיות, במקום לנסות שוב ללא הגבלה.

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

יצירת תוכניות השקה ותוכניות חזרה לגרסה קודמת, וביצוע שינויים הדרגתיים

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

  • תוכנית השקה עוזרת לבעלי העניין להבין מה מצופה מהם. במצבים מסוימים (שמפורטים בהמשך), כדאי לשתף את תוכנית ההשקה עם צוות FCM מראש כדי למנוע הפתעות.
  • תוכנית חזרה לגרסה קודמת מאפשרת לכם להתכונן למקרי חירום וליצור מנגנונים לשחזור מהיר ובטוח מכשלים בלתי צפויים.
  • לביצוע שינויים הדרגתיים יש שני היבטים:
    • השקות הדרגתיות: השלבים צריכים להיות 1% -> 5% -> 10% -> 25% -> 50% -> 75% -> 100% או יותר. ‫Soak (בדיקת התנהגות המערכת בעומס) כל שלב למשך יום אחד עד שבוע. כך תוכלו לזהות בעיות פוטנציאליות לפני השלב הבא.
    • הגדלה הדרגתית של נפח התנועה: כשמבצעים כל 'שלב' בהגדלת נפח התנועה, צריך להחליק את התנועה על פני שעה לפחות. התכונה הזו מאפשרת לתשתית של FCM לאזן את העומס ולשנות את קנה המידה של תנועת הגולשים החדשה בצורה מתאימה, תוך מזעור הסיכון לנקודות חמות ולעומס.

הנה תרחיש היפותטי להעברה של 500,000 בקשות לשנייה (RPS) ברחבי העולם מ-FCM Legacy HTTP API ל-FCM HTTP v1 API:

שבוע שלב אסטרטגיה של הגדלה הדרגתית של נפח התנועה
0 הגדלת נפח החשיפה ב-1% הגברת נפח התנועה בצורה הדרגתית מ-0 ל-5,000 בקשות לשנייה ל-FCM HTTP v1 במהלך שעה.
1 הגדלת נפח החשיפה ב-5% הגדלת נפח התנועה בצורה הדרגתית מ-5,000 ל-25,000 בקשות לשנייה במשך שעתיים.
2 הגדלת נפח ב-10% הגדלה הדרגתית מ-25,000 ל-50,000 בקשות לשנייה (RPS) במשך שעתיים
3 הגדלת נפח ב-25% הגדלת נפח התנועה מ-50,000 ל-125,000 בקשות לשנייה (RPS) במשך 3 שעות
4 הגדלת נפח החשיפה ב-50% הגדלה הדרגתית מ-125,000 ל-250,000 בקשות לשנייה (RPS) במשך 6 שעות
5 הגדלת נפח החשיפה ב-75% הגדלה הדרגתית מ-250,000 ל-375,000 בקשות לשנייה במשך 6 שעות
6 הגדלה הדרגתית של נפח התנועה ב-100% הגדלה הדרגתית מ-375,000 ל-500,000 בקשות לשנייה (RPS) במשך 6 שעות

תוכנית היפותטית להחזרה לגרסה הקודמת:

  • אם זמן האחזור של אחוזון 95 עולה על 500 אלפיות השנייה או אם יחס השגיאות עולה על 1% למשך יותר משעה בכל שלב, צריך להשתמש בהגדרה דינמית כדי לחזור לשלב הקודם באופן מיידי.
  • ממשיכים לבצע חזרה לגרסה קודמת לשלבים מוקדמים יותר עד שזמן האחזור ויחס השגיאות חוזרים לרמות הרגילות.

מתי כדאי לפנות ל-FCM

אם אחד מהמקרים הבאים רלוונטי, אפשר לפנות ל-FCM דרך התמיכה של Firebase:

  • המכסות שמוגדרות כברירת מחדל כבר לא מתאימות לתרחיש השימוש שלכם
  • אתם משנים את דפוסי השליחה שלכם בחלון של 3 חודשים בקנה מידה של 100,000 בקשות לשנייה ברחבי העולם או 30,000 בקשות לשנייה ביבשת.