URL 단축기 설계
1단계 문제 이해 및 설계 범위 확정
- 질문 : URL 단축기가 어떻게 동작해야 하는지 예제를 보여주실 수 있나요?
- 답변 : https://www.systeminterview.com/q=chatsystem&c=loggedin&v=v3&l=long이 입력이 주어질 경우
이 서비스는 https://tinyurl.com/y7ke-ocwj와 같은 단축 URL을 결과로 제공해야하며, 단축 URL로 접속하여도 원래 URL로 갈 수 있어야 합니다. - 질문 : 트래픽 규모는 어느 정도 인가요?
- 답변 : 매일 1억(100million) 개의 단축 URL을 만들어 낼 수 있어야 합니다.
- 질문 : 단축 URL의 길이는 어느 정도여야 하나요?
- 답변 : 짧을수록 좋습니다.
- 질문 : 단축 URL에 포함될 문자에 제한이 있나요?
- 답변 : 단축 URL에 숫자(0~9)와 영문자(a~z, A~Z)만 사용이 가능합니다.
- 질문 : 단축된 URL을 시스템에서 지우거나 갱신할 수 있나요?
- 답변 : 시스템을 단순화하기 위해 삭제나 갱신은 할 수 없다고 가정합니다.
기능 정리
- URL 단축 : 주어진 긴 URL을 훨씬 짧게 줄임
- URL 리다이렉션(redirection) : 축약된 URL로 HTTP 요청이 오면 원래 URL로 안내
- 높은 가용성과 규모 확장성, 그리고 장애 감내가 요구됨
개략적 추정
- 쓰기 연산 : 매일 1억개의 단축 URL 생성
- 초당 쓰기 연산 : 1억 / 24 / 3600 = 1160
- 읽기 연산 : 읽기 연산과 쓰기 연산 비율 10:1, 읽기 연산은 초당 11,600회 발생
- URL 단축 서비스를 10년간 운영한다고 가정하면 1억 * 365 * 10 = 3650억개의 레코드를 보관
- 축약 전 URL의 평균 길이는 100
- 10년 동안 필요한 저장 용량은 3650 * 100바이트 = 36.5TB
2단계 개략적 설계안 제시 및 동의 구하기
API 엔드포인트
- URL 단축용 엔드포인트
- POST /api/v1/data/shorten
- 인자 : longUrl : String
- 반환 : 단축 URL
- URL 디리렉션용 엔드포인트
- GET /api/v1/shortUrl
- 반환 : HTTP 리디렉션 목적지가 될 원래 URL
URL 리디렉션
- 단축 URL을 브라우저에 요청할 경우 HTTP 상태 코드는 301
- 응답 헤더에 Location 원본 URL 포함하여 반환
301과 302 차이
- 301 Permanently Moved
- 영구적으로 Location 헤더에 반환된 URL로 이전되었다는 응답
- 브라우저가 캐시하여 추후에 똑같은 단축 URL로 올 경우 원본 URL로 방문
- 장점
- 서버 부하를 줄여줌
- 302 Found
- 일시적인 Location 헤더에 지정한 URL에 의해 처리한다는 응답
- 항상 단축 URL 서버를 거쳐 원래 URL로 방문
- 장점
- 트래픽 분석이 중요할 경우 필요, 클릭 발생률이나 발생 위치 추적에 유리함
URL구현 방법
- URL 리디렉션을 구현하는 가장 직관적인 방법은 해시 테이블
- <단축 URL, 원래 URL> 쌍으로 저장
- 원래 URL = hashTable.get(단축 URL)
- 301 or 302 응답 Location 헤더에 원래 URL 넣고 전송
URL 단축
- www.tinyurl.com/{hashvalue} 형태
- 긴 URL을 해시 값으로 대응 시킬 해시 함수를 찾는게 중료
해시 함수 요구사항
- 입력으로 주어지는 긴 URL은 다른값이면 해시값도 달라야함
- 해시값은 원래 값으로 복원이 가능해야함.
3단계 상세 설계
데이터 모델
- 메모리는 유한하고 비싸므로, <단축 URL, 원래 URL>의 순서쌍을 RDB에 저장
- id, shortURL, longURL 3개 칼럼으로 구성
해시 값 길이
- 해시값은 [0-9, a-z, A-Z]로 구성이 되어야 함
- 사용할 수 있는 문자 개수는 10+26+26 = 62개
- 62^n >= 3650억인 n의 최솟값을 찾아야 함
- n = 7이면 대략 3.5조개의 URL 생성 가능
해시 후 충돌 해소
해시 함수 | 해시 결과(16진수) |
CRC32 | 5cb54054 |
MD5 | ac8b3b54df4124a34387d7e8da8f3838 |
SHA-1 | 8778e88b64149974b0806e7d12644e641f9f8ea7 |
- https://en.wikipedia.org/wiki/Systems_design을 해시 함수 결과
- 해시 함수 종류 및 결과
- CRC32를 사용해도 7보다 길다.
- 해결 방법
- 맨 처음 7글자만 사용하는 방법
- 충돌할 확률이 높음
- 충돌을 해결할때까지 DB 질의하여 있는지 조회
- 있을 경우
- 사전에 정한 문자열을 해시값에 붙이기
- 없을 경우 종료
- 단점
- 단축 URL을 생성할 때 마다 한번 이상 DB에 질의해야 하므로 오버헤드가 큼
- DB 대신 블룸 필터를 사용하면 성능을 높일 수 있다.
- 맨 처음 7글자만 사용하는 방법
base-62 변환
- 진법 변환(base conversion)은 URL 단축기를 구현할 때 흔히 사용되는 접근법
- 62 진법인 경우는 hashvalue에 사용할 수 있는 문자 개수는 62개
- 예
- 11157을 62진수로 변환
- 0은 0, 9는 9, 10은 a, 61은 Z
- 11157 = 2 * 62^2 + 55 * 62 + 59 * 62^0 = [2, 55, 59] => [2, T, X] => 2TX
- 단축 URL은 https://tinyrul.com/2TX
두 접근법 비교
해시 후 충돌 해소 전력 | base-62 변환 |
단축 URL의 길이가 고정됨 | 단축 URL의 길이가 가변적, ID값이 커지면 같이 커짐 |
유일성이 보장되는 ID 생성기가 필요치 않음 | 유일성 보장 ID 생성기가 필요 |
충돌이 가능해서 해소 전략이 필요 | ID의 유일성이 보장된 후에야 적용 가능한 전략이라 충돌은 아예 불가능 |
ID로부터 단축 URL을 계산하는 방식이 아니라서 다음에 쓸 수 있는 URL을 알아내는 것이 불가능 | ID가 1씩 증가하는 값이라고 가정하면 다음에 쓸 수 있는 단축 URL이 무엇인지 쉽게 알아낼 수 있어서 보안상 문제가 있음 |
URL 단축기 상세 설계
- 입력으로 긴 URL을 받는다.
- DB에 해당 URL이 있는지 확인
- DB에 있다면 찾은 URL 클라이언트에 반환
- 없을 경우 유일한 ID를 생성, ID는 데이터베이스의 기본 키로 사용(ID 생성기는 전역적 유일성이 보장되어야함)
- 62진법 변환을 적용, ID를 단축 URL로 만들기
- ID, 단축 URL, 원래 URl로 DB에 저장 후 단축 URL을 클라이언트에게 반환
URL 라디렉션 상세 설계
- 쓰기보다 읽기를 더 자주하는 연산이므로 캐시를 사용
- 동작 흐름
- 사용자가 단축 URL을 클릭
- 로드밸랜서가 해당 클릭으로 발생한 요청을 웹 서버에 전달
- 단축 URL이 캐시에 있을 경우 바로 반환
- 캐시에 없을 경우 DB 조회 후 사용자에게 반환
- DB 없을 경우 사용자가 잘못 입력
4단계 마무리
- 처리율 제한 장치
- 엄청난 양의 URL 단축 요청이 밀려들 경우 무력화될 수 있으므로 처리율 제한 장치를 두자
- 웹 서버의 규모 확장
- 웹 계층은 무상태 계층이므로 웹 서버를 자유로이 증설 및 삭제 가능
- 데이터베이스 규모 확장
- 데이터베이스를 다중화하거나 샤딩하여 규모 확장성을 달성할 수있음
- 데이터 분석 솔루션
- 어떤 링크를 얼마나 많은 사용자가 클릭했는지, 언제 주로 클릭했는지 중요한 정보를 알아 낼 수 있음
- 가용성, 데이터 일관성, 안정성
- 대규모 시스템이 성공적으로 운영되기 위해 반드시 갖춰야하는 속성
'시스템 아키텍쳐 > 가상 면접 사례로 배우는 대규모 시스템 설계 기초' 카테고리의 다른 글
7장 분산 시스템을 위한 유일ID 생성기 설계 (1) | 2023.08.02 |
---|---|
6장 키-값 저장소 설계 (0) | 2023.08.01 |
5장 안정 해시 설계 (1) | 2023.07.26 |
4장 처리율 제한 장치의 설계 (1) | 2023.07.26 |
3장 시스템 설계 면접 공략법 (0) | 2023.07.24 |