[플랫폼 계정연동 및 마일리지 지급] MSA 환경에서의 메세지 큐를 활용한 외부서비스 유량 제어

[플랫폼 계정연동 및 마일리지 지급] MSA 환경에서의 메세지 큐를 활용한 외부서비스 유량 제어

Select
트러블슈팅
B2B 서비스를 통해 신규로 강아지 정보를 등록한 이들을 자사(B2C) 플랫폼으로 계정 통합 기능 개발
 
[서비스 아키텍처]
notion image
[기여도]
  • 백엔드 개발자 2명, PM 1명, PO 1명
[문제]
1) 외부서비스 처리율 제한 정책으로 인한 피크 트래픽 상황에서 응답 지연 2) 계정 연동 및 마일리지 지급이라는 작업을 동기식으로 처리하여 장애 전파
→ 외부 서비스 응답 지연 시, 장애 전파로 인한 마일리지 미지급 및 계정 연동 실패
→ 클라이언트 측인 플랫폼 서비스에서 408 Request Timeout 에러 발생
  • 원인 1) 동기식 처리로 인한 높은 결합도로 인한 장애 전파
    • [플랫폼 계정 연동 → 커머스 마일리지 지급 요청 → 외부서비스 마일리지 지급] 동기식 처리 → 외부 서비스 응답 지연이 커머스와 플랫폼 서비스에도 영향을 줌
    • 일부 사용자의 요청이 계속 대기 상태에 머물면서 시스템 전체의 부하 증가
    • 커머스 서비스가 마일리지 지급을 요청한 후, 응답을 기다려야 해 대기 시간이 길어짐
  • 원인 2) 외부 서비스의 처리율 제한 정책 숙지 미비
    • 마일리지 지급을 외부 서비스에서 담당 → 특정 트래픽 부하를 감당 가능한 외부서비스의 처리율 제한 정책에 대해 숙지 미비하였음
[어려웠던 점과 극복방안]
  • 극복방안 1) 동기식 처리 → 메세지 큐 기반 이벤트 기반 아키텍처 활용 → 디커플링을 통한 응답 속도 및 결합도 감소
    • Java에서의 비동기 처리 (ExcutorService, CompletableFuture) 와 메세지 큐 (AWS SQS, Kafka, RabbitMQ) 비교 → 인프라 관리 부담이 덜한 완전 관리형 서비스이자 실패 시, 재처리 기능 및 Dead Letter Queue 제공 → SQS 선택
  • 극복방안 2) 외부 서비스의 처리율 제한 정책 → Lambda 동시실행 수 제한, BatchSize 조정
    • AWS AutoScaling 활용 → 메세지 큐에 담긴 이벤트 수 모니터링 → 많이 쌓이거나 수가 적으면 Lambda의 동시실행 수 제한 및 BatchSize 조정
  • 극복방안 3) 이벤트 누락으로 인한 마일리지 미지급 문제 발생 → At-Least-Once 방식 채택
    • 실패 시 5회 재시도 → 계속 실패 시 Dead Letter Queue 활용 → TPS 초과 메시지 재처리 보장
  • 극복방안 4) 대규모 트래픽 부하 테스트 환경 구축
    • Staging 환경이 별도로 존재하지 않아, 초당 1000 TPS를 넘는 대규모 트래픽에 대한 정확한 성능 테스트 환경을 구축하는 데 어려움이 있었음
      • → 상용 환경과 동일한 EC2 환경 구축 후, k6 부하 테스트 도구를 사용해 실제 사용자 시나리오에 근접하게 테스트 (외부 서비스 가비아 연동에 대해 성공 응답을 가정하고, 계정 연동부터 메세지 큐로 요청 과정까지 테스트)
        → TPS 2000명 기준 성능 테스트 시나리오
        • Staging 환경의 플랫폼 서비스 : 가상 유저 데이터 기반으로 계정 연동 요청 (이메일)
        • Staging 환경의 커머스 서비스 : 플랫폼 마일리지 지급 요청 → 메세지 큐 이벤트 정상적으로 쌓이는지 확인
        • 외부 서비스 : Mock 서버 (TPS 200 처리율에 맞게 요청 응답하도록 구성) 생성하여 처리 → 그 이상 들어올 경우 429 반환
[해결방안]
마일리지 요청 ↔ 지급 로직을 AWS SQS, Lambda 도입을 통한 이벤트 드리븐 구조로 변경
  • 응답을 기다리지 않고 트래픽을 처리할 수 있도록 개선, Lambda BatchSize 조정을 통해 처리율에 맞게 처리
  • 성능 테스트를 기반으로 예상되는 트래픽의 2배 정도 미리 테스트 → 안정적인 대용량 트래픽 처리 확인
    • k6 활용하여 부하 테스트를 진행한 결과, 문제 없이 트래픽을 처리할 수 있다는 것을 확인
    • 외부 서비스의 경우, Mocking 하여 처리 확인
[결과]
마케팅 비용 없이 1일 최대 가입자 5000명이라는 비즈니스 성과 달성 → 실시간 마일리지 지급 → 1시간 이내 첫구매 고객 전환율 20% 이상 달성 → 매출 성장에 기여
2000명이 동시 접속한 상황에서 실시간 계정 통합 및 마일리지 발급을 에러 없이 성공적으로 처리
[활용기술]
Node.js, Java, Spring Boot, JPA, Amazon SQS, AWS Lambda, Redis
 
Built with Potion.so