From e76537b79afcc5ee24b0ac89b2c61ec7bafa2519 Mon Sep 17 00:00:00 2001 From: leesiyeon Date: Wed, 11 Feb 2026 03:16:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=A0=9C=EB=AF=B8=EB=82=98=EC=9D=B4?= =?UTF-8?q?=20=EC=9E=AC=EC=8B=9C=EB=8F=84=20=EB=B0=B1=EC=98=A4=ED=94=84=20?= =?UTF-8?q?=EA=B0=84=EA=B2=A9=20=EC=A1=B0=EC=A0=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=ED=83=80=EC=9E=84=EC=95=84=EC=9B=83=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../external/genai/client/GeminiClient.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java index 09035e6..25ee384 100644 --- a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java +++ b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java @@ -21,13 +21,13 @@ public class GeminiClient { private final Client genaiClient; private final GeminiProperties geminiProperties; - private static final int MAX_ATTEMPTS = 2; + private static final int MAX_ATTEMPTS = 4; private static final Duration PER_ATTEMPT_TIMEOUT = Duration.ofSeconds(30); // 시도별 제한 - private static final Duration OVERALL_DEADLINE = Duration.ofSeconds(70); // 전체 제한(선택) + private static final Duration OVERALL_DEADLINE = Duration.ofSeconds(240); // 전체 제한(선택) private static final long BASE_BACKOFF_MILLIS = 200; - private static final long MAX_BACKOFF_MILLIS = 2_000; + private static final long MAX_BACKOFF_MILLIS = 90_000; private static final ExecutorService executor = Executors.newFixedThreadPool(4, r -> { @@ -152,11 +152,19 @@ private boolean isRetryable(Throwable t) { } private void sleepBackoff(int attempt, Throwable cause) { - long backoff = Math.min(MAX_BACKOFF_MILLIS, BASE_BACKOFF_MILLIS * (1L << (attempt - 1))); - long jitter = ThreadLocalRandom.current().nextLong(0, 150); + // attempt=1 실패 후 -> 2초, attempt=2 실패 후 -> 4초, attempt=3 -> 8초 ... + long exp = 1L << attempt; // 1=>2, 2=>4, 3=>8 ... + long backoff = BASE_BACKOFF_MILLIS * exp; + + // cap + backoff = Math.min(backoff, MAX_BACKOFF_MILLIS); + + // jitter: 0~10% + long jitter = ThreadLocalRandom.current().nextLong(0, Math.max(1, backoff / 10)); long sleepMillis = backoff + jitter; - log.info("Gemini retry: attempt={} backoff={}ms cause={}", attempt, sleepMillis, cause.toString()); + log.info("Gemini retry: attempt={} backoff={}ms (base={}ms cap={}ms) cause={}", + attempt, sleepMillis, BASE_BACKOFF_MILLIS, MAX_BACKOFF_MILLIS, cause.toString()); try { Thread.sleep(sleepMillis); From cba5adb7458581cfb105ae9e668debf6c3f2f05d Mon Sep 17 00:00:00 2001 From: leesiyeon Date: Wed, 11 Feb 2026 03:23:31 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../valuedi/global/external/genai/client/GeminiClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java index 25ee384..4823bd4 100644 --- a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java +++ b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java @@ -23,8 +23,8 @@ public class GeminiClient { private static final int MAX_ATTEMPTS = 4; - private static final Duration PER_ATTEMPT_TIMEOUT = Duration.ofSeconds(30); // 시도별 제한 - private static final Duration OVERALL_DEADLINE = Duration.ofSeconds(240); // 전체 제한(선택) + private static final Duration PER_ATTEMPT_TIMEOUT = Duration.ofSeconds(30); // 시도별 제한 + private static final Duration OVERALL_DEADLINE = Duration.ofSeconds(240); // 전체 제한 private static final long BASE_BACKOFF_MILLIS = 200; private static final long MAX_BACKOFF_MILLIS = 90_000; From 2a893f840353fd8e248227357e2778a96afae627 Mon Sep 17 00:00:00 2001 From: leesiyeon Date: Wed, 11 Feb 2026 03:30:56 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EC=A0=9C=EB=AF=B8=EB=82=98=EC=9D=B4?= =?UTF-8?q?=20=EC=9E=AC=EC=8B=9C=EB=8F=84=20=EB=B0=B1=EC=98=A4=ED=94=84=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=B3=B4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../valuedi/global/external/genai/client/GeminiClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java index 4823bd4..16e9a41 100644 --- a/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java +++ b/src/main/java/org/umc/valuedi/global/external/genai/client/GeminiClient.java @@ -26,7 +26,7 @@ public class GeminiClient { private static final Duration PER_ATTEMPT_TIMEOUT = Duration.ofSeconds(30); // 시도별 제한 private static final Duration OVERALL_DEADLINE = Duration.ofSeconds(240); // 전체 제한 - private static final long BASE_BACKOFF_MILLIS = 200; + private static final long BASE_BACKOFF_MILLIS = 2_000; private static final long MAX_BACKOFF_MILLIS = 90_000; private static final ExecutorService executor = @@ -153,7 +153,7 @@ private boolean isRetryable(Throwable t) { private void sleepBackoff(int attempt, Throwable cause) { // attempt=1 실패 후 -> 2초, attempt=2 실패 후 -> 4초, attempt=3 -> 8초 ... - long exp = 1L << attempt; // 1=>2, 2=>4, 3=>8 ... + long exp = 1L << (attempt - 1); // 1=>1, 2=>2, 3=>4 ... long backoff = BASE_BACKOFF_MILLIS * exp; // cap