728x90
조건
- 매칭은 Queue (First in First Out) 구조로 이루어 져야 한다.
- 유저가 접속하면 유저의 매칭취소 / 이탈을 감지 해야 한다.
- 매칭은 게임과 인원수를 알고 있어야 한다.
- 매칭이 완료되면 Discord url을 각 유저들 에게 뿌린다
세션 감지 = Websocket / 대기열 = Redis
Problem
I/O 접근이 많고 최종으로 매칭이 된 결과만 영구적으로 저장 ( 매칭 실패시 저장 x )
사람들을 매칭시켜줄 때마다 매칭할 사람들의 db가 저장 되어있어야 한다. ( 속도와 데이터의 무결성 중요)
지속적인 요청에 트래픽에 따라 데이터의 무결성과 속도가 보장 되어야 한다.
그에 따라 다른 기능들에 문제가 발생되지 않아야하고, 접근이 많아 기능에 문제가 발생 됐을경우
다른 기능에 문제를 일으키면 안된다
Redis 사용이유
싱글스레드로 작동하는 Redis 를 활용하여 데이터의 무결성을 보장하고 외부에 서버를 따로 두어,
다른 기능들에 대한 안정성을 보장했습니다. 또한 많은 트래픽에 대비해 RDB를 사용한 네트워크 자원비용에 대한 문제를 해결하고 초당 5~60,000 속도로 처리속도의 안정성도 해결 하였고,
로그아웃과 다른 기능들에 확장성이 열려 있어서 선택하게 되었습니다.
Controller
- RequestBody 프론트에서 필요한 정보를 받아와 유저 객체를 만들어 준다.
Service
- 컨트롤러에 만든 유저객체를 레디스 List 형태로 넣어준다.
Redis Service
- 레디스에 객체를 넣어줄때는 오브젝트 맵퍼를 사용하여 Json객체를 넣어준다.
- 매칭서비스는 Queue형태이기 때문에 Redis의 list 를 하용하여 push 해준다
- 꺼내올때도 마찬가지로 readValue를 사용하여 json의 형태를 객체로 변환해서 가져온다.
- 꺼내올때는 RightPop을 이용하여 객체를 FiFo 들어간 수서대로 꺼내주도록 한다.
위에 웹소켓으로 사용한 부분을
kafka의 pub/ sub으로 구현을 하고 싶었는데 실력이 부족했다 ㅠㅠ 더 열심히 공부 해봐야겠다 .
728x90
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[JAVA] TDD / Testcode (0) | 2023.05.07 |
---|---|
[Spring] JDA(Java Discord Api)를 이용한 자동 방 생성 (0) | 2023.03.09 |
[Spring] Lock / DeferredResult를 활용한 대기열 처리 (0) | 2023.03.09 |
[Spring] 트랜잭션 @transational 어노테이션 (0) | 2023.03.03 |
[Spring] Custom Query 사용 전 ! (0) | 2023.01.27 |