Q.복제 지연 때문에 생기는 대표적인 사용자 버그를 설명해주세요
방금 자기가 한 일이 사라져 보이는 것입니다.
| 상황 | 사용자가 겪는 것 |
|---|
| 댓글 작성 후 목록 조회 | 내가 쓴 댓글이 없다 |
| 프로필 수정 후 새로고침 | 옛 이름이 보인다 |
| 주문 후 주문 목록 | 주문이 안 보여 다시 결제한다 |
| 두 번 새로고침 | 있다가 없어진다. 값이 오갔다 |
앞의 셋은 쓰기를 리더에, 읽기를 복제본에 보내면서 생깁니다. 쓰기는 성공했지만 그 값이 복제본에 아직 도착하지 않았습니다.
마지막은 복제본이 여러 대일 때 생깁니다. 첫 요청은 전파된 복제본, 두 번째는 아직 아닌 복제본으로 가면 값이 오갑니다. 시간이 거꾸로 가는 것처럼 보입니다.
세 번째는 실제 금전 손실로 이어집니다. 사용자가 실패로 오해해 다시 결제합니다.
흔한 실수: 복제 지연을 밀리초 단위라 무시하는 것. 화면 전환이 그보다 빠른 경우가 많고, 지연은 부하가 몰릴 때 초 단위로 커집니다. 평상시 지표로는 안 보입니다.
Q.read-your-writes 일관성을 어떻게 구현하시겠어요?
자기가 쓴 것은 반드시 보이게 하는 보장입니다. 방법이 여러 층입니다.
| 방법 | 내용 | 대가 |
|---|
| 쓴 뒤 잠시 리더에서 읽기 | 쓰기 후 몇 초간 그 사용자만 리더로 | 리더 부하가 는다 |
| 자기 데이터만 리더에서 | 프로필처럼 본인만 보는 것 | 판별 로직이 필요하다 |
| 복제 위치 비교 | 쓰기 시 받은 위치보다 앞선 복제본에서만 읽는다 | 구현이 복잡하다 |
| 클라이언트가 값을 들고 있기 | 응답으로 받은 값을 화면에 바로 반영 | 서버 상태와 어긋날 수 있다 |
| 쓰기 완료를 기다린다 | 복제 확인 후 응답 | 쓰기 지연이 는다 |
가장 많이 쓰는 것이 첫 번째와 네 번째입니다. 네 번째는 서버를 건드리지 않아 값싸고, 대부분의 화면에서 충분합니다. 목록을 다시 불러오는 대신 응답으로 받은 항목을 목록에 끼워 넣는 방식입니다.
세 번째가 가장 정확합니다. 쓰기 응답에 복제 위치를 담아 주고, 읽기 요청이 그 위치를 넘긴 복제본으로만 가게 합니다.
흔한 실수: 모든 읽기를 리더로 보내 해결하는 것. 그러면 복제본을 둔 이유가 없어집니다. 사용자 본인의 최근 쓰기와 관련된 읽기만 좁게 처리해야 합니다.
Q.읽기 복제본을 늘렸을 때 생기는 부작용은 무엇인가요?
읽기 처리량은 늘지만 다른 비용이 함께 늘어납니다.
| 부작용 | 내용 |
|---|
| 복제 지연 편차 | 복제본마다 진행 정도가 달라 같은 조회가 다른 값을 준다 |
| 리더 부담 | 리더가 모든 복제본에 변경을 보내야 한다 |
| 값이 오간다 | 요청이 다른 복제본으로 가면 있다가 없어져 보인다 |
| 승격 후보 판단 | 리더 장애 시 어느 복제본이 가장 앞선지 확인해야 한다 |
| 비용 | 저장과 인스턴스 비용이 배로 든다 |
| 쓰기는 그대로 | 쓰기 병목은 전혀 개선되지 않는다 |
세 번째를 막으려면 같은 사용자를 같은 복제본에 붙이는 방법을 씁니다. 그러면 최소한 한 사용자 안에서는 시간이 거꾸로 가지 않습니다.
두 번째는 복제본이 많아질 때 실제 한계로 옵니다. 이 경우 복제본이 복제본을 받는 연쇄 구조로 바꿔 리더 부담을 줄입니다. 대신 지연이 더 커집니다.
흔한 실수: 복제본을 늘려 성능 문제를 해결하려는 것. 읽기가 병목일 때만 효과가 있고, 쓰기나 잠금 경합이 원인이면 아무것도 나아지지 않습니다.
Q.어떤 데이터에 강한 일관성이 필요한지 어떤 기준으로 판단하나요?
어긋난 값으로 결정을 내리면 되돌릴 수 없는지를 봅니다.
| 질문 | 그렇다면 |
|---|
| 그 값으로 돈이 움직이는가 | 강한 일관성 |
| 되돌릴 수 없는 행동을 하는가 | 강한 일관성. 발송, 발권 |
| 권한이나 접근을 결정하는가 | 강한 일관성. 회수한 권한이 남으면 사고다 |
| 중복이 생기면 손실인가 | 강한 일관성. 재고, 좌석 |
| 사용자가 어긋남을 알아채는가 | 자기 쓰기라면 read-your-writes 정도는 필요하다 |
| 통계나 집계인가 | 결과적 일관성으로 충분하다 |
같은 데이터도 쓰임에 따라 다릅니다. 재고 숫자를 목록에 보여줄 때는 옛 값이어도 되고, 주문을 확정할 때는 원본에서 조건부로 확인해야 합니다. 데이터 종류가 아니라 그 순간의 판단 목적이 기준입니다.
비용도 함께 봅니다. 강한 일관성은 지연이 늘고 장애 시 가용성을 잃습니다. 필요 없는 곳에 걸면 그 대가만 남습니다.
흔한 실수: 중요한 데이터니까 전부 강하게 맞추는 것. 중요도가 아니라 어긋남이 만드는 결과로 판단해야 합니다. 중요한 개인 정보도 몇 초 늦게 반영돼도 문제가 없는 경우가 많습니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
분산 시스템 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.