0Pricing
System Design Basics for Backend Developers · 강의

URL 단축 서비스 설계

확장성, 저장 공간, 가용성을 고려하며 URL 단축 서비스의 시스템 설계를 단계별로 살펴봅니다.

URL 단축 서비스 설계은(는) CoddyKit의 무료 System Design Basics for Backend Developers 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 System Design Basics for Backend Developers 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. System Design Basics for Backend Developers 강의에는 총 4개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Intro to URL Shorteners

Welcome! In this lesson, we'll design a URL shortening service, similar to Bitly or TinyURL. These services take a long, complex URL and convert it into a much shorter, more manageable one.

URL shorteners are incredibly useful for sharing links on social media, in emails, or anywhere space is limited. They also often provide analytics, tracking how many times a shortened link is clicked.

Core Functionality: Shorten & Redirect

A URL shortener primarily performs two key functions:

  • Shorten: Takes a long URL as input and generates a unique, short code. This code is then used to construct the short URL.
  • Redirect: When a user accesses a short URL, the service looks up the corresponding long URL and redirects the user's browser to it.

These two operations form the backbone of the entire system.

Generating Unique Short Codes

The heart of a URL shortener is its ability to generate unique, short, and often human-readable codes. Common approaches include:

  • Sequential IDs + Base62 Encoding: Use an auto-incrementing database ID and convert it to a Base62 string. Base62 uses 0-9, a-z, A-Z (62 characters), allowing for shorter codes than Base10.
  • Hash Functions: Apply a hash function (like MD5 or SHA256) to the long URL. Take a portion of the hash to form the short code. This requires collision handling.
  • Random String Generation: Generate a random string of a fixed length. This also requires checking for uniqueness to avoid collisions.

Base62 Encoding Example

Let's look at a simple Python example of Base62 encoding, which is a popular method for generating short codes from sequential IDs. This helps ensure uniqueness while keeping codes compact.

BASE62_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def encode_base62(num):
    if num == 0:
        return BASE62_CHARS[0]
    
    result = []
    while num > 0:
        result.append(BASE62_CHARS[num % 62])
        num //= 62
    return "".join(reversed(result))

# Example usage:
if __name__ == "__main__":
    test_id = 12345
    short_code = encode_base62(test_id)
    print(f"ID: {test_id} -> Short Code: {short_code}")

    test_id_large = 9876543210
    short_code_large = encode_base62(test_id_large)
    print(f"ID: {test_id_large} -> Short Code: {short_code_large}")

Database Schema for URLs

To store our URL mappings, we'll need a database. A simple schema could look like this (using a relational database like PostgreSQL):

  • id: Primary key (auto-incrementing integer)
  • short_code: VARCHAR(10) - The unique short string
  • long_url: TEXT - The original, long URL
  • created_at: TIMESTAMP - When the short URL was created
  • user_id: INT (optional) - If users can create accounts
  • click_count: INT (optional) - For basic analytics

A NoSQL database could also work, offering flexibility for schema evolution.

The Redirection Service

When a user clicks on a short URL (e.g., https://tiny.url/abcde), the redirection service takes over. It performs these steps:

  1. Extracts the short_code (e.g., abcde) from the URL.
  2. Queries the database to find the corresponding long_url.
  3. Sends an HTTP 301 (Moved Permanently) or 302 (Found) redirect response to the user's browser, pointing to the long_url.

301 vs 302: 301 is for permanent redirects and is cached by browsers, 302 is temporary. For shorteners, 301 is often preferred for performance after the initial creation.

Handling Collisions & Uniqueness

Ensuring each generated short code is unique is critical. If we use hash functions or random strings, collisions (two different long URLs getting the same short code) are possible, though rare with longer codes.

Strategies to handle collisions:

  • Database Check: Always attempt to insert the new mapping and catch a unique constraint violation. If a collision occurs, regenerate the code and retry.
  • Pre-check: Before inserting, query the database to see if the code already exists. This can lead to race conditions under high concurrency, so database-level unique constraints are preferred.
  • Distributed ID Generation: For sequential IDs, use a distributed ID generator (e.g., Snowflake ID) to ensure globally unique IDs that can then be Base62 encoded.

Scalability Considerations

A popular URL shortener needs to handle millions of requests. Key scalability points:

  • Database: The database will be a hotspot. Consider sharding the database by short_code or using a distributed key-value store. Read replicas are essential for the redirection service.
  • Caching: Cache frequently accessed short URL to long URL mappings (e.g., using Redis or Memcached) to reduce database load, especially for the redirection path.
  • Asynchronous Processing: For click analytics, instead of incrementing a counter synchronously, send click events to a message queue for asynchronous processing.
  • Load Balancers: Distribute incoming traffic across multiple instances of your shortening and redirection services.

Basic Click Analytics

Beyond just shortening, many services offer basic analytics. To track clicks:

  • When a short URL is accessed, increment a click_count in the database for that specific mapping.
  • For high traffic, this counter update can become a bottleneck. A more scalable approach is to send a message to a queue (e.g., Kafka, RabbitMQ) and have a separate worker process asynchronously update the counts or store detailed click logs.
  • Detailed analytics might involve storing referrer, user agent, IP address, etc., in a separate analytics database (e.g., a data warehouse).

URL Shortener Challenge

When designing the redirection service for a URL shortener, what is the most critical HTTP response code to send to the user's browser, and why?

Recap: URL Shortener Design

We've walked through the core components of designing a URL shortener!

  • We covered the two main functions: shortening and redirection.
  • Explored methods for generating unique short codes, like Base62 encoding.
  • Discussed database schema for storing mappings and the mechanics of the redirection service.
  • Addressed crucial aspects like collision handling, scalability with caching and sharding, and basic click analytics.

This case study illustrates how various system design principles come together to build a functional and scalable service.

자주 묻는 질문

“URL 단축 서비스 설계” 강의는 무료인가요?

네 — “URL 단축 서비스 설계” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 System Design Basics for Backend Developers 강의 전체를 잠금 해제할 수 있습니다. System Design Basics for Backend Developers 강의에는 총 4개의 강의가 포함되어 있습니다.

“URL 단축 서비스 설계”에서 뭘 배우나요?

확장성, 저장 공간, 가용성을 고려하며 URL 단축 서비스의 시스템 설계를 단계별로 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 System Design Basics for Backend Developers을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

System Design Basics for Backend Developers을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 System Design Basics for Backend Developers은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“URL 단축 서비스 설계” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 System Design Basics for Backend Developers 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 System Design Basics for Backend Developers 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. URL 단축 서비스 설계
  2. 소셜 미디어 피드 구축
  3. 전자상거래 플랫폼 확장
  4. 실시간 채팅 시스템 설계하기
← System Design Basics for Backend Developers(으)로 돌아가기