bit.ly 를 생각하면 된다. 크게 2가지 기능이 존재함
- 긴 URL을 넣으면 짧은 URL을 알려준다 (POST)
- 단축된 URL을 넣으면 원래 URL을 알려준다 (GET) - redirect
기본적인 요구사항
- 기본 : 높은 가용성, 규모 확장성, 장애 감내
- 쓰기 연산 트래픽 : 매일 1억건
- 서비스 유지 기간 : 10년 정도
이를 통해 다음과 같은 조건을 추가로 유추할 수 있다.
- 초당 쓰기 연산 횟수 : 1160회 (매일 1억건이므로 86400초로 나눔)
- 읽기 연산을 쓰기 연산의 10배로 가정시 읽기 연산 초당 11600회
- TPS 13,000 ~ 14,000
- 하루 1억건씩 10년이면 총 3650건의 레코드 보관
- 1레코드 당 100byte 가정시 36.5TB 필요
비즈니스 조건
- URL의 길이는 가능한 짧으면 좋다.
GET, POST 몇 가지 생각할거리
GET
- Redirect는 HTTP header의 location 을 통해 어디로 가야할지 알려주는 방식이다.
- 301 Permanently Moved는 영구적으로 URL을 이전시킨다. 브라우저는 이 응답을 캐싱해서, 추후 한 번더 이 요청이 오게 되면 캐시된 URL로 요청을 보낸다
- 302 Found는 일시적으로 이동시킨다. 클라이언트의 요청은 언제나 단축 URL 서버에 먼저 보내진 후에 원래 URL로 이동되는 방식이다
POST
- 결국 우리는 해시 함수 fx를 찾는 것이 관건이다. (긴 문자열 → 짧은 문자열) 해시 함수는 두 가지의 조건을 만족해야 한다.
- 주어진 URL이 다르면 해시 값도 달라야 한다
- 계산된 해시 값은 원래 입력으로 주어졌던 긴 URL로 복원될 수 있어야 한다
- DB에서 (id, long_url, short_url)
상세 설계
데이터 모델
- PK, shortUrl, long Url
해시 함수
해시 함수가 생산하는 문자열 길이를 추산해보자.
총 3600억개를 cover할 수 있어야 하므로 숫자, 알파벳 대소문자를 쓴다고 하면 7자리로 생산이 가능하다
해시 함수의 알고리즘은 크게 2가지가 가능하다
- 해시 후 충돌 해소
- MD5, SHA-1 등의 해시 함수를 사용하고 7자리를 slice 한 다음 중복되는 URL이 있다면 salt를 더해 처음부터 반복하는 방법
- 단축 URL의 길이가 고정되고 유일성 보장 ID 생성기가 불필요하다. 또한 다음 단축 URL을 유추할 수 없다.
- 하지만 충돌 후 해소 로직이 있기 때문에 POST 시간이 조금더 소요될 수 있다.
- BASE-62진법 변환
- 유일 ID 생성기를 이용해 ID를 생성한후 62진법으로 변환하는 알고리즘
- 단축 URL의 길이가 가변적이고, 다음 ID URL을 알아낼 수 있다. (즉 보안 이슈가 있음)
- POST 시간이 매우 짧게 된다.
몇 가지 더 생각해볼 것들
- 처리율 제한 장치
- TPS peak 방지를 위해 전체 트래픽 처리율 제한을 둘 수 있다.
- 웹 서버 규모 확장, DB 규모 확장
- 데이터 분석 솔루션
- URL 사용 통계 등에 대한 business적 관점
'개발 공부 기록하기 > 20. 일반' 카테고리의 다른 글
단위 테스트 - 단위 테스트의 목표와 고전파, 런던파 (0) | 2022.02.14 |
---|---|
대규모 시스템 설계 기초 - 9. 웹 크롤러 설계 (0) | 2021.12.16 |
단위 테스트 4. 좋은 단위 테스트의 4대 요소 (1) | 2021.11.28 |
대규모 시스템 설계 기초 - 7. 분산 시스템을 위한 유일 ID생성기 설계 (0) | 2021.11.25 |
대규모 시스템 설계 기초 - 6. 키-값 저장소 설계 (0) | 2021.11.25 |