결제 시스템에서 사용자가 동일한 결제 요청을 여러 번 보내는 경우를 가정하자.
사용자가 한 번 결제 버튼을 눌렀지만, 응답이 늦게 와서 같은 요청을 두 번 보냈다. 결제 서버가 두 요청을 동시에 처리하면서 결제가 두 번 이루어졌다.
위와 같은 중복 결제 문제를 방지하기 위한 방법을 설명해보자.
1. 먼저 결제 테이블을 가상으로 스케치 해보자. 결제 테이블에는 어떤 정보가 들어가야 될까 ?
-> 유저 아이디, request id, 상품명, 결제 종류(카드, 현금 등), 결제 요청 시간, 결제 완료 시간, 결제 완료 여부
2. 해당 테이블에서 인덱스를 어디에 걸어야 좋을까?
-> 유저 아이디, request id, 결제 완료 여부
3. 테이블에 결제 내용은 언제 저장될까?
-> 회사 by 회사겠지만, 나라면 결제 요청 전에 데이터에 저장하고 결제 요청이 들어올 때 update 할 것이다. 결제가 안되더라도 추후 이탈률를 알 수 있기 때문이다.
4. 이때 응답이 늦게 와서 같은 요청을 두 번 보냈다고 가정하면, 어떻게 방지 할 수 있을까?
-> 결제 여부에 이미 결제 완료가 되어 있다면 다음 요청은 에러처리를 하면 될 것 같다.
중복 결제를 감지하는 시스템을 설계한다면 어떤 방식으로 구현할 수 있을까?
비즈니스 로직에 결제 여부 처리 확인을 따로 추가해도 되겠지만, 앞으로를 위해 모니터링 시스템을 추가하면 좋을 거 같다.
단일 서버의 부하를 줄이기 위해 API Rate Limiting(초당 요청 제한)을 적용해야 하는 서비스가 있다.
그래서 해당 개발자는 초당 최대 5개의 요청만 처리 할 수 있도록 제한했다. 하지만 동시에 10개의 요청이 들어오면, 서버가 모두 처리하는 문제가 발생했다.
위와 같은 문제가 발생하는 원인은 무엇일까?
만약 단순하게 조건문(if)만을 가지고 1초당 5개의 요청만 받도록 처리했다면 (1초 5개, 2초 10개...), 결국 초당 요청량을 정확히 통제하지 못한다.
이를 해결하기 위한 효율적인 Rate Limiting 기법에는 무엇이 있을까?
토큰이나 자원을 획득한 요청에 대해서만 처리하도록 하는 방법이 있을 것 같다.
한 개의 API 엔드포인트가 있다. GET /products
이 API는 상품 목록을 조회하는 기능을 제공을하는데, 다음과 같은 문제가 있다.
상품 데이터가 수천만 개 이상이라서, 전체 데이터를 조회하는 데 3~5초가 걸린다.그리 사용자가 페이지를 이동할 때마다 새로운 API 요청을 보내기 때문에 서버 부하가 커진다. 또한 일부 사용자는 모바일 네트워크 환경이 느려서 응답 속도가 불안정하다.
이 API의 속도를 최적화하기 위한 방법을 최소 3가지 이상 설명하자.
서버 부하를 우선적으로 줄이기 위해 전체 목록을 불러오는 것이 아닌 페이징 기법을 우선 적용하고, 캐시와 비동기를 적용하면 좋을거 같다.
데이터베이스 쿼리 성능을 최적화하기 위해 인덱스를 사용할 경우, B-Tree Index와 Hash Index의 차이점을 설명하자.
테이블을 그려고보고 어디에 인덱스를 걸면 좋을지 그려보자.
한 개의 단일 서버에서 이벤트 예약 시스템을 운영 중이다. 사용자가 특정 이벤트에 참여하려고 하면, 서버가 요청을 받아 처리한다.
하지만, 다음과 같은 장애가 발생했다. 서버가 다운되면서 예약 데이터가 유실, 장애 복구 후, 일부 사용자의 예약 정보가 사라졌다. 또한 같은 이벤트에 중복 예약이 발생했다.
해당 서버 장애가 발생했을 때 데이터 유실을 방지하는 방법을 설명하자.
트랜잭션 로그(Transaction Log)를 활용하면 어떻게 장애 복구가 가능한가?
고가용성을 위해 로드 밸런서(Load Balancer)와 다중 서버(Multi-Server) 구조를 도입하려고 한다. 이 경우, 세션(Session) 관리를 어떻게 하면 좋을지 설명하라.
1. 서버 다운으로 인해 데이터가 유실되면 진짜 사라지는 걸까?
-> Redo, Undo 영역에 대해 설명하고, 데이터가 언제 저장되고 연산되는지 그려보자.
2. '고가용성'이란 무엇일까? 반대로 '저가용성' 이라는 단어도 많이 들어봤는데 같이 설명해보자.
한 개의 서버에서 사용자 요청을 처리하는 API가 있다. 하지만 해외 사용자들이 API를 호출하면, 다음과 같은 문제가 발생한다.
국내 사용자: 응답 시간이 100ms 이내
해외 사용자: 응답 시간이 2~3초 이상
이 문제의 원인은 무엇일까?
해외 사용자들에게도 빠른 응답 속도를 제공하기 위해 CDN(Content Delivery Network)을 도입하면 어떤 효과를 기대할 수 있을까?
만약 글로벌 유저를 대상으로 서비스할 경우, 서버 리전(Region) 분산과 DNS 기반 로드 밸런싱(DNS Load Balancing)을 적용하는 방법을 설명하자.
1. CDN과 리전에 대해 설명하자.
-> CDN은 정적 콘텐츠를 사용자와 가까운 서버에서 제공하는 것이고 Region은 클라우드 서버를 여러 지역에 배치하는 것을 말한다.
2. 지금 우리집에서 해외 사이트를 접속한다고 할때 어떻게 접속하는지 네트워크 나가는 방식에 대해 설명해보자.
(회고) 이번 스터디하면서 나왔던 내용
문제에 대한 답을 이야기 할 때는 시스템을 그려가면서 설명을 하자.
단순히 ‘분산 락을 사용하면 되요’ 라고 하는 것은 누구나 할 수 있는 말이다.
저라면 ‘이렇게 시스템에 적용해서 장애를 대응 할 것이다’ 라고 명확하게 시스템 설계를 해야 이해할 수 있다.
많이 들어본 단어라고 알고 있다고 생각하지말자. 많이 들어봤지만 정확하게 설명을 못한다면 아직 모르는 것이다.