כדי לעזור לכם להתכונן למעבר מ-Amazon Web Services (AWS) Step Functions ל-Workflows ב- Google Cloud, בדף הזה מוסברים קווי הדמיון וההבדלים העיקריים בין שני המוצרים. המידע הזה מיועד לעזור למי שכבר מכיר את Step Functions להטמיע ארכיטקטורה דומה באמצעות Workflows.
בדומה ל-Step Functions, Workflows היא פלטפורמת תזמור מנוהלת לחלוטין שמבוססת על מצב ומבצעת שירותים בסדר שאתם מגדירים: תהליך עבודה. בתהליכי העבודה האלה אפשר לשלב שירותים, כולל שירותים בהתאמה אישית שמארחים ב-Cloud Run או בפונקציות Cloud Run, Google Cloud שירותים כמו Cloud Vision AI ו-BigQuery, וכל API מבוסס-HTTP.
הערה: Express Workflows ב-Step Functions הוא סוג של תהליך עבודה ב-AWS Step Functions שלא נכלל כאן, כי משך הזמן של Express Workflow מוגבל, וביצוע של תהליך עבודה בדיוק פעם אחת לא אפשרי.
שלום עולם
ב-Step Functions, מכונת מצבים היא תהליך עבודה, ומשימה היא מצב בתהליך עבודה שמייצג יחידת עבודה יחידה ששירות אחר של AWS מבצע. ב-Step Functions, כל מצב צריך להגדיר את המצב הבא.
ב-Workflows, סדרת שלבים שמשתמשת בתחביר של Workflows מתארת את המשימות לביצוע. ב-Workflows, השלבים נחשבים לרשימה מסודרת והם מבוצעים אחד אחרי השני עד שכל השלבים מסתיימים.
בדוגמה הבאה של 'Hello world' מוצג השימוש במצבים ב-Step Functions ובשלבים ב-Workflows:
Step Functions
{ "Comment": "Hello world example of Pass states in Amazon States Language", "StartAt": "Hello", "States": { "Hello": { "Type": "Pass", "Result": "Hello", "Next": "World" }, "World": { "Type": "Pass", "Result": "World", "End": true } } }
Workflows YAML
--- # Hello world example of steps using Google Cloud Workflows syntax main: steps: - Hello: next: World - World: next: end ...
קובץ JSON של תהליכי עבודה
{ "main": { "steps": [ { "Hello": { "next": "World" } }, { "World": { "next": "end" } } ] } }
סקירה כללית של השוואה
בקטע הזה מוצגת השוואה מפורטת יותר בין שני המוצרים.
| Step Functions | Workflows | |
|---|---|---|
| תחביר | JSON (YAML בכלי) | YAML או JSON |
| זרימת בקרה | מעבר בין מצבים | בקרה על זרימת נתונים עם שלבים |
| Worker | משאבים (ARN) ומשימת HTTP | בקשות HTTP ומחברים |
| אמינות | תפיסה/ניסיון חוזר | תפיסה/ניסיון חוזר |
| מקביליות | נתמך | נתמך |
| נתונים ברמת המדינה | המצב מועבר | משתנים של Workflows |
| אימות | IAM | IAM |
| חוויית משתמש | Workflow Studio, CLI, SDK, IaC | Google Cloud מסוף, CLI, SDK, IaC |
| Pricing | תמחור של Step Functions | מחירון של Workflows |
- תחביר
Step Functions משתמש בעיקר ב-JSON כדי להגדיר פונקציות, ולא תומך ישירות ב-YAML. עם זאת, ב-AWS Toolkit ל-Visual Studio Code וב-AWS CloudFormation, אפשר להשתמש ב-YAML להגדרה של Step Functions.
אפשר לתאר את השלבים ב-Workflows באמצעות התחביר של Workflows, והם יכולים להיכתב ב-YAML או ב-JSON. רוב תהליכי העבודה הם ב-YAML. הדוגמאות בדף הזה ממחישות את היתרונות של YAML, כולל קלות הקריאה והכתיבה, ותמיכה מובנית בתגובות. הסבר מפורט על התחביר של Workflows מופיע במאמר הפניה לתחביר.
- בקרת זרימה
גם ב-Workflows וגם ב-Step Functions, תהליכי עבודה מוגדרים כסדרה של משימות: שלבים ב-Workflows ומצבים ב-Step Functions. שניהם מאפשרים למשימה לציין איזו משימה להפעיל בהמשך, ותומכים בתנאים דמויי switch כדי לבחור את יחידת העבודה הבאה על סמך המצב הנוכחי. ההבדל העיקרי הוא שב-Step Functions צריך להגדיר את המצב הבא לכל מצב, ואילו ב-Workflows השלבים מבוצעים בסדר שבו הם מוגדרים (כולל השלבים הבאים החלופיים). מידע נוסף זמין במאמרים בנושא תנאים ושלבים.
- קובץ שירות
שני המוצרים מתזמנים משאבי מחשוב כמו פונקציות, קונטיינרים ושירותי אינטרנט אחרים כדי לבצע משימות. ב-Step Functions, העובד מזוהה על ידי השדה
Resource, שהוא URI מבחינה תחבירית. כתובות ה-URI שמשמשות לזיהוי משאבי העובדים הן בפורמט של שם משאב Amazon (ARN). כדי להפעיל ישירות נקודת קצה (endpoint) שרירותית של HTTP, אפשר להגדיר משימת HTTP.תהליכי עבודה יכולים לשלוח בקשות HTTP לנקודת קצה שרירותית של HTTP ולקבל תגובה. מחברים מאפשרים להתחבר בקלות ל-API אחרים של Google Cloud בתהליך עבודה, ולשלב את תהליכי העבודה עם מוצרים אחרים של Google Cloud כמו Pub/Sub, BigQuery או Cloud Build. מחברים מפשטים את הקריאה לשירותים כי הם מטפלים בפורמט של הבקשות בשבילכם, ומספקים שיטות וארגומנטים כך שלא תצטרכו לדעת את הפרטים שלGoogle Cloud API. אפשר גם להגדיר את מדיניות הזמן הקצוב לתפוגה והסקר.
- אמינות
אם משימה נכשלת, תהליך העבודה צריך להיות מסוגל לנסות שוב בצורה מתאימה, לזהות חריגים כשצריך ולנתב מחדש את תהליך העבודה לפי הצורך. גם Step Functions וגם Workflows משיגים אמינות באמצעות מנגנונים דומים: טיפול בחריגים עם ניסיונות חוזרים, ושליחה בסופו של דבר למקום אחר בתהליך העבודה. מידע נוסף זמין במאמר בנושא שגיאות בתהליך העבודה.
- מקביליות
יכול להיות שתרצו שתהליך העבודה יתזמן כמה משימות במקביל. ב-Step Functions יש שתי דרכים לעשות את זה: אפשר לקחת פריט נתונים אחד ולהעביר אותו במקביל לכמה משימות שונות, או להשתמש במערך ולהעביר את הרכיבים שלו לאותה משימה.
ב-Workflows, אפשר להגדיר חלק בתהליך העבודה שבו שני שלבים או יותר יכולים להתבצע בו-זמנית. אפשר להגדיר ענפים שפועלים במקביל, או לולאה שבה האיטרציות פועלות במקביל. פרטים נוספים זמינים במאמר בנושא ביצוע שלבים בתהליך עבודה במקביל.
- נתונים לפי מדינה
אחד היתרונות של מנוע זרימת עבודה הוא שנתוני המצב נשמרים בשבילכם ללא מאגר נתונים חיצוני. ב-Step Functions, נתוני המצב מועברים במבנה JSON ממצב אחד למצב אחר.
ב-Workflows, אפשר לשמור את נתוני המצב במשתנים גלובליים. מכיוון שמותר לכם להגדיר משך ביצוע של עד שנה אחת, אתם יכולים לשמור את נתוני המצב כל עוד המופע עדיין פועל.
- אימות
שני המוצרים מסתמכים על מערכת בסיסית לניהול זהויות והרשאות גישה (IAM) לצורך אימות ובקרת גישה. לדוגמה, אפשר להשתמש בתפקיד IAM כדי להפעיל את Step Functions.
ב-Workflows, אפשר להשתמש בחשבון שירות כדי להפעיל תהליך עבודה, להשתמש ב-OAuth 2.0 או ב-OIDC כדי להתחבר לממשקי API של Google Cloud, ולהשתמש בכותרת הבקשה של הרשאה כדי לבצע אימות באמצעות API של צד שלישי. מידע נוסף זמין במאמרים איך מעניקים הרשאה לזרימת עבודה לגשת למשאבים Google Cloud ואיך שולחים בקשות מאומתות מזרימת עבודה.
- חוויית משתמש
אפשר להשתמש בכלי שורת פקודה או בתשתית כקוד (IaC) כמו Terraform כדי להגדיר ולנהל את Step Functions ואת Workflows.
בנוסף, Workflows תומך בהרצת תהליכי עבודה באמצעות ספריות הלקוח, במסוף Google Cloud , באמצעות Google Cloud CLI או על ידי שליחת בקשה ל-Workflows API בארכיטקטורת REST. פרטים נוספים זמינים במאמר הפעלת תהליך עבודה.
- תמחור
לשני המוצרים יש תוכנית בחינם. פרטים נוספים זמינים בדפי התמחור המתאימים: תמחור של Step Functions ותמחור של Workflows.
מיפוי של סוגי מצבים לשלבים
יש שמונה סוגים של מצבים ב-Step Functions. מצבים הם רכיבים במכונת מצבים שיכולים לקבל החלטות על סמך הקלט שלהם, לבצע פעולות ולהעביר פלט למצבים אחרים. לפני שמעבירים מ-Step Functions ל-Workflows, חשוב להבין איך לתרגם כל סוג של מצב לשלב ב-Workflows.
Choice
מצב Choice מוסיף לוגיקה של הסתעפות למכונת מצבים.
ב-Workflows, אפשר להשתמש בבלוק switch כמנגנון בחירה שמאפשר לערך של ביטוי לשלוט בזרימת הביצוע של תהליך העבודה. אם יש התאמה לערך, מתבצעת ההצהרה של התנאי הזה.
מידע נוסף מופיע במאמר בנושא תנאים.
Step Functions
"ChoiceState": { "Type": "Choice", "Choices": [ { "Variable": "$.foo", "NumericEquals": 1, "Next": "FirstMatchState" }, { "Variable": "$.foo", "NumericEquals": 2, "Next": "SecondMatchState" } ], "Default": "DefaultState" }
Workflows YAML
switch: - condition: ${result.body.SomeField < 10} next: small - condition: ${result.body.SomeField < 100} next: medium - condition: true next: default_step
קובץ JSON של תהליכי עבודה
{ "switch": [ { "condition": "${result.body.SomeField < 10}", "next": "small" }, { "condition": "${result.body.SomeField < 100}", "next": "medium" }, { "condition": true, "next": "default_step" } ] }
Fail
מצב Fail מפסיק את הביצוע של מכונת המצבים ומסמן אותה ככישלון.
ב-Workflows, אפשר ליצור שגיאות מותאמות אישית באמצעות התחביר raise
ואפשר לזהות ולטפל בשגיאות באמצעות בלוק try/except. מידע נוסף מופיע במאמר בנושא העלאת שגיאות.
Step Functions
"FailState": { "Type": "Fail", "Error": "ErrorA", "Cause": "Kaiju attack" }
Workflows YAML
raise: code: 55 message: "Something went wrong."
קובץ JSON של תהליכי עבודה
{ "raise": { "code": 55, "message": "Something went wrong." } }
Map
אפשר להשתמש במצב Map כדי להפעיל קבוצה של שלבים לכל רכיב במערך קלט.
ב-Workflows, אפשר להשתמש בלולאות for בשביל איטרציות.
Step Functions
{ "StartAt": "ExampleMapState", "States": { "ExampleMapState": { "Type": "Map", "Iterator": { "StartAt": "CallLambda", "States": { "CallLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloFunction", "End": true } } }, "End": true } } }
Workflows YAML
- assignStep: assign: - map: 1: 10 2: 20 3: 30 - sum: 0 - loopStep: for: value: key in: ${keys(map)} steps: - sumStep: assign: - sum: ${sum + map[key]} - returnStep: return: ${sum}
קובץ JSON של תהליכי עבודה
[ { "assignStep": { "assign": [ { "map": { "1": 10, "2": 20, "3": 30 } }, { "sum"