בין אם אתם מפתחים אפליקציה חדשה או מפעילים שירות עם נפח תנועה גבוה, תוכלו להיעזר בתובנות ובהמלצות שבמדריך הזה כדי להרחיב את השימוש ב-FCM בצורה חלקה. המושגים והשיטות האלה יכולים לעזור לכם להימנע מהשפעות שליליות כשאתם צריכים לשלוח נפחים גדולים של הודעות.
מושגים ותנאים חשובים
בקשת הודעה: בקשת הודעה ב-FCM. המונח משמש לסירוגין עם 'בקשה', 'הודעה' או 'שאילתה'.
בקשות לשנייה (RPS): מדד שמתאר את קצב הבקשות הנכנסות ל-FCM. משתמשים בו לסירוגין עם 'שאילתות לשנייה' (QPS).
טוקנים של מכסות, מאגרי טוקנים ומילויים: כששולחים הודעות באמצעות FCM HTTP v1 API, כל בקשה צורכת טוקן מכסה שהוקצה לה בחלון זמן נתון. החלון הזה, שנקרא Token Bucket, מתמלא מחדש עד הסוף בסוף חלון הזמן. לדוגמה: ב-HTTP v1 API מוקצים 600,000 אסימוני מכסה לכל דלי אסימונים של דקה אחת, והוא מתמלא מחדש בסוף כל חלון של דקה אחת.
ויסות בצד השרת: כשנפח התנועה חורג מהקיבולת של שירות FCM, בקשות שחורגות מקיבולת ההצגה נדחות כדי להגביל את קצב הזרימה של התנועה הנכנסת. תגובות שגיאה מסוג 429 עם כותרות retry-after עשויות להיות מוחזרות כדי לציין שעליך להמתין פרק זמן מסוים לפני שתנסה לשלוח את הבקשה שוב.
ויסות נתונים בצד הלקוח: כשלקוחות מזהים כשלים בבקשות, חביון גבוה או שגיאות 429, הם צריכים להגביל את קצב היציאה כדי למנוע החמרה של העומס.
השהיה מעריכית לפני ניסיון חוזר (exponential backoff): כשמנסים שוב לתקן שגיאות, מוסיפים השהיות שהולכות וגדלות באופן אקספוננציאלי. לדוגמה: 1s, 2s, 4s, 8s, 16s, 32s וכן הלאה.
הוספת תנודות: הימנעות מניסיון חוזר לשליחת בקשות במרווחי זמן מדויקים. בשיטת ה-jittering, משנים את ההשהיות בין הניסיונות באמצעות תהליך אקראי כדי לפזר אותן באופן אחיד לאורך זמן (לדוגמה: 0.9 שניות, 2.3 שניות, 4.1 שניות, 8.5 שניות, 17.9 שניות, 34.7 שניות).
הגברה של ניסיונות חוזרים: כשמנסים לשלוח שוב בקשות שנכשלו בלי להשתמש בהשהיה מעריכית לפני ניסיון חוזר או בהוספת רעש אקראי, הבקשות האלה מצטברות ומוסיפות לעומס התנועה הקיים, ויכול להיות שהן יגבירו את הבעיות שקשורות לעומסי תנועה.
הבעיה: עליות חדות בתנועה
מערכת FCM מעבדת מיליוני בקשות לשנייה (RPS). הגורם העיקרי לעומס מערכתי, לבעיות בזמן האחזור ולהפסקות שירות הוא קפיצות בתעבורה.

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

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

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

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

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

