diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d9fd2e..f5c89d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ ## 2026-06-15 +### ๐Ÿ› WebSearchService HTTP timeout ์ถ”๊ฐ€ (v0.1.49) +- ๋ฒŒํฌ ๋ฐฑํ•„ ์ค‘ ํŠน์ • ๊ฒ€์ƒ‰์—์„œ ๋ฌดํ•œ hang โ†’ backend executor virtual thread ์ ์œ ๋กœ ํ›„์† ์ž‘์—… ์ค‘๋‹จ (90๊ฑด ์ฒ˜๋ฆฌ ํ›„ ๋ฉˆ์ถค) +- connectTimeout=5s + request timeout=15s (Naver/DDG ๋‘˜ ๋‹ค) +- ํ•ด๋‹น ์‹๋‹น์€ HttpTimeoutException โ†’ notfound๋กœ ์•ˆ์ „ ์ฒ˜๋ฆฌ + ### โฑ๏ธ bulk-tabling/catchtable SSE timeout 10๋ถ„ โ†’ 3์‹œ๊ฐ„ (v0.1.48) - ๋Œ€๋Ÿ‰ ๋ฐฑํ•„(724๊ฑด โ‰ˆ 100๋ถ„) ์‹œ 10๋ถ„ SSE timeout์œผ๋กœ ์ค‘๊ฐ„ ๋Š๊น€ โ†’ 3์‹œ๊ฐ„์œผ๋กœ ํ™•์žฅ - ๋ฐฑ์—”๋“œ ์ž‘์—…์€ virtual thread๋กœ ๋ณ„๋„ ์ง„ํ–‰๋์ง€๋งŒ emit() ์˜ˆ์™ธ๋กœ ๋งˆ์ง€๋ง‰ cache.flush + complete ๋ˆ„๋ฝ์ด์Šˆ ํ•ด์†Œ diff --git a/backend-java/src/main/java/com/tasteby/service/WebSearchService.java b/backend-java/src/main/java/com/tasteby/service/WebSearchService.java index dfb178d..1d3e43f 100644 --- a/backend-java/src/main/java/com/tasteby/service/WebSearchService.java +++ b/backend-java/src/main/java/com/tasteby/service/WebSearchService.java @@ -14,6 +14,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -30,8 +31,10 @@ public class WebSearchService { private static final Logger log = LoggerFactory.getLogger(WebSearchService.class); private static final int MAX_RESULTS = 5; + private static final Duration REQ_TIMEOUT = Duration.ofSeconds(15); private static final HttpClient HTTP = HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.NORMAL) + .connectTimeout(Duration.ofSeconds(5)) .build(); private static final Pattern DDG_RESULT = Pattern.compile( @@ -74,6 +77,7 @@ public class WebSearchService { String url = "https://openapi.naver.com/v1/search/webkr.json?query=" + encoded + "&display=30"; HttpRequest req = HttpRequest.newBuilder() .uri(URI.create(url)) + .timeout(REQ_TIMEOUT) .header("X-Naver-Client-Id", naverClientId) .header("X-Naver-Client-Secret", naverClientSecret) .GET() @@ -104,6 +108,7 @@ public class WebSearchService { String url = "https://html.duckduckgo.com/html/?q=" + encoded; HttpRequest req = HttpRequest.newBuilder() .uri(URI.create(url)) + .timeout(REQ_TIMEOUT) .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36") .header("Accept", "text/html,application/xhtml+xml") .header("Accept-Language", "ko-KR,ko;q=0.9")