Đây là bài viết của tác giả Nikhil Gupta trên blog Medium, link bài viết gốc mình sẽ để ở phần dưới của bài viết này. Và vì khả năng dịch của mình còn non, mong mọi người góp ý thêm để mình có thể cải thiện ở những bài viết tiếp theo.

Tổng quan

Nếu bạn đang sử dụng mạng xã hội thì khả năng cao là bạn đã sử dụng Instagram ít nhất một lần trong đời. Bạn đã bao giờ tự hỏi làm thế nào ứng dụng này hoạt động hoàn hảo đến vậy và nếu phải xây dựng một ứng dụng tương tự thì bạn sẽ tiến hành như thế nào? Trong bài viết này, tôi sẽ đề cập đến cách chúng tôi có thể thiết kế một ứng dụng tương tự như instagram.

Yêu cầu

Về chức năng

1. Người dùng có thể tải lên hình ảnh/video trên hồ sơ của mình.
2. Người dùng sẽ có thể xem video tải lên của những người dùng khác đã theo dõi người dùng.
3. Người dùng sẽ có thể theo dõi những người dùng khác.
4. Người dùng có thể thực hiện tìm kiếm hình ảnh/video dựa trên tiêu đề.

Về những yêu cầu không theo chức năng

1. Độ trễ trang chính của người dùng phải thấp.
2. Chúng ta đồng ý với tính nhất quán cuối cùng rằng hình ảnh được tải lên có thể được hiển thị cho người dùng khác sau vài mili giây.
3. Ứng dụng của chúng ta cần phải có tính khả dụng cao.
4. Kho dữ liệu mà chúng ta sẽ sử dụng để lưu trữ hình ảnh/video phải đáng tin cậy và dữ liệu không bị mất.

Những yêu cầu bổ sung

1. Người dùng có thể thêm thẻ vào ảnh/video.
2. Người dùng có thể bình luận ​​​​về một bài viết.
3. Người dùng có thể tìm kiếm ảnh dựa trên thẻ.

Ước tính về lưu lượng

Ước tính lưu lượng truy cập

Giả sử chúng ta có 500 triệu người dùng hoạt động hàng ngày và nhận được khoảng 5 triệu lượt tải lên mỗi ngày.
Tổng số lượt tải lên ~ 57 mỗi giây.

Ước tính lưu trữ

Giả sử kích thước tải lên trung bình là 200KB.
Khi đó tổng dung lượng cần thiết trong 1 ngày là 200*5 ~ 1 TB mỗi ngày.

API

Tải hình ảnh

API đăng tải hình ảnh
API đăng tải hình ảnh

Lấy dữ liệu trang chính

API lấy dữ liệu trang chính
API lấy dữ liệu trang chính

Theo dõi người dùng

API theo dõi người dùng
API theo dõi người dùng

Tìm kiếm hình ảnh

API tìm kiếm hình ảnh
API tìm kiếm hình ảnh

Xem xét về thiết kế

Kho dữ liệu để lưu trữ hình ảnh đã tải lên.

- Hệ thống của chúng ta có lượng đọc lớn, vì vậy chúng ta cần một kho lưu trữ dữ liệu có thể nhanh chóng tìm nạp hình ảnh đã tải lên và hiển thị trên ứng dụng của người dùng. Một số điều cần lưu ý là 1) Kho lưu trữ dữ liệu phải đáng tin cậy vì chúng ta không muốn hình ảnh tải lên của người dùng bị thất lạc. 2) Người dùng có thể tải lên bao nhiêu hình ảnh tùy thích để kho dữ liệu có thể mở rộng để xử lý hàng tỷ hình ảnh. 3) Độ trễ phải thấp khi truy xuất ảnh. Chúng ta có thể xem xét một bộ lưu trữ đối tượng để lưu trữ các hình ảnh được người dùng tải lên giống như AWS S3. Có các loại lưu trữ khác cũng như lưu trữ tệp và lưu trữ khối nhưng việc xem xét các yếu tố trên lưu trữ đối tượng sẽ phù hợp với thiết kế của chúng tôi vì nó mang lại độ trễ đọc thấp và quản lý hiệu quả số lượng bản ghi khổng lồ.

