ניהול מחזורי חיים של לקוחות בספריות לקוח של Cloud Java

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

בדוגמה הבאה, שמתבססת על Java-KMS, מוצג קטע קוד שבו מופעלות כמה בקשות עם אותו מופע של לקוח:

// Create one instance of KMS's KeyManagementServiceClient
KeyManagementServiceClient keyManagementServiceClient =
 KeyManagementServiceClient.create();
keyManagementServiceClient.listKeyRings();
keyManagementServiceClient.asymmetricSign();
keyManagementServiceClient.createCryptoKey();
// ... other code ...

// Create one instance of KMS's AutokeyClient
AutokeyClient autokeyClient = AutokeyClient.create();
autokeyClient.listKeyHandles();
autokeyClient.getKeyHandle();

סגירת לקוח

הדרך שבה מנהלים את מחזור החיים של לקוח תלויה בתרחיש לדוגמה ובספריית הלקוח הספציפית. לדוגמה, אם אתם משתמשים במסגרת, אתם צריכים לפעול לפי ההנחיות של המסגרת לניהול לקוחות. במקרים מסוימים אפשר להשתמש ב-try-with-resources עבור לקוחות עם משך חיים קצר יותר, אבל בדרך כלל מומלץ לעשות שימוש חוזר במופע של לקוח עם משך חיים ארוך יותר כדי לשפר את היעילות.

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

בדוגמה הבאה נעשה שימוש ב-Java-KMS ומוצג סגירת הלקוח:

KeyManagementServiceClient keyManagementServiceClient =
  KeyManagementServiceClient.create(keyManagementServiceSettings);
// ... other code ...
keyManagementServiceClient.close();

// For gRPC clients, it's recommended to call awaitTermination to ensure a
// graceful shutdown and avoid the following error message in the logs:
// ERROR i.g.i.ManagedChannelOrphanWrapper - *~*~*~ Channel ManagedChannelImpl
// was not shutdown properly!!! ~*~*~*
// java.lang.RuntimeException: ManagedChannel allocation site
// at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.<init>
keyManagementServiceClient.awaitTermination(DURATION, TimeUnit.SECONDS);

// Optionally include a shutdownNow() call after awaitTermination() to force
// close any lingering resources
keyManagementServiceClient.shutdownNow();

בנוסף ל-close(), חלק מספריות הלקוח של Java חושפות כמה שיטות קשורות לניהול מחזור החיים של הלקוח:

  • shutdown(): שווה ערך ל-close().
  • shutdownNow(): מפעיל את תהליך הכיבוי באופן מיידי. מפסיק את כל המשימות הפעילות ולא ממתין לסיום המשימה.
  • isShutdown(): מחזירה true אם המשימות ברקע הושבתו.
  • isTerminated(): מחזירה true אם כל המשימות הושלמו אחרי הכיבוי.
  • awaitTermination(): חסימה למשך זמן מסוים עד לסיום כל העבודה לאחר כיבוי.

מקרים של כמה לקוחות

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

סיכונים פוטנציאליים בחשבונות מרובי לקוחות

יש כמה סיכונים נפוצים באפליקציות שמשתמשות בכמה מופעים של ספריית לקוח:

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