[HSC-423] user-log publish/admin 전달 비동기 분리 및 executor 계측 분리#277
Conversation
| /** | ||
| * admin log-feature 별도 executor로 분리 | ||
| */ | ||
| @Service |
There was a problem hiding this comment.
🛡️ [위반 규칙]: Infrastructure Layer Registration (Rule 56)
AdminLogFeatureDispatchService는 외부 시스템(AdminLogFeaturesClient)과의 통신을 처리하는 기술적 어댑터 역할을 수행합니다. 저장소 스타일 가이드 규칙 56번에 따라 어댑터 성격의 컴포넌트에는 @Service를 사용하지 않아야 하며, @Configuration 클래스에서 @Bean으로 등록해야 합니다. 또한, 아키텍처 경계를 명확히 하기 위해 해당 클래스를 infrastructure 패키지로 이동하는 것을 권장합니다.
References
- 어댑터에 @component(@service 포함)를 사용하지 않고 @configuration + @bean을 사용해야 함 (link)
| executor.setMaxPoolSize(16); | ||
| executor.setQueueCapacity(512); | ||
| executor.setThreadNamePrefix("admin-log-feature-"); | ||
| executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy()); |
There was a problem hiding this comment.
🛡️ [개선 제안]: Executor Isolation & Reliability
adminLogFeatureTaskExecutor에 CallerRunsPolicy를 적용하면, Admin API 호출 지연 시 호출자 스레드(userLogTaskExecutor)가 직접 작업을 수행하게 되어 격리 효과가 사라집니다. Admin 로그 전송이 비즈니스 핵심 흐름에 지장을 주지 않아야 한다면, 시스템 전체의 안정성을 위해 DiscardPolicy를 적용하여 업스트림 스레드 풀을 보호하는 것이 좋습니다.
| executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy()); | |
| executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.DiscardPolicy()); |
🧪 Test Coverage Report (JaCoCo)
Package line spark (sample): 📦 Package coverage (worst 10)
🧨 Lowest coverage classes (worst 10)
🧩 Changed files coverage breakdown (4 files)
🔎 HTML 리포트: Actions → Artifacts → |
📝작업 내용
Burst 테스트에서
acceptedRate = 1임에도 실제 DB 반영 유실과userLogTaskExecutor포화가 반복적으로 관찰됐다.이번 변경은 request path에서 Kafka publish와 admin internal 전달이 같은 executor를 공유하던 구조를 분리하고, 각 executor를 Grafana에서 따로 관측할 수 있도록 만드는 작업이다.
변경 요약
adminLogFeatureTaskExecutor신규 추가admin-log-featureexecutor metric 추가UserLogService에서 직접 HTTP 호출하던 구조를 dispatch service 위임으로 변경대상 파일
src/main/java/site/holliverse/customer/application/usecase/log/AdminLogFeatureDispatchService.javasrc/main/java/site/holliverse/customer/application/usecase/log/UserLogService.javasrc/main/java/site/holliverse/shared/config/runtime/CustomerRuntimeInfraConfiguration.javaadminLogFeatureTaskExecutorbean 추가src/main/java/site/holliverse/shared/monitoring/CustomerMonitoringBinder.javaexecutor="admin-log-feature"metric 바인딩 추가변경 전/후 구조
flowchart LR A["UserLogService"] --> B["userLogTaskExecutor"] B --> C["Kafka publish"] B --> D["Admin internal HTTP"] style B fill:#fbeeee,stroke:#c76262flowchart LR A["UserLogService"] --> B["userLogTaskExecutor"] A --> E["AdminLogFeatureDispatchService"] B --> C["Kafka publish"] E --> F["adminLogFeatureTaskExecutor"] F --> D["Admin internal HTTP"] style B fill:#eef8ef,stroke:#5a9c67 style F fill:#eef4ff,stroke:#5b80b7🎫 Jira Ticket
#️⃣관련 이슈