Kho dữ liệu để lưu trữ dữ liệu người dùng và dữ liệu tải lên của nó.

- Bây giờ chúng ta đã có kho dữ liệu để lưu trữ hình ảnh do người dùng tải lên. Chúng ta cần một cơ sở dữ liệu để lưu trữ siêu dữ liệu tải lên của người dùng và dữ liệu người dùng. Những điều cần lưu ý khi quyết định lưu trữ dữ liệu - 1) Cơ sở dữ liệu phải có tính sẵn sàng cao. 2) Nó phải có độ trễ đọc thấp vì hệ thống của chúng ta nặng. 3) Nó phải có khả năng mở rộng đủ để xử lý hàng tỷ bản ghi. 4) Nó phải đáng tin cậy và hỗ trợ phân mảnh và nhân rộng. Xem xét các yếu tố trên chúng tôi thấy không cần thiết phải có cơ sở dữ liệu quan hệ. Chúng ta có thể sử dụng cơ sở dữ liệu NoSQL dựa trên giá trị khóa. Đối với thiết kế hệ thống này, chúng tôi có thể chọn AWS DynamoDB để lưu trữ dữ liệu người dùng và siêu dữ liệu tải lên hình ảnh.

Thiết kế cơ sở dữ liệu

Chúng ta cần những bảng sau để lưu trữ dữ liệu:
1. Bảng lưu trữ dữ liệu người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu người dùng
2. Bảng lưu trữ dữ liệu theo dõi
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu theo dõi
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu theo dõi
Chúng tôi không thể chọn followUserId làm hashKey vì nó có thể tạo ra một phân vùng không cân bằng vì có thể có người dùng sẽ có hàng triệu người theo dõi. Những loại người dùng này được gọi là người dùng nóng. Do đó, để duy trì phân vùng cân bằng, chúng ta có thể chọn kết hợp followUserId và followerUserId làm hashKey.
3. Bảng lưu trữ dữ liệu tải lên của người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu tải lên của người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu tải lên của người dùng
4. Bảng lưu trữ dữ liệu trang chính của người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu trang chính của người dùng
Các thuộc tính và kiểu dữ liệu trong bảng lưu trữ dữ liệu trang chính của người dùng

Thiết kế cấp cao

Bảng thiết kế cấp cao
Bảng thiết kế cấp cao

Chi tiết các thành phần

