회의에서 앞으로 개발할 서비스들은 MSA 방식으로 구축하기로 결정했다. 그리고 추가되는 서비스 중 하나를 내가 처음부터 맡아서 작업하게 되었다. 별로 어려운 작업이 아니었고, 인프라 구축은 나의 사수2가 해준 덕에 필요한 기능들은 금방 구현했다. (물론 코드가 깔끔하게 되어있지는 않다)
내가 만든 A 서비스의 API가 Production 까지 배포되었고 다른 서비스들에서 API를 호출하여 사용하게 되었다. 처음 B 서비스에서만 API를 호출해서 사용할 때는 큰 문제가 없었는데 C 서비스도 A 서비스의 API를 호출해서 사용하기 시작하면서 갑자기 API 호출이 터지기 시작했다. 이때 멘붕이 왔다. (Gateway time-out이 발생했고 api를 호출했을때 pending 상태로 멈춰 있었다.)
분명 DB 쿼리도 1초 안으로 다 나오는지 확인하였고, API도 예외처리를 꼼꼼히 해서 dev랑 stage에서 문제가 없었는데 production에서 API가 동작하지 않는 것이었다. 일단 급한대로 실장님이 scaling으로 대응해주었고 구체적인 원인파악을 진행하였다. (돈으로 급하게 대응했다고 볼 수 있다^^;)
원인은 다음과 같았다.
1. 테스트할때는 모든 쿼리가 1초 안으로 나왔는데, aws 에서 조회했을 때 slow query가 남아있었다.
2. API Response size가 너무 컸다.
3. 개발 편의성을 성능보다 우선시 했다.
그리고 다음과 같은 방법으로 해결하였다.
1. Query optimization
aws 에서 slow query 를 찾았고 쿼리 최적화를 해주었다. 원래 쿼리는 특정 데이터를 찾기위해 200 GB 가 넘는 테이블에서 찾았는데, 찾고자 하는 데이터가 1 GB 쯤 되는 테이블에도 동일하게 있어서 수정해주었다.
2. Reduce API response size
우선 클라이언트에서 사용하지 않는 데이터가 api에 들어가 있었다. 다른 유사한 api에서 필요했던 데이터고 필드 한두개 더 들어가도 큰 문제가 없겠지 라는 안일한 생각에 그냥 넣었는데 독이 되었다. 그리고 DB에 저장되어있는 값 그대로 API로 내려주었다. 실제로 필요한 값은 소수점 N 번째 까지였는데 그대로 다 내려줬던 것이 문제였다. 화면에서 사용하는 만큼만 내려주게 수정했다. API를 리팩토링하니 30kb 가 넘었던 response size가 6kb 아래로 줄었다.
3. 서버 성능을 우선시 하여 API 개발하기 (api 호출속도 뿐만 아니라 크기도 고려하기)
업무를 하는데 있어 개발 실력도 중요하지만 다른 사람들과 소통하는 것도 중요하다고 생각한다. 그래서 평소에 기획자분이나 프론트 개발자분들과 일하면서 최대한 상대방의 의사를 존중해주고 맞춰주려고 한다. 이번에 프론트 개발자분이 데이터를 한 api에 통째로 내려달라고 했었다. 어려운 일도 아니고 데이터를 한꺼번에 내려줬을때 api 호출시간이 0.5초 (500ms) 걸리는 것을 보고 흔쾌히 승락했었다. '한꺼번에 내려줘도 괜찮을까?' 라는 의문이 잠깐 들긴 했는데 한꺼번에 내려주는 것이 구현하기 편하다고 하셔서 요청대로 api를 만들었는데 문제가 발생한 것이다. 방대한 데이터가 한번에 호출되다 보니 api response size가 너무 컸고 이로인해 다른 서비스가 영향을 받았다. API Response size 도 api를 만드는데 고려해야 한다는 것을 알았다면 처음부터 거절했을것이다. 그런데 처음에 api를 호출해서 테스트했을때 속도 측면에서 문제가 없다고 판단했었는데 속도 외에도 생각해야하는 것들이 었었던 것이다. (지금 api를 호출하면 호출은 아주 빨리 되는데 api response size는 40kb가 넘는다. 일단 기존 api 호출도 지원을 하고, 특정 조건에 따라 필요한 만큼만 api를 호출하게 대응해뒀다)
배운 점
1. Query 를 조금 더 생각하고 짜자. 아무리 인덱스를 달아놨더라도 100GB 에서 데이터를 찾는 것과 1GB 에서 데이터를 찾는 것은 다르다.
2. API 는 속도도 중요하지만 크기도 중요하다.
'개발 이슈' 카테고리의 다른 글
sharp: Cannot find module '../build/Release/sharp-linuxmusl-x64.node' (0) | 2023.06.26 |
---|---|
AWS EKS 클러스터에 접속해서 특정 작업 또는 정보를 확인하기 (0) | 2023.05.13 |
The project you were looking for could not be found or you don't have permission to view it. 에러 (0) | 2023.05.08 |
모르는거 모아두는 곳 (0) | 2023.02.12 |
[TypeORM] transaction 이 깨질 때 해결방법 (0) | 2023.01.12 |