Skip to content

Commit

Permalink
fix: 1초에 많은 sse 요청이 나가는 문제 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
3Juhwan committed Feb 12, 2025
1 parent 410b546 commit 2f59f4a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class ScheduleConfig {
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setThreadNamePrefix("pin-subjects-sent-scheduler");
scheduler.setPoolSize(4);
scheduler.setPoolSize(20);
scheduler.setAwaitTerminationSeconds(15);
scheduler.setRemoveOnCancelPolicy(true);
scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
Expand Down
19 changes: 16 additions & 3 deletions src/main/java/kr/allcll/seatfinder/seat/SeatService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.time.Duration;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import kr.allcll.seatfinder.pin.Pin;
import kr.allcll.seatfinder.pin.PinRepository;
Expand All @@ -24,13 +26,14 @@ public class SeatService {
private static final String NON_MAJOR_SEATS_EVENT_NAME = "nonMajorSeats";
private static final int NON_MAJOR_SUBJECT_QUERY_LIMIT = 20;
private static final String PIN_EVENT_NAME = "pinSeats";
private static final int TASK_DURATION = 1000;
private static final int TASK_DURATION = 2000;
private static final int TASK_PERIOD = 60000;

private final SseService sseService;
private final SeatStorage seatStorage;
private final PinRepository pinRepository;
private final ThreadPoolTaskScheduler scheduler;
private final Map<String, ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();

@Scheduled(fixedRate = 1000)
public void sendNonMajorSeats() {
Expand All @@ -39,6 +42,11 @@ public void sendNonMajorSeats() {
}

public void sendPinSeatsInformation(String token) {
if (scheduledTasks.containsKey(token)) {
log.info("토큰 {} 에 대해 이미 스케줄된 작업이 존재합니다.", token);
return;
}

Runnable task = () -> {
long start = System.currentTimeMillis();
List<Pin> pins = pinRepository.findAllByToken(token);
Expand All @@ -50,16 +58,21 @@ public void sendPinSeatsInformation(String token) {
log.info("token: {}ms - {}: 과목 조회 결과 {}개 조회", System.currentTimeMillis() - start, token, subjects.size());
start = System.currentTimeMillis();
List<Seat> pinSeats = seatStorage.getSeats(subjects);
log.info("token: {}ms - {}: 여셕 조회 결과 {}개 조회", System.currentTimeMillis() - start, token, pinSeats.size());
log.info("token: {}ms - {}: 좌석 조회 결과 {}개 조회", System.currentTimeMillis() - start, token, pinSeats.size());
start = System.currentTimeMillis();
sseService.propagate(PIN_EVENT_NAME, PinSeatsResponse.from(pinSeats));
log.info("token: {}ms - {}: SSE 전송 완료", System.currentTimeMillis() - start, token);
};

ScheduledFuture<?> scheduledFuture = scheduler.scheduleAtFixedRate(task, Duration.ofMillis(TASK_DURATION));
scheduledTasks.put(token, scheduledFuture);

scheduler.schedule(() -> {
log.info("token: {}: 태스크 종료", token);
log.info("토큰 {}: 태스크 종료", token);
scheduledFuture.cancel(true);
scheduledTasks.remove(token);
},
new Date(System.currentTimeMillis() + TASK_PERIOD));
}

}

0 comments on commit 2f59f4a

Please sign in to comment.