פתרון בעיות שקשורות לזמן אחזור בספריית הלקוח של Java

מבוא

אם באפליקציה יש זמן אחזור גבוה מהרגיל, תפוקה נמוכה או פסק זמן עם לקוח Java Datastore, יכול להיות שהבעיה נובעת מהגדרת gRPC בצד הלקוח ולא מהקצה העורפי של Firestore/Datastore. המדריך הזה יעזור לכם לאבחן ולפתור בעיות נפוצות שקשורות להגבלת קצב העברת הנתונים בצד הלקוח, להגדרות לא תקינות של מאגר הערוצים ולשינויים תכופים מדי בערוצים.

אבחון

כשמשתמשים בלקוחות Java, חשוב להפעיל רישום מפורט של gRPC ו-gax-java כדי לעקוב אחרי הדינמיקה של מאגר הערוצים, לאבחן הגבלת קצב, לפתור בעיות בשימוש חוזר בחיבורים או לזהות תחלופה מוגזמת של ערוצים.

הפעלת רישום ביומן ללקוחות Java

כדי להפעיל רישום מפורט ביומן, משנים את הקובץ logging.properties באופן הבא:

## This tracks the lifecycle events of each grpc channel 
io.grpc.ChannelLogger.level=FINEST
## Tracks channel pool events(resizing, shrinking) from GAX level
com.google.api.gax.grpc.ChannelPool.level=FINEST

בנוסף, צריך לעדכן את רמת רישום הפלט ביומן בקובץ logging.properties כדי לתעד את היומנים האלה:


# This could be changed to a file or other log output
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

שימוש בתצורה

אפשר להחיל קובץ logging.properties באחת משתי דרכים:

1. דרך מאפיין מערכת של JVM

מוסיפים את הארגומנט הזה כשמפעילים את אפליקציית Java:

-Djava.util.logging.config.file=/path/to/logging.properties

2. טעינה באמצעות תוכנה

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

LogManager logManager = LogManager.getLogManager();
  try (final InputStream is = Main.class.getResourceAsStream("/logging.properties")) {
logManager.readConfiguration(is);
}

דוגמה לרישום ביומן

אחרי שמפעילים רישום מפורט ביומן, מוצגות הודעות משולבות מ-com.google.api.gax.grpc.ChannelPool ומ-io.grpc.ChannelLogger:

ערוצים שהוקצו להם פחות מדי משאבים, מה שהוביל להרחבת מאגר הערוצים:

09:15:30.123 [pool-1-thread-1] DEBUG com.google.api.gax.grpc.ChannelPool - Detected throughput peak of 40, expanding channel pool size: 4 -> 6. 
09:15:30.124 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.ChannelLogger - [Channel<5>: (datastore.googleapis.com:443)] Entering IDLE state 
09:15:30.124 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.ChannelLogger - [Channel<6>: (datastore.googleapis.com:443)] Entering IDLE state 
09:15:30.125 [grpc-nio-worker-ELG-1-5] TRACE io.grpc.ChannelLogger - [Channel<5>: (datastore.googleapis.com:443)] newCall() called 
09:15:30.126 [grpc-nio-worker-ELG-1-5] DEBUG io.grpc.