From 31d5e0be0f8d8847e38d76fdad9e1cfa84e69d71 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 8 Jun 2026 20:23:03 +0900 Subject: [PATCH] =?UTF-8?q?docs(agent):=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=9F=AC=20=EB=B6=84=EC=82=B0=20lock=20=EA=B7=9C=EC=B9=99?= =?UTF-8?q?=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/agent-guides/코드스타일.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/agent-guides/코드스타일.md b/docs/agent-guides/코드스타일.md index 900591f0..d2142092 100644 --- a/docs/agent-guides/코드스타일.md +++ b/docs/agent-guides/코드스타일.md @@ -64,6 +64,11 @@ - 비동기 처리는 Kotlin Coroutines 패턴을 따른다. - `CoroutineScope(Dispatchers.IO)` + `launch` + 예외 처리 패턴을 일관되게 유지한다. - 생명주기 종료 시 scope 정리(`@PreDestroy`) 패턴을 참고한다. +- 다중 서버 인스턴스에서 같은 `@Scheduled` 작업이 동시에 실행될 수 있는 스케줄러는 Redisson 기반 분산 lock을 적용해 클러스터 전체에서 한 인스턴스만 작업을 실행하도록 한다. +- 스케줄러 분산 lock은 기존 `RedissonClient` bean을 재사용하고, lock key는 작업 목적이 드러나도록 `lock:{job-name}` 형식으로 고정한다. +- lock 획득 실패는 다른 인스턴스가 처리 중인 정상 skip으로 보고, 작업 본문은 lock을 획득한 경우에만 실행한다. +- lock 해제는 `finally`에서 `lock.isHeldByCurrentThread` 확인 후 `unlock()`한다. +- 스케줄러 작업 시간이 예측 가능하면 무기한 watchdog 의존보다 최악 실행 시간에 여유를 더한 명시적 `leaseTime`을 우선 검토한다. ### 10) 의존성 주입 - 생성자 주입(primary constructor + `private val`)을 기본으로 사용한다.