URL 단축기는 기능이 둘뿐입니다. 긴 주소를 짧은 키로 바꾸고, 짧은 키로 원래 주소로 보내는 것입니다. 두 기능의 무게가 100배 다른 것이 이 설계의 출발점입니다.
| 항목 | 값 |
|---|---|
| 대상 | 링크 단축 서비스 |
| 단축 키 길이 | 7자 이하 |
| 생성 | 초당 100 |
| 조회 | 초당 1만 |
| 보관 | 10년. 누적 300억 개 |
| 리디렉션 지연 | 상위 1퍼센트가 50ms 이내 |
| 같은 주소를 두 번 넣으면 | 다른 키가 나와도 된다 |
| 사용자 지정 키 | 이번에는 만들지 않는다 |
기능 요구사항과 범위 밖
| 구분 | 내용 |
|---|---|
| 이번에 만든다 | 짧은 키 만들기, 원래 주소로 보내기, 만료 설정, 조회 수 세기 |
| 범위 밖 | 사용자 지정 키, 같은 주소에 같은 키 재사용, 링크 미리보기, 방문자 분석 |
같은 주소에 같은 키를 주지 않기로 한 것이 중요합니다. 재사용하려면 키를 만들기 전에 "이 주소가 이미 있는지" 를 찾아봐야 하고, 누적 300억 개 규모에서 그 조회는 값싸지 않습니다.
포기하면 쓰기 경로가 조회 없이 끝납니다. 같은 주소에 키가 여러 개 생기는 것은 저장 공간을 조금 더 쓰는 문제일 뿐입니다.
두 경로의 무게
조회가 생성의 100배입니다. 그래서 최적화 대상이 분명합니다. 쓰기가 조금 느린 것은 괜찮고 읽기가 조금 느린 것은 안 됩니다.
이 비율은 서비스의 성질에서 나옵니다. 링크는 한 번 만들어 여러 번 공유되고, 인기 있는 링크는 수만 번 열립니다.
숫자가 정하는 것
| 조건 | 강제하는 것 |
|---|---|
| 키 7자 이하 | 키 공간을 계산해야 한다. 짧으면 충돌이 잦아진다 |
| 누적 300억 개 | 한 서버에 담을 수 없다. 나누는 방법은 안정 해시 설계에서 다뤘다 |
| 조회 초당 1만 | 읽기 경로가 설계의 중심이다 |
| 지연 50ms | 리디렉션이 한 번의 조회로 끝나야 한다 |
| 같은 주소 재사용 안 함 | 쓰기 전에 조회하지 않아도 된다 |
키 길이가 곧 서비스 가치다
단축기의 존재 이유는 주소가 짧아지는 것입니다. 키가 길어지면 서비스의 값이 떨어집니다.
그런데 짧게 만들수록 담을 수 있는 개수가 줄어듭니다. 이 상충이 이 설계의 첫 계산이고 다음 단계에서 다룹니다.
조회 수 세기를 기능에 넣은 이유
리디렉션은 우리 서버를 지나갑니다. 그 순간에 세면 추가 비용이 거의 없습니다. 그런데 뒤에서 보듯 리디렉션 응답을 어떻게 고르는지에 따라 이 기능이 동작하지 않을 수 있습니다.
기능 하나가 다른 결정에 묶여 있는 예입니다. 요구사항에 적어 두면 그 결정을 할 때 놓치지 않습니다.