Dataflow תומך בשני מצבים של משימות סטרימינג:
- מצב 'פעם אחת בדיוק'. מצב זה הוא ברירת המחדל לכל משימות הסטרימינג של Dataflow. במצב הזה, Dataflow מוודא שהרשומות לא יימחקו או ישוכפלו כשהנתונים עוברים דרך צינור הנתונים.
- מצב 'לפחות פעם אחת'. במצב הזה מובטח שהרשומות יעברו עיבוד לפחות פעם אחת (כלומר, לא יאבדו רשומות קלט). עם זאת, יכול להיות שיהיו רשומות כפולות במצב הזה. במקרים שבהם אפשר להסתדר עם כפילויות, מצב 'לפחות פעם אחת' יכול להפחית באופן משמעותי את העלות ואת זמן האחזור של העבודה.
בחירת מצב הסטרימינג שרוצים להשתמש בו
בוחרים במצב 'פעם אחת בדיוק' אם רוצים לוודא שהתוצאות מהצינור יהיו מדויקות ושהסמנטיקה תהיה צפויה. לדוגמה:
- צינורות עם צבירות, כמו ספירה, סכום או ממוצע.
- תרחישי שימוש קריטיים לעסק שמסתמכים על עיבוד רשומות פעם אחת בלבד. דוגמאות: זיהוי הונאות, זיהוי איומים ברשת ולוחות בקרה של מלאי מסחר אלקטרוני.
כדאי לבחור במצב סטרימינג של לפחות פעם אחת אם עומס העבודה יכול לסבול רשומות כפולות, ואולי ייהנה מעלות או מזמן אחזור מופחתים. לדוגמה:
- עומסי עבודה שבהם מתבצע ביטול כפילויות במורד הזרם מ-Dataflow. לדוגמה, צינורות שכותבים ל-BigQuery או למאגר נתונים של SQL.
- צינורות (pipelines) של מיפוי בלבד, ללא צבירות. דוגמאות כוללות רישום ביומן, סימון נתונים שהשתנו (CDC), או עבודות חילוץ, טרנספורמציה וטעינה (ETL), שבהן צינור הנתונים מבצע רק טרנספורמציות לכל רכיב, כמו תרגום סכימה.
- צינורות שבהם יעד הפלט לא יכול להבטיח מסירה של כל הודעה בדיוק פעם אחת, כמו Pub/Sub. במקרה כזה, יכול להיות שביטול הכפילויות בתוך צינור העיבוד לא יהיה נחוץ, ותוכלו ליהנות מהפחתת העלות ומהשהייה הנמוכה של מצב הסטרימינג 'לפחות פעם אחת'.
- צינורות עיבוד נתונים שקוראים מ-Pub/Sub. הקריאה מ-Pub/Sub מותאמת באופן משמעותי כשמשתמשים במצב 'לפחות פעם אחת'.
שיקולים נוספים
מצב 'לפחות פעם אחת' יכול להפחית באופן משמעותי את העלות ואת זמן האחזור של צינור נתונים. ההשפעה המדויקת תלויה בפרטים הספציפיים של צינור הנתונים. כדי להעריך את ההשפעה, כדאי לבדוק את הזרמת הנתונים לפחות פעם אחת בעומסים ריאליים.
כשמשתמשים במצב 'לפחות פעם אחת', שיעור הרשומות הכפולות תלוי במספר הניסיונות החוזרים. שיעור הבסיס הוא בדרך כלל נמוך (פחות מ-1%). עם זאת, יכולות להיות עליות חדות אם צמתי העובדים נכשלים או אם תנאים אחרים גורמים לקריאות חוזרות של RPC.
מצב הסטרימינג משפיע על האופן שבו Streaming Engine מעבד רשומות, אבל הוא לא משנה את הסמנטיקה של מחברי קלט/פלט. מומלץ להתאים את הסמנטיקה של הקלט/פלט למצב הסטרימינג. לדוגמה, אם משתמשים במצב סטרימינג מסוג 'לפחות פעם אחת' עם מחבר BigQuery I/O, צריך להגדיר את מצב הכתיבה ל-
STORAGE_API_AT_LEAST_ONCE. תבניות Dataflow ש-Google מספקת מפעילות את האפשרות הזו באופן אוטומטי כשמשתמשים בסטרימינג מסוג 'לפחות פעם אחת'.טרנספורמציות ברמת הרכיב, כמו
Map, לא תמיד אידמפוטנטיות. לדוגמה, נניח שיש פונקציה שמקבלת הודעה ומצרפת אליה את חותמת הזמן הנוכחית. במקרה כזה, רשומה כפולה יכולה להפיק כמה פלטים שונים. יכול להיות שמצב 'לפחות פעם אחת' לא מתאים לצינור הזה.
הגדרת מצב הסטרימינג
עיבוד בדיוק פעם אחת הוא הגדרת ברירת המחדל לכל משימות Dataflow. כדי להפעיל את מצב הסטרימינג 'לפחות פעם אחת', צריך להגדיר את streaming_mode_at_least_once
אפשרות השירות.
Java
--dataflowServiceOptions=streaming_mode_at_least_once
Python
--dataflow_service_options=streaming_mode_at_least_once
Go
--dataflow_service_options=streaming_mode_at_least_once
אם לא מציינים את האפשרות streaming_mode_at_least_once, Dataflow משתמש במצב סטרימינג של בדיוק פעם אחת.
אם מגדירים את האפשרות streaming_mode_at_least_once, Dataflow מפעיל אוטומטית את Streaming Engine עם חיוב לפי שימוש במשאבים.
כדי לעדכן את מצב הסטרימינג בעבודה פעילה, מפעילים עבודה חלופית.
בחירת מצב סטרימינג לתבנית
כדי לבחור את מצב הסטרימינג כשמפעילים תבנית של Dataflow streaming, פועלים לפי השלבים הבאים:
המסוף
נכנסים לדף Jobs של Dataflow במסוף Google Cloud .
לוחצים על יצירת עבודה מתבנית.
בתפריט הנפתח Dataflow template (תבנית Dataflow), בוחרים את התבנית שרוצים להפעיל.
בקטע מצב סטרימינג, בוחרים את מצב הסטרימינג. אם התבנית תומכת רק במצב אחד, האפשרות הזו מושבתת.
gcloud
כדי להפעיל את מצב 'לפחות פעם אחת', צריך להגדיר את האפשרות streaming_mode_at_least_once בדגל additional-experiments:
--additional-experiments=streaming_mode_at_least_once
כדי להפעיל את מצב 'פעם אחת בלבד', מגדירים את האפשרות streaming_mode_exactly_once בדגל additional-experiments:
--additional-experiments=streaming_mode_exactly_once
שתי האפשרויות האלה בלעדיות. אם לא מגדירים אחת מהאפשרויות האלה, התבנית מוגדרת כברירת מחדל למצב סטרימינג שנקבע על ידי המטא-נתונים של התבנית. מידע נוסף מופיע במאמר בנושא תבניות בהתאמה אישית.
REST
משתמשים בשדה additionalExperiments באובייקט FlexTemplateRuntimeEnvironment (תבניות Flex) או באובייקט RuntimeEnvironment (תבניות קלאסיות).
{
additionalExperiments : ["streaming_mode_at_least_once"]
...
}
תבניות מותאמות אישית
אם יוצרים תבנית בהתאמה אישית שתומכת בעיבוד של לפחות פעם אחת, צריך להוסיף את השדות הבאים ברמה העליונה לקובץ המטא-נתונים של התבנית:
{
"streaming": true,
"supportsAtLeastOnce": true,
"supportsExactlyOnce": true,
"defaultStreamingMode": "AT_LEAST_ONCE"
}
שדות המטא-נתונים האלה מאפשרים למשתמשים לבחור את מצב הסטרימינג כשהם פורסים את התבנית במסוף Google Cloud . השדה defaultStreamingMode הוא אופציונלי ומציין את מצב הסטרימינג שמוגדר כברירת מחדל לתבנית. אם לא מציינים את defaultStreamingMode והתבנית תומכת בשני המצבים, ברירת המחדל היא מצב 'פעם אחת בלבד'.
מידע נוסף זמין בקטעים הבאים במסמכי התבניות של Dataflow:
- תבניות Flex: מטא-נתונים
- תבניות קלאסיות: שימוש במטא-נתונים בקוד של צינור עיבוד הנתונים
איך צופים במצב הסטרימינג של משימה
כדי לראות את מצב הסטרימינג של משימה, נכנסים לדף Jobs במסוףGoogle Cloud .
מצב הסטרימינג מופיע גם בדף פרטי המשרה, בחלונית Job info.
מגבלות
מצב הסטרימינג 'לפחות פעם אחת' דורש Streaming Engine עם חיוב לפי משאבים.
תמחור
במצב 'לפחות פעם אחת' תמיד נעשה שימוש בחיוב לפי משאבים, שבו אתם מחויבים על סך המשאבים שנצרכים על ידי העבודה.
העלות ליחידה של יחידות מחשוב של Streaming Engine זהה ללא קשר למצב הסטרימינג. עם זאת, ברוב המקרים, צינור (pipeline) צורך הרבה פחות משאבים כוללים כשמשתמשים במצב 'לפחות פעם אחת'.