Cloud de Confiance by S3NS APIs משתמשים בפעולות ממושכות (LRO) לקריאות שצפויות להימשך זמן משמעותי (לדוגמה, הקצאת מכונה של Compute Engine או הפעלה של צינור Dataflow).
ממשקי ה-API האלה לא שומרים על חיבור פעיל לטווח ארוך ולא חוסמים בזמן שהמשימה פועלת. בממשקי LRO API, ספריות הלקוח של Java ב-Cloud מחזירות future כדי שתוכלו לבדוק אותו מאוחר יותר.
איך קובעים אם API הוא LRO
יש שתי דרכים עיקריות לקבוע אם API הוא LRO:
- לממשקי LRO API יש סיומת של
Async(לדוגמה,createClusterAsync) אוOperationCallable(לדוגמה,createClusterOperationCallable). - ממשקי API של LRO מחזירים
OperationFutureאוOperationCallable.
בקטע הקוד הבא מוצגים שני סוגי ההגדרות, באמצעות Java-Dataproc כדוגמה:
// Async suffix (#1) returns OperationFuture (#2)
public final OperationFuture<Cluster, ClusterOperationMetadata> createClusterAsync(CreateClusterRequest request)
// OperationCallable suffix (#1) returns OperationCallable (#2)
public final OperationCallable<CreateClusterRequest, Cluster, ClusterOperationMetadata> createClusterOperationCallable()
אלה שתי וריאציות של אותו API ולא שני ממשקי API שונים (שתי הקריאות יוצרות אשכול Managed Service for Apache Spark). מומלץ להשתמש בווריאנט Async.
תרשים זרימה ברמה גבוהה של פעולת LRO
ממשקי LRO API הם בעצם קריאה ראשונית לבקשה, שאחריה מתבצעת סדרה של קריאות קטנות לבדיקת סטטוס. השיחה הראשונית שולחת את הבקשה ויוצרת 'פעולה' בשרת. כל קריאות הסקר הבאות לשרת עוקבות אחרי הסטטוס של הפעולה. אם הפעולה הסתיימה, התגובה מוחזרת. אחרת, מוחזר סטטוס לא מלא וספריית הלקוח קובעת אם לבצע שוב שאילתת בדיקה.
כברירת מחדל, הלקוח מטפל בלוגיקה של הסקר, ואין צורך להגדיר את מנגנון הסקר אלא אם יש לכם דרישות ספציפיות.
מנקודת המבט שלכם, השיחה מתנהלת ברקע עד לקבלת תשובה. לקריאות ה-polling ולהגדרות הזמן הקצוב לתפוגה יש ערכי ברירת מחדל שהוגדרו מראש על ידי צוות השירות על סמך הזמן הצפוי של ממשקי ה-API שלהם. ההגדרות האלה קובעות הרבה גורמים, כמו תדירות הבדיקה ומשך ההמתנה לפני שמוותרים.
ספריות הלקוח של Cloud Java מספקות ממשק לאינטראקציה עם LRO באמצעות OperationFuture.
בקטע הקוד הבא אפשר לראות איך מפעילים פעולה ומחכים לתגובה, באמצעות Java-Dataproc כדוגמה:
try (ClusterControllerClient clusterControllerClient = ClusterControllerClient.create()) {
CreateClusterRequest request =
CreateClusterRequest.newBuilder().build();
OperationFuture<Cluster, ClusterOperationMetadata> future =
clusterControllerClient.createClusterAsync(request);
// Blocks until there is a response
Cluster response = future.get();
} catch (CancellationException e) {
// Exceeded the timeout without the Operation completing.
// Library is no longer polling for the Operation's status.
}
ערכי ברירת מחדל של LRO
אפשר למצוא את ערכי ברירת המחדל בכיתה StubSettings של כל לקוח. המתודה
initDefaults() מאתחלת את הגדרות ה-LRO בתוך המחלקה המוטמעת
Builder.
לדוגמה, ב-Java-Aiplatform v3.24.0, לקריאת ה-LRO deployModel יש את פרמטרי ברירת המחדל הבאים:
OperationTimedPollAlgorithm.create(
RetrySettings.newBuilder()
.setInitialRetryDelayDuration(Duration.ofMillis(5000L))
.setRetryDelayMultiplier(1.5)
.setMaxRetryDelayDuration(Duration.ofMillis(45000L))
.setTotalTimeoutDuration(Duration.ofMillis(300000L))
.setInitialRpcTimeoutDuration(Duration.ZERO) // not used
.setRpcTimeoutMultiplier(1.0) // not used
.setMaxRpcTimeoutDuration(Duration.ZERO) // not used
.build()));
גם ניסיונות חוזרים וגם LRO משתמשים באותו מחלקה RetrySettings. בטבלה הבאה מוצג המיפוי בין השדות בתוך RetrySettings לבין הפונקציונליות של LRO:
| RetrySettings | תיאור |
|---|---|
| InitialRetryDelay | ההשהיה הראשונית לפני הסקר הראשון. |
| MaxRetryDelay | ההשהיה המקסימלית בין כל סקר. |
| RetryDelayMultiplier | מכפיל להשהיית הניסיון החוזר של הסקר בין סקרים. |
| TotalTimeoutDuration | הזמן המקסימלי המותר לפעולה ארוכת טווח. |
מתי כדאי להגדיר ערכי LRO
תרחיש השימוש העיקרי בהגדרה ידנית של ערכי LRO הוא שינוי תדירויות הסקרים בגלל פסק זמן של LRO. ערכי ברירת המחדל מוגדרים כאומדן על ידי צוות השירות, אבל גורמים מסוימים עלולים לגרום לפסק זמן מדי פעם.
כדי לצמצם את מספר זמני קצוב לתפוגה, צריך להגדיל את ערך זמן קצוב לתפוגה הכולל. הגדלת הערכים האחרים יכולה גם לעזור, וכדאי לבדוק אותם כדי לוודא שההתנהגות תהיה צפויה.
איך מגדירים ערכי LRO
כדי להגדיר את ערכי ה-LRO, יוצרים אובייקט OperationTimedPollAlgorithm ומעדכנים את אלגוריתם התשאול עבור LRO ספציפי. בקטע הקוד הבא נעשה שימוש ב-Java-Dataproc כדוגמה:
ClusterControllerSettings.Builder settingsBuilder = ClusterControllerSettings.newBuilder();
// Create a new OperationTimedPollAlgorithm object
TimedRetryAlgorithm timedRetryAlgorithm = OperationTimedPollAlgorithm.create(
RetrySettings.newBuilder()
.setInitialRetryDelayDuration(Duration.ofMillis(500L))
.setRetryDelayMultiplier(1.5)
.setMaxRetryDelayDuration(Duration.ofMillis(5000L))
.setTotalTimeoutDuration(Duration.ofHours(24L))
.build());
// Set the new polling settings for the specific LRO API
settingsBuilder.createClusterOperationSettings().setPollingAlgorithm(timedRetryAlgorithm);
ClusterControllerClient clusterControllerClient = ClusterControllerClient.create(settingsBuilder.build());
ההגדרה הזו משנה רק את ערכי ה-LRO של ה-RPC createClusterOperation. שאר קריאות ה-RPC בלקוח עדיין משתמשות בערכי ה-LRO שהוגדרו מראש לכל קריאת RPC, אלא אם הן גם שונו.
פסקי זמן של LRO
הספרייה ממשיכה לשלוח בקשות כל עוד לא חלף הזמן הכולל שהוגדר להפסקת הפעולה. אם חלף הזמן הכולל שהוקצב, הספרייה תציג את השגיאה java.util.concurrent.CancellationException עם ההודעה 'המשימה בוטלה'.
CancellationException לא אומר שהמשימה Cloud de Confiance by S3NS
בקצה העורפי בוטלה. החריגה הזו מופעלת מספריית הלקוח כשמשך הזמן הקצוב לתפוגה של קריאה מסוימת חלף ולא התקבלה תשובה. גם אם המשימה תושלם מיד אחרי פסק הזמן, ספריית הלקוח לא תראה את התגובה.