איך אפשר לטפל בעליות פתאומיות בתנועה על ידי "השטחת העקומה"
בקטע הזה מתוארות אסטרטגיות להפחתת העלייה החדה בתנועה, ככל האפשר – אסטרטגיות ל'השטחת העקומה'.
שימוש במשתנה FCM רק בתרחישי שימוש מתאימים
יש כמה תרחישי שימוש שבהם אין צורך או שאין זה מתאים להשתמש ב-FCM כדי להעביר התראה.
לדוגמה, לגבי התראות על אירועים ביומן, אפשר לתזמן משימה מקומית באפליקציה כדי להציג התראה בזמנים המתאימים במקום לשלוח אותה משרת האפליקציה. הגבלת הודעות FCM לסנכרון היומן.
הימנעות מעליות חדות
דוגמה לאנטי-תבנית שקשורה להרחבת קנה המידה היא שליחת התראות FCM במהירות המקסימלית שהמערכות מאפשרות, במקום להשתמש בהגבלת קצב העברת נתונים בצד השרת. כמה נקודות שכדאי לזכור:
- האם כל הלקוחות שלכם צריכים לקבל את אותה ההתראה בתוך חלון זמן של דקה אחת? לדוגמה, האם חלון משלוח של 5 דקות עדיין יענה על הצרכים העסקיים שלכם?
- האם אפשר לפלח את הלקוחות לפי עדיפות כדי להחליק את העליות החדות?
- האם אפשר לתזמן את ההתראות מראש?
בכל מקום שאפשר: כדאי להימנע משימוש בשיטות שגורמות לניצול מיידי של מכסת השליחה של FCM, ואז חוזרות על התבנית ברגע שה-token bucket מתחדש. דפוס הגישה הזה יוצר בעיות באיזון העומסים ב-FCM ובמערכות שתלויות בו. הגדילו את נפח התנועה בהדרגה ככל האפשר. לפחות, צריך להגדיל את קצב הבקשות מ-0 לקצב הבקשות המקסימלי בחלון זמן של 60 שניות. מומלץ להשתמש בחלונות ארוכים יותר כדי להגדיל את מספר הבקשות לשנייה.
הימנעות מפקקים בשעות עגולות
במידת האפשר: מומלץ להימנע משליחת הודעות בטווח של 2 דקות מהשעות :00, :15, :30 ו-:45.
הטמעה של ויסות נתונים בצד השרת
הטמעת הגבלת קצב בצד השרת כדי לעקוב אחרי תעבורת הנתונים אל FCM ולנהל אותה.
טיפול בניסיונות חוזרים
למרות ש-FCM שואף להיות זמין מאוד, לפעמים חלק מהבקשות יגיעו לזמן קצוב לתפוגה או ייכשלו. הסיבות לכך משתנות, אבל השיטות המומלצות הבאות עוזרות לבצע אופטימיזציה של התנהגות הניסיון החוזר כדי להעביר הודעות בהקדם האפשרי, תוך צמצום ההשפעה על עומסי התנועה.
חסימות זמניות
מגדירים לפחות 10 שניות של פסק זמן לשליחת בקשות לפני שמנסים שוב. רוב הקריאות הפנימיות של FCM לפרוצדורות מרוחקות (RPC) משתמשות בערך הזמן הקצוב לתפוגה של 10 שניות.
שגיאות
- לשגיאות 400, 401, 403 ו-404: מבטלים את הפעולה ולא מנסים שוב.
- לגבי שגיאות 429: צריך לנסות שוב אחרי שממתינים למשך הזמן שמוגדר בכותרת retry-after. אם לא מוגדר כותרת retry-after, ברירת המחדל היא 60 שניות.
- לשגיאות 500: צריך לנסות שוב עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff).
השהיה מעריכית לפני ניסיון חוזר (exponential backoff)
כדי להימנע מהגברה של ניסיונות חוזרים, צריך להטמיע השהיה מעריכית לפני ניסיון חוזר (exponential backoff) עם תוספת של רעידות כדי לנסות שוב לשלוח בקשות. לדוגמה, ב-SDK של Firebase לאדמינים מיושמת השהיה מעריכית לפני ניסיון חוזר (exponential backoff).
הנה עוד כמה הגדרות מומלצות:
- מרווח מינימלי: אל תנסו לשלוח שוב בקשה שנכשלה באמצעות 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% ramp-up | הגדלה הדרגתית מ-250,000 ל-375,000 בקשות לשנייה (RPS) במשך 6 שעות |
| 6 | הגדלת נפח ב-100% | הגדלת נפח התנועה מ-375,000 ל-500,000 בקשות לשנייה במשך 6 שעות |
תוכנית היפותטית להחזרה למצב הקודם:
- אם זמן האחזור של אחוזון 95 עולה על 500 אלפיות השנייה או אם יחס השגיאות עולה על 1% למשך יותר משעה בכל שלב, צריך להשתמש בהגדרה דינמית כדי לחזור לשלב הקודם באופן מיידי.
- ממשיכים להחזיר את השינויים לשלבים קודמים עד שזמן האחזור ויחס השגיאות חוזרים לרמות הרגילות.
באילו מקרים צריך לפנות לתמיכה של FCM
אם אחד מהמקרים הבאים רלוונטי, אפשר לפנות ל-FCM דרך התמיכה של Firebase:
- המכסות שמוגדרות כברירת מחדל כבר לא מתאימות לתרחיש השימוש שלכם
- אתם משנים את דפוסי השליחה שלכם בתוך חלון של 3 חודשים בקנה מידה של 100,000 בקשות לשנייה ברחבי העולם או 30,000 בקשות לשנייה ביבשת.