항해99/개발일지

20220331 개발일지 #배포!!!!

paran21 2022. 4. 3. 23:14

드디어 배포했다!!

원래 30일에 배포하려고 했는데, 마지막에 테스트하다가 에러를 발견해서 수정 후 31일 새벽 1시쯤에 다시 배포하고 슬렉에 홍보글을 올렸다.

 

정말정말 놀란게, 새벽임에도 불구하고 엄청나게 많은 분들이 접속해주셨다!!!

spring서버는 EC2에서 CPU를 확인했을 때 90%까지 올라갔었고, DB에서 유저 수도 계속 20여명을 유지했다.

DB에 유저수는 방을 만들거나 참여한 순간에 생성이 되서 실제 메인페이지에 접속한 수는 구글 애널리틱스를 참고할 때 40명이 넘었던 것 같다(해당 시간 피크가 60명 정도?!)

 

그리고 오류제보와 만족도 조사도 정말 우르르 들어왔는데 ㅋㅋㅋㅋㅋ 퀴즈를 안풀었는데 스코어가 올라가거나 찬스가 무한으로 사용되는 경우(찬스가 -1이 안되서), 다른 방과 보이스 채팅이 연결되는 경우ㅋㅋㅋㅋ와 같은 정말이지 심각한 에러도 다수 제보가 되었다.

 

우선 새벽 3시가 넘어가면서 유저수가 줄어들어서 서버 CPU부터 해결하기로 했다.

 

현재 우리 spring 서버는 메모리 이슈가 있어서 swap으로 메모리를 1 → 3GB로 늘려놓은 상태였고 CPU가 90%를 찍을때도 메모리는 괜찮았다.

그래서 우선 급하게 CPU 문제를 해결해야 할 것 같아서 CPU가 2개인 EC2 서버로 인스턴스 유형을 바꿔주었다.

교체 후에 CPU 사용률이 확실히 떨어지는 것을 확인했다.

 

그리고 NodeJS 서버에서 드물게 확인되는 오류가 있었는데 그 원인을 드디어 찾았다!!!

게임이 종료되면 spring에서 해당 방의 user 정보를 모두 삭제하는데

node에서는 방장이 나갔을 때 방장을 변경하기 위해 해당 방의 유저를 불러와서 선언해주는 부분이 있었다.

이미 유저가 삭제된 후라서 undefined이므로 에러가 발생하는 것이었다!

항상 뜨는 에러가 아니라서 프론트에서 재배포하면서 peer를 잃어버려서 뜨는 건가 했는데,

그게 아니라 방장이 먼저 나갔을 때만 발생해서 드물게 확인되었던 거였다!!

 

이 에러가 정말 중요했던 것은, 에러가 발생하면 PM2가 node 서버를 재시작하는데 이 때 가지고 있던 roomID를 모두 날리면서 소켓 쪽 에러가 모두 발생했던 것 같기 때문이다.

변수 선언 전에 undefined가 들어와도 에러가 발생하지 않도록 처리를 해주고 나니 더 이상 해당 에러가 발생하지 않았다.

그리고 방이 제대로 구분되지 않았던 에러들(스코어, 찬스, 보이스채팅 방)도 추가로 확인되지 않았다!

if (!rows[0]?.user_id) return;
let newCreatedUser = rows[0].user_id;

 

또, 여러 명이 퀴즈창을 띄워놓은 상태에서 한 명이 문제를 풀면 해당 문제가 바로 "이미 푼 문제"로 바꾸기 위해 소켓 이벤트로 해당 퀴즈 타입을 받아서 전달해주는 부분을 추가했다.

방에서 누군가 문제를 풀면 spring쪽에서 api요청을 통해 pass한 문제로 바꿔주었고, 이후에는 해당 문제를 클릭하면 "이미 푼 문제"로 표시되게 처리는 해놨었는데, 이미 창을 띄운 상태에서는 처리가 안되어 있는 상태였다.

 

프로젝트 수행하면서 HTTP 통신과 socket 통신의 차이를 계속 느꼈고, 게임 같이 실시간으로 처리해야 하는 문제는 socket 통신으로 해결하는 게 더 나은 경우가 많은 것 같다.

 

배포하고 한 12시간 동안은 잠도 거의 못자고 에러만 계속 해결했던 것 같다.

그래도 초반에 큰 에러들은 거의 잡아서 오후부터는 그래도 서비스가 안정적으로 돌아가는 걸 확인할 수 있었다!

 

UI/UX 관련 피드백들은 계속 확인하면서 프론트에서 추가로 처리를 계속 해주었고 저녁에 항해 슬렉을 제외한 곳에 추가로 홍보글을 올렸다!!

(자바 관련 카페에 홍보글을 올렸는데 강퇴당했다... ㅜㅜ 광고 금지 공지도 없었던 것 같고 다른 항해 팀 프로젝트 글도 봤는데 왜 강퇴된건지 모르겠다 ㅜㅜ)

 

배포 후에 이렇게 접속자가 많을 줄 몰랐는데 너무 뿌듯하다.

단기간 진행하면서 분명 부족한 점도 많지만 게임을 끝까지 할 수 있도록 한 스코프를 끝낸게 너무 좋다.

 

에러 수정하면서 엄청 정신이 없었지만 배포하지 못했다면 생각하지 못했을 부분들이 정말 많았다.

특히 프론트 UI/UX에서 직접적으로 피드백 받은 부분이 많긴 했지만, 서버 측면에서는 계속 말로만 듣던 '부하'가 무엇인지 직접 겪어본 느낌? ㅋㅋㅋ

CPU가 90% 정도로 올라가면서 정말 느려지는 걸 체감하기도 했고 서버가 터진다는게 어떤건지 알 것 같았다.(진짜 조금만 더 들어왔으면 터지지 않았을까...?)