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
- Người dùng có khả năng tải lên, tải xuống và xem ảnh.
- Người dùng có thể tìm kiếm ảnh dựa trên tiêu đề.
- Người dùng có thể theo dõi các tài khoản khác.
- 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
- Hệ thống phải có tính khả dụng cao.
- Độ trễ tối đa cho chức năng tạo newsfeed là 200ms.
- 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) |
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:
- 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). - 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
- 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.
- 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.
- 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