어떤 문제가 있었는가?
발견된 문제
2024년 1월 11일부터 서비스 사용자들로부터 SNS 공유 기능이 동작하지 않는다는 보고가 접수되었습니다. 기능 장애는 다음과 같은 영역에서 발생했습니다.
- 캐시톡 SNS 연동 > SNS 계정 연동하기
- 친구 초대 > 외부 SNS 으로 공유하기
- 앱 전반에서 공유되고 있는 SNS 공유 기능
로그 분석 결과, 외부 SNS 개발자 콘솔에서 친구_목록_조회
API (외부 SNS 측 API) 에서 대량의 오류가 발생한 것을 확인했습니다.
SNS 연동하기
SNS 으로 공유하기
원인 분석
조사 결과, 다음과 같은 원인을 파악했습니다.
-
외부 SNS API 쿼터 초과
- 일일 쿼터(30,000건) 초과: 일 약 302,523건 호출
- 월간 쿼터(3,000,000건) 초과: 11일 만에 3,793,832건 호출
-
과도한 API 호출량
- Datadog(서버 모니터링 체계)에 기록된 유저 고유 ID와 API 요청량 분석 결과, 일 평균 약 45,000명의 사용자가 친구 추천 API를 사용 중이었습니다.
- 로그 분석 결과 사용자당 일 평균 4.4회 호출 중이었으며
- 일일 약 39만 회의 외부 SNS 친구 목록 API를 호출하는 상황이었습니다. (45,000명 × 2회 × 4.4회)
어떻게 해결했는가?
문제 해결을 위해 다양한 이해관계자(PM, 서버 개발자, 클라이언트 개발자, 웹뷰 개발자)와 협업하여 해결 방안을 도출하였습니다.
- 서버 측 외부 API 응답(친구 목록) 캐싱
- 사용자별 SNS 친구 목록을 서버에 캐싱
- 캐싱 주기: 24시간 (조정 가능)
- 점진적으로 친구 목록 로드: 100명씩 분할 조회 및 캐싱하여 한 번 조회된 친구는 다시 API 호출하여 조회하지 않도록 했습니다.
추천 친구 화면 우측 상단 새로고침 클릭 시마다 100명씩 추가로 분할 조회
- 외부 API 호출 비활성화 임시 조치
- 개선 작업 중 임시로 API 호출을 비활성화하여 개발 단 테스트 / QA 이전에 쿼터가 소진되어 버리는 현상을 방지하였습니다.
- 2월 1일 월간 쿼터 리셋 후 QA 진행 & 개선된 로직 상용에 적용
구현 방식
서버 측 캐싱 로직
1. 유저가 추천 친구 목록을 조회하면:
- 캐시 유효성 확인 (24시간 이내 캐싱된 친구 목록이 있는지)
- 유효한 캐시 없을 경우, 외부 SNS API에서 최대 100명까지 친구 목록 조회 후 캐싱
- 유효한 캐시 있을 경우, 캐싱된 데이터 반환
2. 사용자가 친구 목록을 새로고침하면:
- 이미 로드된 친구 수 확인
- 아직 로드되지 않은 친구가 있는 경우, 다음 100명을 SNS API에서 조회하여 캐시에 추가
- 모든 친구가 로드된 경우, 추가 API 호출 없이 캐시된 데이터만 반환
개선된 API 호출 패턴
- 기존: 매 화면 진입과 새로고침마다 전체 친구 목록을 지속적으로 중복 호출하고 있었으나
- 개선: 캐시된 친구 목록을 활용, 필요 시에만 추가 조회하는 방식으로 개선하였습니다.
결과 및 성과
정량적 성과
항목 | 개선 전 | 개선 후 | 감소율 |
---|---|---|---|
일일 API 호출 수 | ~302,523회 | ~17,587회 | 94.2% |
월간 API 호출 수 | 3,793,832회 | ~597,965회 | 84.2% |
개선 이후 외부 SNS 친구_목록 API 호출량
정성적 성과
-
서비스 안정성 향상
- 외부 SNS 공유 기능 정상화
- 외부 API 쿼터 제한으로 인한 서비스 장애 해소
-
시스템 효율성 개선
- 불필요한 API 호출 대폭 감소
- 서버 부하 감소 및 응답 시간 개선
회고
무엇을 배웠는가?
- 외부 API 사용 시 쿼터 제한을 고려해야 한다는 것을 배웠습니다.
- 또한 다양한 팀(서버, 클라이언트, PM) 간의 원활한 소통을 통해 해결 방안을 수립하고 문제를 해결할 수 있었습니다.
결론
이 프로젝트는 외부 API 의존성이 높은 서비스에서 발생할 수 있는 쿼터 제한 문제를 효과적으로 해결한 사례입니다.
서버 모니터링 시스템(Datadog)을 바탕으로 유저 별 API 요청량을 분석하고, 캐싱 전략을 효율적으로 적용하고,
다양한 이해관계자와의 원활한 의사소통을 통해 외부 API 호출을 95% 이상 감소시켜 서비스 안정성을 크게 향상시킬 수 있었습니다.