1. 계속 밀리는 출시일
2월 첫째 주, 정식 출시하기로 한 주가 되었다.
우리 자체 앱은 애플과 구글에서 컨펌이 나서 스토어에서 검색하면 나오고 있었고,
웹서비스도 배포가 완료되어 고객사의 각 지점에서 가입 및 로그인 후 사용할 수 있도록 교육까지 마친 상태였다.
하지만 우리의 주 고객사에서 실제 고객 데이터를 한 번에 못 넘겨주고, 서버 쪽 마이그레이션도 아직 마무리가 되지 않은 상태여서 어쩔 수 없이 정식 출시일이 뒤로 조금 밀리게 되었다.
그렇게 어영부영 출시일이 미뤄지고 우리도 텐션이 조금 떨어져가는 와중에, 갑자기 대표님이 코로나에 걸렸다ㅋㅋ
다행히 직원들은 걸리지 않아서 대표님은 재택근무를 하고, 직원들은 각자 원하는 대로 재택근무를 하거나 사무실에 가서 일을 했고, 걱정이 되는 직원들은 급히 3차 백신도 맞고 하면서 어수선한 한 주가 또 지나갔다.
2. 갑자기 앱스토어 4위를 하다?!
그렇게 진짜 출시일을 2월 3주차 금요일로 정했고, 정식 출시일이 이틀 남은 수요일이었다.
갑자기 대표님이 슬랙(사내 메신저)에, 앱스토어에서 우리 앱이 피트니스 분야 4위를 했다고 캡처를 해서 보내주셨다.
아래 사진은 글쓰고 있는 오늘 기준의 차트인데, 당시에는 교육부 앱은 없었고 나머지들은 거의 비슷한 순위였다.
보기만 해도 어마어마한 앱들이지 않은가?
이 사이에 우리회사 앱이 껴있으니 어안이 벙벙했다. 대표님은 모두 고생했다며 자축했고, 직원들도 놀라서 댓글로 서로 축하하고 이모티콘도 마구 달았다.
그런데 말입니다... 이상하지 않은가? 출시한 지 일주일도 안된, 아직 정식 출시도 안 한 제품이 왜 나이키와 인바디 사이에 들어가 있단 말인가?!
그런 생각이 불현듯 들었던 나는 불안한 마음과 함께, 이 순위의 기준이 무엇인지 댓글로 물어보았다. 노련한 안드로이드 개발자님(개발자 경력 20년+)은, '저 순위는 당일 순위이니 곧 내려갈 것이다. 초치는 건 미안하지만 벌써 너무 신나 하지 말라'는 식의 댓글을 달아주셨다.
그러던 중 저 리스트에서 우리 앱을 보고 다른 투자사에서 연락이 오기도 했다는 대표님의 댓글에 사람들은 다시 기분이 좋아져서 걱정을 잊고 주변 사람들에게 자랑도 하고 기분 좋은 하루를 보냈다.
하지만 그건 어쩌면 복선이었다...!
3. 정식 출시일에 서버 터진 썰 푼다...
아아 아직도 생각하고 싶지 않은 날이다...
그래도 아직 기억이 또렷할 때 기록을 남겨놔야지...
정식출시일 며칠 전 대표님의 코로나 확진으로 인해 급히 백신을 맞았던 나는 계속 몸이 안 좋다가 결국 몸살이 났다. 그래서 정식 출시일에는 재택근무를 하기로 했다. 대표님도 아직 코로나로 격리 중이어서 재택근무 중이었고, 몸이 안 좋은 몇 명을 제외한 나머지는 사무실에서 대기하고 있었다.
우리 앱 중 중요한 기능 중 하나는 회원들이 앱으로 전국 매장의 수업을 예약할 수 있는 기능이다. 이 기능에 대해서는 이미 매장 테스트도 했고, 프론트쪽 버그들도 많이 잡아놓은 상태였기 때문에 큰 문제없을 거라고 생각했다.
우리 고객사는 고객들의 형평성을 위해 전국 매장의 일주일 치 수업을 매주 금요일 한 시에 오픈해서 선착순으로 예약할 수 있도록 만들어 주길 원했다. 그래서 금요일 한 시가 우리 정식 출시일이 된 것이다.
나도 출시 후 혹시라도 문제가 생기면 바로 핫픽스를 하기 위해, 예정된 출시 시간 전에 점심을 빨리 먹어두고 컴퓨터 앞에서 기다리고 있었다.
그렇게 예정 시간인 1시가 되었다.
그리고...
서버가 터졌다...
아래는 당시의 슬랙 상황
대표님 오후 12:55
5분 전입니다. 긴장되네요.
대표님 오후 12:59
갑자기 스케줄 조회 화면에서 무한로딩 시작...?
웹개발자1 오후 1:00
스케줄 새로고침 멈춰..
대표님 오후 1:00
앱도 멈춤
서버개발자1 오후 1:00
RDS cpu 100%입니다.
대표님 오후 1:01
지금 난리 났습니다. 음... 빠른 복구 가능합니까?
서버개발리더 오후 1:01
DB 연결 400 쳤네요
서버개발자2 오후 1:01
한방이네....
대표님 오후 1:01
전화 오네...
서버개발리더 오후 1:02
DB 최대 용량으로 급히 증설합니다.
대표님 오후 1:02
왜 이런 일이 발생했지? 빨리 처리 부탁드려요.
서버개발리더 오후 1:02
10분 죽어 있는 게 나을 듯
처음에는 모두 간단한 문제라고 생각하고 농담까지 할 정도였다.
슬슬 고객사에서 대표님에게 전화가 오기 시작했고, 서버팀에서도 10분 정도면 처리될 문제라고 생각했던 것 같다.
5분이 가까워져도 고쳐지지 않고, 대표님에게도 전화가 엄청 오다 보니 슬랙 대화가 예민해지기 시작했다.
대표님 2월 18일, 오후 1:04
미리 예정한 시간대에 예정된 트래픽인데 왜 문제가 생긴 걸까요? 지금 이제까지 힘겹게 만들어온 신뢰가 한 방에 무너졌는데 왜 이렇게 된 건가요? 빠른 복구 부탁드립니다.
서버개발리더
예정된 트래픽? 그런 게 어딨나요. 예상치보다 많았을 뿐입니다.
한 번도 안 해본 거에 '예정된 트래픽'은 누가 정하나요
대표님
10 분이면 복구 가능한가요?
서버개발리더
봐야죠. 저걸로 대응 가능한지, 더 늘려야 하는지
이런 식의 대화가 조금 이어지다가 여러 가지 대안을 찾기 시작했다.
서버팀에서는 일단 서버를 최대한 증설하고, 대표님은 사과문을 작성하기 시작했다.
그리고 2시까지 정상화 후 다시 예약시스템을 오픈하기로 했다.
그 과정에서도 아래와 같은 날 선 대화가 오갔다.
대표님 오후 1:41
일단 2 시 오픈인데, 지금 서버 총 capacity 어떤가요? 아까대비 어느 정도 수준인지? 아까 몰린 최대치 감당 가능할 수준일까요?
서버개발리더 1:42
일부 기능 제거로 아까보단 확실히 더 적은 tps 가 발생하겠지만.
안받아봐서 몰라요
용량 자체는 최대치로 증설했습니다.
CPU는 vCPU 16개짜리로 올려는 놨어요.
대표님 오후 1:43
확정적으로는 아무도 모르겠지만, 예측을 해야죠.
또 같은 문제 발생하면 문제가 진화가 안 되니
억지로라도 수업 따로 열라고 안내를 해주든
서버개발리더 오후 1:44
예측은 의미가 없고, TPS보다 개별 트랜잭션이 커서 생기는 문제를 근본적으로 보고 처리중이긴 합니다.
대표님 오후 1:47
지금 피해보상 얘기까지 나오고 있습니다. 예측은 의미가 없는 게 아니라, 이런 문제가 발생하지 않기 위한 방안을 도출하고 실행해야죠. 절실하게 문제 발생에 대한 대비가 필요합니다.
그렇게 고객사에 약속한 2시가 되었고...
또...
서버가 터졌다...ㅜㅜ
서버 쪽 문제이다 보니 프론트 개발자로서 도울 수가 없었고,
또 재택근무 중이다 보니 사무실의 상황을 볼 수 없어 답답했다.
대표님과 슬랙으로 설전을 벌이던 서버팀 리더 개발자님도 급한 불을 끄는 게 우선이라 생각했는지 슬랙을 나가버렸다.
그렇게 30분 동안은 대표님의 일방적인 외침만 슬랙에 가득했다.
그 동안 대표님과 서버개발자님 사이에 다툼이 많았지만, 저 날은 대표님의 심정이 많이 이해되었고 정확한 원인과 대책을 얘기하지 않고 그냥 '해봐야 안다, 나도 모른다'는 식으로만 대답하는 서버개발자님이 답답하게 느껴졌다.
나는 친한 앱 개발자에게 실시간으로 사무실 상황을 전해 들으며 (한강 갈 사람들을 모집하고 있다고...),
"그동안 같이 일해서 즐거웠고 결혼하면 청첩장은 보내라" 따위의 자조적인 농담을 하며 안절부절못하고 있었다.
그렇게 40분 정도 지났을 때 앱과 서버 쪽에서 핫픽스를 진행한다는 글이 올라왔다.
그 핫픽스는 '일단 실시간 예약상태 등의 편의 기능을 빼고 주요 기능인 예약만 할 수 있게 하자'는 취지였다.
이 핫픽스를 진행하고 3시 반쯤 다시 오픈을 하고 나니 몇 가지 버그를 빼고는 드디어 예약이 정상적으로 진행되었다.
이 두 시간 반 동안 '서버가 터졌다'라는 말이 얼마나 무서운 일인지 알게 되었다.
예전에 유튜브나 구글 서버가 터졌을 때, 그냥 욕이나 하고 넘어갔던 몇 시간 동안 그 개발자들은 얼마나 토할 것 같은 기분으로 그것을 고쳐냈을지 이제야 상상이 됐다.
그리고 문제 발생 전에 테스트가 얼마나 필요한 것인지, 문제가 발생했을 때의 소통 방식이 얼마나 중요한지 등등...
이번 사건으로 인해 너무 많은 것들을 느꼈고 배운 것 같다.
4. 문제는 무엇이었는가?
일단 물은 엎질러졌다. 이제 어떻게 해야 할까?
일단 엎지른 물은 대충 닦아놨으니, 물을 더 깨끗하게 닦아내고,
물을 다시 채우고, 물을 다시 엎지르지 않기 위해 대책을 마련해야 한다.
일단 서버가 터진 원인을 다시 들여다보자면,
1) 앱의 예약 시스템에서 생각보다 개별 트랜잭션이 컸다는 것
2) 우리 생각보다 전국 사용자가 많았다는 것
3) 이 많은 사용자가 거의 동시에 접속하는 경우에 대해 테스트가 없었던 것
앱스토어 4위 해서 자축한 그날 (금요일에 있을 예약을 위해 전국의 고객들이 슬슬 가입을 시작한 날이었던 것 같다.)
정식 출시 후 실제 사용자가 얼마나 많을지 다시 한 번 실감하고,
우리 서버가 그 모든 인원을 감당할 수 있을지에 대해 한 번 깊게 생각해 봤으면 얼마나 좋았을까 하는 아쉬움이 든다.
아무튼 이렇게 원인을 알게 된 후, 일주일 동안 아래와 같은 조치를 취했다.
1) 앱과 서버 쪽에서 예약 시스템의 부하를 낮추기 위해 쿼리를 수정하고 기능을 일부 수정했다.
2) 서버 인스턴스를 증설하고 금요일에는 유동적으로 높일 수 있도록 시나리오를 수정하고 적용했다.
3) 금요일만 트래픽이 몰리는 문제는 비즈니스 차원에서 풀어나가기 위한 협의 중
+ 고객사에 무한 사과
+ 고객센터(라고 쓰고 화풀이 방이라 읽는) 카톡방 개설되어 대표님, 디자이너, 경리직원 포로로 잡혀 들어 감...
지금은 그렇게 2주가 지났다. 다행히 그 후 서버는 터지지 않았고 서비스도 점점 안정화되고 있다.
이 때를 틈타 고객사에서 추가해달라는 기능이 너무 많아 정리 중이지만, 빨리 기능도 추가해주고 불만 없는 서비스로 만들어서 포로들을 구출해와야지...
힘겹게 개발한 서비스가 출시 첫 날 뻗어버린 것은 너무도 아쉽지만,
아무나 해보지 못한 '출시'라는 것을 해냈고, 문제를 해결하는 과정을 배운 것 같아 값진 경험이었다.
서비스 개발의 처음부터 끝까지를 겪어 본 느낌이면서 한 편으로는 새로 다시 시작하는 기분도 든다.
서버가 뻗어버릴 만큼 우리를 기다리고 있는 고객이 많이 있다고도 생각할 수 있으니까,
더 많이 개선해서 첫 날 고생하신 고객들에게 좋은 서비스로 보답해야겠다!
이제는 조금 더 주인의식과 프로정신을 가지고 일해보자!
화이팅!!
'개발공부일기' 카테고리의 다른 글
스타트업 신입개발자 1년 생존기 (2) - 퇴사 썰 (14) | 2022.09.24 |
---|---|
스타트업 신입개발자 1년 생존기 (1) - 회사의 위기 (0) | 2022.09.09 |
스타트업 신입개발자 생존기 - 송년회와 새해, 번아웃과 무기력증 (3) | 2022.03.01 |
스타트업 신입개발자 반년 생존기 (2) | 2022.03.01 |
스타트업 신입개발자 다섯 달 생존기 (8) | 2021.11.13 |
댓글