오늘은 재접속 기능이 있으면 좋을 것 같다는 의견이 있어서 제가 담당하여 진행해 보기로 했습니다.
재접속 상황
- 로그인시 redis에 정보가 저장 되어있는지 체크 있으면 게임 정보를 찾아 옵니다.
- 찾아온 유저 정보를 통해 해당 게임 세션이 현재도 실행 중인지 체크합니다.
- 실행 중이면 바로 접속하게 response를 날려 접속을 유도합니다.
- 해당 재접속된 플레이어는(관전 모드)상태로 해당 스테이지에는 죽음 상태로 있습니다. // 게임 상태 체크에 따라 접속 상황이 바뀜
문제 : 여기에 해당 게임 세션이 진행 중인 것을 확인 할 수 있는가? (session 서버 확인해 봐야 할 것 같다)
방안 1
- 또는 방생성할떄 여기 session서버에서 게임 세션 정보도 관리하면 가능해 보인다.
- 방생성 할떄 게임 서버 요청 -> 메인 서버 게임 세션 저장
- 게임 종료시 게임 서버 요청 -> 메인 서버 저장된 게임 세션 삭제
방안 2
- 세션에 대한 정보는 redis에 저장해 두고 있으면 문제는 쉽게 해결되 보인다.
- 방생성 할떄 redis에 게임 id, invitecode, state 저장해 두고
- 게임 종료시 삭제를 게임 서버 자체에서 하면 될 것 같기도 하고
- 그리고 해당 redis에 저장되어 있는 정보를 토대로 해당 게임이 진행되고 있는지 확인하면 될 것 같다.
방안 3
- 새로운 방법 : 클라이언트에서 게임 서버를 연결 할때 게임 서버 세션에서 확인한다.
- 현재 연결방식 방 생성, 방 참가일때 게임 서버와 연결이 된다. 이 방식으로 가면 안되고 로그인이 되거나 또는 따로 게임 서버 연결을 시도를 하고 요청이 있어야 된다.
팀원들과 논의하여 방안 2 방법으로 결정하였습니다.
현재 redis에 저장된 정보
- 유저 정보 : key: userId, value: gameId - hset으로 저장 및 관리
- 게임 정보 : key: gameId, value: inviteCode, state - hset으로 저장 및 관리
진행 상황
- 게임 서버에서 방 생성 요청시 생성된 게임 세션을 redis에 게임 세션 정보 저장
- 로그인 시 redis에 저장된 유정 정보를 조회하여 gameId 조회
- gameId를 통해 redis에서 게임 정보 조회
- 조회된 게임 세션 정보가 있으면 조회된 inviteCode 로그인 패킷 명세에 추가하여 전달
- 조회된 게임 세션 정보가 없으면 로그인 패킷 명세에 inviteCode: ‘none’으로 추가하여 전달 예정
- 클라이언트는 inviteCode가 있으면 게임 서버와 연결 후 바로 해당 게임 세션으로 참여
- 클라이언트는 inviteCode가 없으면 원래대로 진행!
> 이제 재접속 기능 추가시 클라이언트분들과 상의필요!
오늘의 회고
지금 상황이 아직 재접속기능을 추가할 단계는 아닌것 같네요. 다른 여러 버그와 필수로 추가해야될 기능들도 많이 있어서 추후 시간이 있다면 추가될 것 같습니다. 과연... 그래도 나름 설계하는 단계에서 게임의 흐름에 대해 다시 한번 생각해보는 시간이였습니다. 굿오늘도 화이팅!