Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 핀으로 등록한 과목의 여석 정보가 SSE로 전달되는 속도가 일정은 문제 해결 #72

Merged
merged 3 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 3 additions & 11 deletions src/main/java/kr/allcll/seatfinder/seat/SeatService.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
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 = 2000;
private static final int NON_MAJOR_SUBJECT_QUERY_LIMIT = 20;
private static final int TASK_DURATION = 1000;
private static final int TASK_PERIOD = 60000;

private final SseService sseService;
Expand All @@ -48,20 +48,12 @@ public void sendPinSeatsInformation(String token) {
}

Runnable task = () -> {
long start = System.currentTimeMillis();
List<Pin> pins = pinRepository.findAllByToken(token);
log.info("token: {}ms - {}: 핀 조회 결과 {}개 조회", System.currentTimeMillis() - start, token, pins.size());
start = System.currentTimeMillis();
List<Subject> subjects = pins.stream()
.map(Pin::getSubject)
.toList();
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());
start = System.currentTimeMillis();
sseService.propagate(PIN_EVENT_NAME, PinSeatsResponse.from(pinSeats));
log.info("token: {}ms - {}: SSE 전송 완료", System.currentTimeMillis() - start, token);
sseService.propagate(token, PIN_EVENT_NAME, PinSeatsResponse.from(pinSeats));
};

ScheduledFuture<?> scheduledFuture = scheduler.scheduleAtFixedRate(task, Duration.ofMillis(TASK_DURATION));
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/kr/allcll/seatfinder/sse/SseApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ public class SseApi {
@GetMapping(value = "/api/connect", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public ResponseEntity<SseEmitter> getServerSentEventConnection() {
String token = ThreadLocalHolder.SHARED_TOKEN.get();
seatService.sendPinSeatsInformation(token);
SseEmitter emitter = sseService.connect(token);
seatService.sendPinSeatsInformation(token);
return ResponseEntity.ok()
.header("X-Accel-Buffering", "no")
.body(emitter);
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/kr/allcll/seatfinder/sse/SseEmitterStorage.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -43,6 +44,11 @@ public List<SseEmitter> getEmitters() {
return emitters.values().stream().toList();
}

public Optional<SseEmitter> getEmitter(String token) {
SseEmitter emitter = emitters.get(token);
return Optional.ofNullable(emitter);
}

public List<String> getUserTokens() {
return emitters.keySet().stream().toList();
}
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/kr/allcll/seatfinder/sse/SseService.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,13 @@ public void propagate(String eventName, Object data) {
});
}

public void propagate(String token, String eventName, Object data) {
sseEmitterStorage.getEmitter(token).ifPresent(emitter -> {
SseEventBuilder eventBuilder = SseEventBuilderFactory.create(eventName, data);
sendEvent(emitter, eventBuilder);
});
}

private void sendEvent(SseEmitter sseEmitter, SseEventBuilder eventBuilder) {
try {
sseEmitter.send(eventBuilder);
Expand Down