1. 문제
- 대시보드를 구현하면서 너무 많은 응답을 받습니다.
2. 원인
- Publish/Subscribe 패턴을 사용합니다.
- Subscribe를 구분하지 못하여 응답을 지속적으로 보냈습니다.
3. 해결방법
- Subscribe를 구분할 수 있도록 합니다.
4. 코드
@GetMapping("/dashboard")
public Flux<ServerSentEvent<DashboardResponseDto>> dashboard(HttpServletRequest request) {
return dashboardService.publish(request);
}
public Flux<ServerSentEvent<DashboardResponseDto>> publish(HttpServletRequest request) {
return Flux.interval(Duration.ofSeconds(refreshTime))
.map(sequence -> ServerSentEvent.<DashboardResponseDto>builder()
.id(request.getHeader("X-FORWARDED-FOR"))
.event("dashboard")
.data(DashboardResponseDto.builder()
.todayUser(dashboardRedisService.getDashboard().getTodayUser())
.totalUser(dashboardRedisService.getDashboard().getTotalUser())
.updatedAt(Timestamp.valueOf(LocalDateTime.now(ZoneId.of("Asia/Seoul")).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))))
.aiList(aiPageService.aiListPage().toResponse())
.build())
.retry(Duration.ofSeconds(refreshTime))
.build());
}