1. Client - Đây sẽ là ứng dụng dành cho thiết bị di động/máy tính để bàn sẽ kết nối với máy chủ phụ trợ thông qua API REST được xác định ở trên.
2. Bộ cân bằng tải - Chúng ta sẽ sử dụng bộ cân bằng tải để phân phối lưu lượng giữa các máy chủ khác nhau. Điều này sẽ làm cho Hệ thống khả dụng hơn và trong trường hợp máy chủ ngừng hoạt động sau bộ cân bằng tải, bộ cân bằng tải có thể phân phối lưu lượng trên các máy chủ khác nhau.
3. Dịch vụ hình ảnh - Dịch vụ hình ảnh chịu trách nhiệm cung cấp API để tải hình ảnh lên và lấy dữ liệu meta hình ảnh. API siêu dữ liệu sẽ trả về đường dẫn hình ảnh trong s3, đường dẫn này sẽ được client sử dụng để tải hình ảnh trên ứng dụng của họ.
4. S3 — Chúng tôi đang sử dụng bộ lưu trữ đối tượng để lưu trữ hình ảnh do người dùng tải lên. AWS S3 là bộ lưu trữ đối tượng giá rẻ và có thể mở rộng mà chúng ta có thể sử dụng ở đây. Chúng tôi có thể tích hợp nó với AWS CloudFront để hình ảnh có thể được hiển thị trên ứng dụng của người dùng nhanh hơn nhiều.
5. CloudFront — Amazon CloudFront là dịch vụ mạng phân phối nội dung (CDN) được xây dựng để mang lại hiệu suất cao, bảo mật và sự thuận tiện cho nhà phát triển. Với sự trợ giúp của CloudFront, hình ảnh sẽ được hiển thị nhanh hơn trên ứng dụng của người dùng.
6. DDB hình ảnh - Chúng ta sử dụng AWS Dynamo DB để lưu trữ siêu dữ liệu hình ảnh tải lên của người dùng. Điều này đã được thảo luận ở phần trên.
7. SNS — Mỗi lần người dùng tải lên, chúng tôi sẽ đăng thông báo với sự trợ giúp của Dịch vụ thông báo đơn giản AWS. Điều này sẽ hữu ích trong các quá trình xử lý khác như giám sát, tạo nguồn cấp dữ liệu, phân tích, v.v. Các SQS khác nhau có thể đăng ký SNS này để theo dõi các sự kiện.
8. SQS - Chúng tôi sử dụng Dịch vụ xếp hàng đơn giản AWS sẽ đăng ký SNS sự kiện tải lên và dịch vụ tạo nguồn cấp dữ liệu sẽ lắng nghe SQS này để xử lý các sự kiện.
9. Dịch vụ tạo nguồn cấp dữ liệu - Dịch vụ này chịu trách nhiệm tạo nguồn cấp dữ liệu của người dùng. Nó sẽ lắng nghe các sự kiện tải lên của người dùng thông qua SQS và bắt đầu quá trình tạo nguồn cấp dữ liệu của người dùng. Dịch vụ này sẽ xử lý hàng triệu sự kiện và có thể có một cuộc thảo luận riêng về Thiết kế cấp thấp cho dịch vụ này. Chúng tôi sẽ đề cập đến điều đó trong bài viết trong tương lai.
10. Nguồn cấp dữ liệu DDB — Chúng tôi đang sử dụng Dynamo DB để lưu trữ dữ liệu nguồn cấp dữ liệu của người dùng. Dịch vụ tạo nguồn cấp dữ liệu sẽ tương tác với DDB để cập nhật nguồn cấp dữ liệu của người dùng.
11. Redis Cache — Để duy trì độ trễ đọc thấp cho người dùng, chúng tôi triển khai một lớp bộ nhớ đệm ở giữa dịch vụ tạo nguồn cấp dữ liệu và DDB. Khi có yêu cầu tìm nạp nguồn cấp dữ liệu của người dùng, trước tiên nó sẽ kiểm tra bộ đệm redis, nếu không có sẵn thì nó sẽ tìm nạp nó từ DDB và trả về phản hồi.

Hạn chế & phần mở rộng trong tương lai

1.Tạo trang khám phá người dùng nơi các nội dung tải lên từ tài khoản công cộng có thể được hiển thị trên trang của người dùng dựa trên tùy chọn và dữ liệu trong quá khứ của người dùng.
2. Tạo nguồn cấp dữ liệu người dùng. Việc tạo nguồn cấp dữ liệu người dùng hiện tại có một nút thắt cổ chai, nó hiện đang lắng nghe tất cả sự kiện cập nhật và cập nhật nguồn cấp dữ liệu cho tất cả những người theo dõi cụ thể đó. Điều này sẽ tạo ra sự cố khi có bản cập nhật về người dùng nóng (Người dùng có số lượng người theo dõi rất lớn). Chúng tôi sẽ thảo luận về điều này trong các bài viết trong tương lai.
3. Tìm kiếm nâng cao hơn dựa trên các tham số khác nhau như thẻ, vị trí, chú thích, tiêu đề, v.v.
NGUỒN: