0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Thiết Kế Một Hệ Thống Chia Sẻ Ảnh Đơn Giản Như Instagram

Đăng vào 1 tháng trước

• 3 phút đọc

Chủ đề:

DatabaseDesignimag

Giới thiệu

Instagram (IG) đã trở thành một nền tảng phổ biến cho phép người dùng tải lên và chia sẻ ảnh, video với bạn bè và cộng đồng. Bài viết này sẽ hướng dẫn bạn cách thiết kế một hệ thống đơn giản tương tự như Instagram, mà người dùng có thể dễ dàng chia sẻ ảnh và theo dõi lẫn nhau.

Yêu Cầu và Mục Tiêu của Hệ Thống

Yêu Cầu Chức Năng

  1. Người dùng có khả năng tải lên, tải xuống và xem ảnh.
  2. Người dùng có thể tìm kiếm ảnh dựa trên tiêu đề.
  3. Người dùng có thể theo dõi các tài khoản khác.
  4. Hệ thống sẽ tạo ra newsfeed, hiển thị ảnh mới nhất của những người mà họ theo dõi.

Yêu Cầu Phi Chức Năng

  1. Hệ thống phải có tính khả dụng cao.
  2. Độ trễ tối đa cho chức năng tạo newsfeed là 200ms.
  3. Phải đảm bảo độ tin cậy cao, với tỷ lệ mất dữ liệu rất thấp.

Ước Tính Khả Năng và Ràng Buộc của Hệ Thống

Hệ thống tập trung vào việc đọc nhiều hơn ghi, với ước tính cho 500 triệu người dùng và 1 triệu người dùng hoạt động hàng ngày.

  • 2 triệu ảnh mới được tải lên mỗi ngày, tương đương 23 ảnh mỗi giây.
  • Kích thước trung bình của mỗi ảnh là khoảng 200KB, cần khoảng 400GB dung lượng mỗi ngày, tương đương 730TB trong vòng 5 năm.

Thiết Kế Hệ Thống Nâng Cao

Để hỗ trợ tải ảnh lên và tìm kiếm ảnh, cần có máy chủ lưu trữ (như S3) cho ảnh và một số máy chủ cơ sở dữ liệu cho siêu dữ liệu.

Thiết Kế Cơ Sở Dữ Liệu

1. Bảng Photo

Trường Kiểu Dữ Liệu
photo_id bigint (khóa chính)
user_id int
photo_path varchar(256)
photo_latitude int
photo_longitude int
user_latitude int
user_longitude int
created_at int

2. Bảng User

Trường Kiểu Dữ Liệu
user_id int (khóa chính)
name varchar(25)
email varchar(32)
dob datetime
created_at datetime
last_login datetime

3. Bảng UserFollow

Trường Kiểu Dữ Liệu
follower_id int (khóa chính)
following_id int (khóa chính)

Sử dụng RDBMS như MySQL có thể vừa đủ cho nhu cầu, nhưng để đảm bảo mở rộng, sử dụng NoSQL phân tán như Cassandra là lựa chọn hiệu quả. Tất cả siêu dữ liệu ảnh sẽ được lưu trữ dưới dạng đối tượng có chứa các chi tiết ảnh.

Ước Tính Dung Lượng Lưu Trữ

Tổng dung lượng lưu trữ cần thiết trong 5 năm tới:

  • Bảng User: 36.5 GB cho 500 triệu người dùng.
  • Bảng Photo: Khoảng 1 TB cho 5 năm lưu trữ 2 triệu ảnh mỗi ngày.
  • Bảng UserFollow: 1.82 TB với mỗi người dùng theo dõi 500 người.
    Tổng cộng khoảng 2.8 TB.

Thiết Kế Các Thành Phần Hệ Thống

Cần chú ý thông lượng tải lên và đọc ảnh, nên tách biệt các API đọc và ghi. Hướng tới mô hình CQRS (Command Query Responsibility Segregation) để tối ưu hiệu suất.

Độ Tin Cậy và Dự Phòng

Cần lưu trữ nhiều bản sao của mỗi tệp để đảm bảo tính khả dụng. Nếu một máy chủ gặp sự cố, các bản sao tồn tại tại máy chủ khác sẽ giúp phục hồi.

Phân Chia Dữ Liệu (Sharding)

Có hai cách để phân chia dữ liệu:

  1. Phân vùng theo user_id (có thể tốn kém khi một người dùng nổi tiếng với nhiều ảnh).
  2. Phân vùng theo photo_id, giúp đồng đều hơn và dễ quản lý.

Xếp Hạng và Tạo Newsfeed

  1. Lấy danh sách các người dùng đang theo dõi và truy xuất 100 ảnh mới nhất cho mỗi người.
  2. Sử dụng thuật toán xếp hạng để xác định 100 ảnh hàng đầu dựa trên mức độ mới và phổ biến.
  3. Hiển thị thông tin tới người dùng dưới dạng nguồn cấp tin tức (newsfeed).

Bộ Nhớ Đệm và Cân Bằng Tải

Sử dụng CDN để phục vụ nội dung gần với người dùng và bộ nhớ đệm với Memcache để tối ưu truy cập dữ liệu. Quy tắc 80-20 sẽ hiệu quả khi lưu trữ ảnh phổ biến vào bộ nhớ đệm.

Tác giả: https://me.tecklens.com/
Bài viết: https://me.tecklens.com/blog/designing-instagram
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào