1212import org .springframework .stereotype .Service ;
1313
1414import java .util .List ;
15+ import java .util .concurrent .CompletableFuture ;
16+ import java .util .concurrent .Executor ;
1517import java .util .stream .Collectors ;
1618
1719/**
@@ -29,16 +31,13 @@ public class AggregatedMonitoringScheduler {
2931 private final DataCenterMonitoringService dataCenterMonitoringService ;
3032 private final SseService sseService ;
3133 private final AlertEvaluationService alertEvaluationService ;
34+ private final Executor taskExecutor ;
3235
33- /**
34- * 서버실 통계 갱신 스케줄러
35- * ✅ DB에서 활성 서버실을 동적으로 조회하여 처리
36- */
37- @ Scheduled (fixedDelayString = "${monitoring.scheduler.statistics-interval:5000}" )
36+ @ Scheduled (fixedRateString = "${monitoring.scheduler.statistics-interval:5000}" )
3837 public void updateServerRoomStatistics () {
3938 log .debug ("=== ServerRoom 통합 모니터링 시작 ===" );
39+ long totalStartTime = System .currentTimeMillis ();
4040
41- // ✅ DB에서 활성 서버실 목록 동적 조회
4241 List <Long > serverRoomIds = serverRoomRepository .findAllByDelYn (DelYN .N )
4342 .stream ()
4443 .map (serverRoom -> serverRoom .getId ())
@@ -49,40 +48,41 @@ public void updateServerRoomStatistics() {
4948 return ;
5049 }
5150
52- log .debug ("처리 대상 서버실: {} (총 {}개)" , serverRoomIds , serverRoomIds .size ());
53-
54- int successCount = 0 ;
55- int failCount = 0 ;
56-
57- for (Long serverRoomId : serverRoomIds ) {
58- try {
59- ServerRoomStatisticsDto statistics = serverRoomMonitoringService
60- .calculateServerRoomStatistics (serverRoomId );
61-
62- sseService .sendToServerRoom (serverRoomId , "serverroom-statistics" , statistics );
63-
64- // ✅ 알림 평가 호출
65- alertEvaluationService .evaluateServerRoomStatistics (statistics );
51+ // ✅ 병렬 처리
52+ List <CompletableFuture <Void >> futures = serverRoomIds .stream ()
53+ .map (serverRoomId -> CompletableFuture .runAsync (() -> {
54+ long startTime = System .currentTimeMillis ();
55+ try {
56+ ServerRoomStatisticsDto statistics = serverRoomMonitoringService
57+ .calculateServerRoomStatistics (serverRoomId );
58+
59+ sseService .sendToServerRoom (serverRoomId , "serverroom-statistics" , statistics );
60+ alertEvaluationService .evaluateServerRoomStatistics (statistics );
61+
62+ long duration = System .currentTimeMillis () - startTime ;
63+ if (duration > 3000 ) {
64+ log .warn ("⚠️ ServerRoom {} 통계 계산 느림: {}ms" , serverRoomId , duration );
65+ }
66+ } catch (Exception e ) {
67+ log .error ("❌ ServerRoom {} 통합 모니터링 실패: {}" , serverRoomId , e .getMessage ());
68+ }
69+ }, taskExecutor ))
70+ .collect (Collectors .toList ());
6671
67- successCount ++;
68- } catch (Exception e ) {
69- log .error ("ServerRoom {} 통합 모니터링 실패: {}" , serverRoomId , e .getMessage ());
70- failCount ++;
71- }
72- }
72+ // 모든 작업 완료 대기
73+ CompletableFuture .allOf (futures .toArray (new CompletableFuture [0 ])).join ();
7374
74- log .debug ("ServerRoom 통합 모니터링 완료 - 성공: {}, 실패: {}" , successCount , failCount );
75+ long totalDuration = System .currentTimeMillis () - totalStartTime ;
76+ log .info ("📊 ServerRoom 통합 모니터링 완료 - 총 소요시간: {}ms" , totalDuration );
7577 }
76-
7778 /**
7879 * 데이터센터 통계 갱신 스케줄러
79- * ✅ DB에서 활성 데이터센터를 동적으로 조회하여 처리
80+ * ✅ fixedRate로 변경: 정확히 5초마다 실행
8081 */
81- @ Scheduled (fixedDelayString = "${monitoring.scheduler.datacenter-interval:5000}" )
82+ @ Scheduled (fixedRateString = "${monitoring.scheduler.datacenter-interval:5000}" )
8283 public void updateDataCenterStatistics () {
8384 log .debug ("=== DataCenter 통합 모니터링 시작 ===" );
8485
85- // ✅ DB에서 활성 데이터센터 목록 동적 조회
8686 List <Long > dataCenterIds = dataCenterRepository .findAllByDelYn (DelYN .N )
8787 .stream ()
8888 .map (dataCenter -> dataCenter .getId ())
@@ -104,8 +104,6 @@ public void updateDataCenterStatistics() {
104104 .calculateDataCenterStatistics (dataCenterId );
105105
106106 sseService .sendToDataCenter (dataCenterId , "datacenter-statistics" , statistics );
107-
108- // ✅ 알림 평가 호출
109107 alertEvaluationService .evaluateDataCenterStatistics (statistics );
110108
111109 successCount ++;
0 commit comments