-
Notifications
You must be signed in to change notification settings - Fork 0
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
게임 상태 변경 스케쥴러 구현 및 게임 SSE 로직 구현 #112
Conversation
# Conflicts: # src/main/java/mafia/mafiatogether/game/application/GameService.java # src/main/java/mafia/mafiatogether/game/ui/GameController.java
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생했어
private void sendStatusChangeEventToSseClient(final String code, final StatusType statusType) throws IOException { | ||
List<SseEmitter> emitters = sseEmitterRepository.get(code); | ||
for (SseEmitter emitter : emitters) { | ||
emitter.send(getSseEvent(statusType)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Emitter는 구독하고 있는 유저 각각에게 할당되어있는 개념인건가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
예 맞아요. 각각이 할당되고 있습니다.
|
||
private SseEventBuilder getSseEvent(StatusType statusType) { | ||
return SseEmitter.event() | ||
.name("gameStatus") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이런거는 상수로 관리할 수 있을 것 같아요! 아무래도 실수할 수 있으니까요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@@ -82,6 +88,28 @@ public GameResultResponse findResult(final String code) { | |||
return GameResultResponse.from(game); | |||
} | |||
|
|||
public SseEmitter subscribe(final String code) throws IOException { | |||
SseEmitter sseEmitter = new SseEmitter(43200_000L); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
12시간 유지하는건가??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
예예. 저게 이제 SSE 커넥트 유지 시간인데 저희 유령방 기준이 12시간이어서 맞춰서 넣었습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
12시간동안 메모리에 계속 가지고 있나 했는데, Redis에 넣고 있더라구요 구욷!
@Scheduled(fixedDelay = 500L) | ||
@Transactional | ||
public void changeStatus(){ | ||
for (Game game : gameRepository.findAll()) { | ||
checkStatusChanged(game); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이렇게 자주 game.findAll해도 짜피 메모리 기반이니 괜찮겠죠??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
근데 한 1초 넘어가면 불편한 상황들도 많이 생기긴하겠네요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그래도 900ms까지는 챙겨도 괜찮지 않을까?라고 생각하는데 이건 혹시 어떻게 생각하세요? (그래도 부하를 최대한 줄이는게 나으니), 흠 근데 네트워크 지연시간 생각하면 약간 음수 초로 가는 경우도 생기려나
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
저도 이게 조금 고민이었는데 그래서 조회 안하고 PQ로 그때 말씀드렸던거 해볼려다가 오히려 복잡해지는것 같고 Redis인데 괜춚지 않냐 라고 하길레 일단 이렇게 해보고 추후에 문제가 생길시 고쳐보는게 어떤가 했습니다. 1초는 넘기면 안될꺼같은게 저희 게임이 초단위 게임이라...
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; | ||
|
||
@Repository | ||
public class InMemorySseEmitterRepository implements SseEmitterRepository { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
깔쌈하구만!
* feat : Sse 레포지토리 및 구독 api 구현 * feat : 게임 상태 변경시 SSE 이벤트 발행 * feat : 게임 상태 변경 스케쥴러 구현 및 이벤트 발행 * feat : 전원 투표 완료시 SSE 이벤트 발행 * test : 스케쥴러 테스트 및 방상태 변경시 이벤트 발행 테스트 작성 * feat : 구독시 반환 래퍼 추가 및 구독 이름 변경 * refactor : SSE 연결 메세지 상수화
close #111
우선 SSE 테스트의 경우 너무 외부 의존적이라 테스트 코드 짜기 애매해서 일단 Postman으로 테스트 해보았습니다
/games/subscribe를 통해 구독을 하고
게임상태가 변경시 해당 방 상태를 구독하고 있는 사람들에게 뿌리도록 구현했습니다.
또한 스케쥴러 0.5초를 주기로 계속 돌리면서 상태의 시간이 넘겼는지 체크하고 변할경우 변경하여 저장해주고 있습니다.
테스트의 경우 스케쥴러를 통해 방 상태가 변경되는지 테스트와 방 상태 변경시 이벤트가 발행되는지 테스트하였습니다.