Mục lục[Ẩn giấu][Chỉ]
Nguồn cấp dữ liệu Instagram là một nền tảng để chia sẻ và kết nối với những người và những thứ quan trọng đối với bạn. Khi bạn mở Instagram hoặc làm mới nguồn cấp dữ liệu của mình, ảnh và video mà chúng tôi nghĩ rằng bạn sẽ quan tâm sẽ hiển thị ở phía trên cùng.
Nguồn cấp tin tức là một tập hợp các mục chứa văn bản, hình ảnh hoặc video được tạo bởi các thực thể khác trong hệ thống được nhắm mục tiêu để bạn đọc. Nó luôn thay đổi, trong khi các tổ chức khác đang tạo ra những bài viết mới.
Trong bài đăng này, chúng ta sẽ xem xét kỹ thiết kế hệ thống của nguồn cấp dữ liệu Instagram. Vì vậy, hãy bắt đầu.
1. Yêu cầu
Chức năng cần thiết
- Nguồn cấp tin tức của người dùng được tạo từ các bài đăng của các thực thể khác trong hệ thống mà người dùng đã theo dõi hoặc quan tâm.
- Văn bản, hình ảnh và video đều có thể được tìm thấy trong các bài đăng.
- Nguồn cấp tin tức của người dùng nên được cập nhật với các bài đăng mới do người khác tạo.
Tiêu chí phi chức năng
- Việc tạo nguồn cấp tin tức phải diễn ra trong thời gian thực. Người dùng cuối chỉ phải trải qua 12 giây trễ.
- Thêm bài viết mới: Sẽ không mất quá 5 giây để bài viết mới xuất hiện trong yêu cầu nguồn cấp tin tức sau khi nó được gửi đến hệ thống.
2. Ước tính Công suất
- Tính đến tháng 2021 năm 7.8, dân số thế giới chỉ là 21 tỷ người. Nó chỉ ra rằng 32% dân số thế giới là Facebook DAU (Người dùng hoạt động hàng ngày) và XNUMX% là Facebook MAU (Người dùng hoạt động hàng tháng) (Người dùng hoạt động hàng tháng). Thật là tuyệt vời.
- Hãy giả sử hệ thống chúng tôi đang xây dựng có 1 tỷ DAU để làm cho mọi thứ dễ dàng hơn.
- Giả sử một người theo dõi 500 người hoặc doanh nghiệp trên Facebook. Một nhóm hoặc một trang có thể được coi là một thực thể.
Lưu lượng ước tính
Giả sử rằng một người dùng tải xuống nguồn cấp tin tức trung bình 10 lần mỗi ngày. Vì vậy, nó có khoảng 116K QPS và 1e10 yêu cầu mỗi ngày.
Ước tính dung lượng lưu trữ
Giả sử chúng tôi duy trì trung bình 500 bài đăng từ nguồn cấp tin tức của mỗi người dùng trong bộ nhớ để truy xuất nhanh và mỗi bài đăng có kích thước 1KB. Vì vậy, 500 KB cho mỗi người dùng, 500 TB cho tất cả DAU và 5000 máy tính có RAM 100 GB cho mỗi người dùng.
3. API cho hệ thống
userId (GUID): người dùng có nguồn cấp tin tức đang được tìm nạp.
Các trường sau có sẵn trong tham số tùy chọn tùy chọn:
- afterPostId (GUID): lấy nguồn cấp tin tức từ bài đăng theo sau bài đăng này. Nếu không được chỉ định, hãy lấy các bài viết gần đây nhất.
- count (number): số lượng bài viết tối đa mà mỗi yêu cầu có thể trả về. Phần phụ trợ đặt số tối đa mặc định nếu không có số nào được cung cấp.
- Loại trừ trả lời (boolean): ngăn không cho các câu trả lời được đưa vào nguồn cấp tin tức.
- JSON được trả về chứa danh sách các mục nguồn cấp tin tức.
4. Thiết kế cơ sở dữ liệu
Các thực thể
- người sử dang
- entityId, name, description và timestamp là tất cả các trường bắt buộc.
- Các trường sau là bắt buộc: PostId, title, text, authorId và timestamp.
- dấu thời gian, url và mediaId
Mối quan hệ
- Người dùng hoặc thực thể khác có thể được theo dõi bởi một người dùng. (m: n)
- Tác giả-Bài đăng: Cả người dùng và thực thể đều có thể tạo bài đăng. Giả sử rằng chỉ Người dùng mới có thể tạo Bài đăng vì mục đích đơn giản. (1: n; authorId có thể nhúng được).
- Mỗi bài đăng được kèm theo một số hình thức phương tiện truyền thông. (1: n)
5. Thiết kế Cấp cao
Kiến trúc
Quy trình công việc
Sản xuất thức ăn chăn nuôi
Khi Jay yêu cầu luồng tin tức của cô ấy, hệ thống sẽ thực hiện những việc sau:
- Truy xuất ID của tất cả những người và những thứ mà Jay theo dõi.
- Tổng hợp các bài đăng: với các ID đó, lấy các bài đăng gần đây nhất, phổ biến và có liên quan.
- Xếp hạng các bài viết theo mức độ liên quan và thời gian của chúng.
- Bộ nhớ cache: lưu các nguồn cấp dữ liệu đã tạo và gửi cho Jay 20 bài đăng hàng đầu.
- Khi Jay đọc xong 20 bài viết đầu tiên, một yêu cầu khác được gửi đến để nhận 20 bài viết tiếp theo.
Phân phối nguồn cấp dữ liệu
Giả sử Jay đang theo dõi Aayush và Aayush đăng bất cứ điều gì mới. Nguồn cấp tin tức của Jay sẽ cần được cập nhật bởi hệ thống:
- Lấy ID của những người theo dõi Aayush.
- Thêm bài viết mới: Thêm bài đăng của Aayush vào nhóm nguồn cấp dữ liệu tin tức của những người theo dõi ID đó.
- Xếp hạng các bài viết theo mức độ liên quan và thời gian của chúng.
- Cập nhật bộ nhớ đệm của bài đăng xếp hạng.
- Người theo dõi sẽ được thông báo khi bài viết mới được xuất bản.
Các thành phần
Kết nối của người dùng được duy trì bởi các máy chủ web.
Các thủ tục được chỉ ra ở trên được thực thi bởi máy chủ ứng dụng.
Bộ nhớ đệm và cơ sở dữ liệu:
- Người dùng / thực thể cơ sở dữ liệu quan hệ
- Cơ sở dữ liệu quan hệ (bài đăng)
- Thuộc tính hình ảnh / video: Aayush storge
- Siêu dữ liệu cơ sở dữ liệu quan hệ
Các dịch vụ được cá nhân hóa:
- Sản xuất thức ăn chăn nuôi
- Thông báo về nguồn cấp dữ liệu
6. Thiết kế chi tiết
Tạo nguồn cấp dữ liệu
Fan-out đọc triển khai ngây thơ:
Các vấn đề với việc triển khai cẩu thả này bao gồm:
- Người dùng có số lượng lớn bạn bè / người theo dõi sẽ nhận thấy sự chậm lại đáng kể vì chúng tôi phải sàng lọc, hợp nhất và xếp hạng một số lượng lớn các bài đăng.
- Khi người dùng tải trang của họ, chúng tôi xây dựng dòng thời gian. Điều này có thể chậm chạp và có nhiều độ trễ.
- Mỗi cập nhật trạng thái sẽ dẫn đến cập nhật nguồn cấp dữ liệu cho tất cả những người theo dõi để cập nhật trực tiếp. Điều này có thể gây ra sự chậm trễ đáng kể trong Dịch vụ tạo nguồn cấp dữ liệu tin tức của chúng tôi.
Chúng tôi có thể tạo trước niên đại và lưu vào bộ nhớ để tăng hiệu quả.
Sản xuất ngoại tuyến (Viết từ người hâm mộ)
Chúng tôi có thể có các máy chủ chuyên dụng liên tục tạo và lưu trữ nguồn cấp tin tức của người dùng trong bộ nhớ. Chúng tôi chỉ có thể cung cấp nguồn cấp tin tức từ vị trí được tạo trước, đã lưu bất cứ khi nào người dùng muốn.
Nguồn cấp dữ liệu của người dùng nên được lưu trữ trong bộ nhớ bao nhiêu mục nguồn cấp dữ liệu?
Điều chỉnh dựa trên hành vi sử dụng của bạn.
Chúng ta có nên tạo nguồn cấp tin tức cho tất cả người dùng (và lưu giữ nó trong bộ nhớ) không?
- Đối với những người không đăng nhập thường xuyên.
- Bộ nhớ đệm dựa trên LRU là một cách tiếp cận đơn giản.
- Giải pháp tốt hơn là tìm ra cách người dùng đăng nhập. Đó là khi nào? Bạn đang nói về những ngày nào trong tuần?
Xuất bản nguồn cấp dữ liệu
Fanout là quá trình gửi một bài đăng đến tất cả những người theo dõi bạn.
Fanout đọc (kéo)
Khi bạn yêu cầu một nguồn cấp tin tức, hệ thống sẽ nhận được yêu cầu đọc. Fanout read gửi yêu cầu đọc đến tất cả những người theo dõi bạn, yêu cầu họ đọc nội dung của họ.
Ưu điểm:
- Thủ tục viết không tốn kém.
- Khi đọc dữ liệu, sẽ dễ dàng hơn khi sử dụng các thuật toán tổng hợp khác nhau.
Nhược điểm:
- Đối với một người có nhiều người theo dõi, thao tác đọc khá tốn kém.
- Người dùng sẽ không thấy dữ liệu mới cho đến khi họ kéo nó.
- Khi chúng tôi kéo để tìm nạp các bài đăng gần đây nhất một cách thường xuyên, rất khó để tìm ra nhịp kéo thích hợp và hầu hết các yêu cầu kéo sẽ trả về câu trả lời trống, gây lãng phí tài nguyên.
Fanout ghi (đẩy)
Một yêu cầu viết thư được thực hiện đến hệ thống khi bạn gửi một bài viết mới. Yêu cầu viết được gửi đến tất cả những người theo dõi của bạn để cập nhật nguồn cấp tin tức của họ bằng cách sử dụng fanout write.
pro
- Quá trình đọc không tốn kém.
với
- Đối với một người dùng có hàng triệu người theo dõi, viết thủ tục quá tốn kém.
Thứ hạng của Nguồn cấp dữ liệu
Thay vì chỉ sắp xếp các nguồn cấp dữ liệu theo thứ tự thời gian, các thuật toán xếp hạng ngày nay còn cố gắng đảm bảo rằng các mục có mức độ liên quan cao hơn sẽ được ưu tiên.
- Chọn các yếu tố có thể giúp bạn quyết định mức độ liên quan của một mục nguồn cấp dữ liệu, chẳng hạn như số lượt thích, nhận xét và chia sẻ, thời gian mục được cập nhật lần cuối nếu bài viết có ảnh hoặc video, v.v.
- Tính điểm dựa trên các đặc điểm.
- Sử dụng điểm số để xếp hạng các bài viết.
Thiết lập các KPI như tỷ lệ giữ chân người dùng, thu nhập từ quảng cáo, v.v. để xem hệ thống xếp hạng của chúng tôi hiệu quả như thế nào.
Kết luận
Mặc dù thực tế rằng Instagram hoặc doanh nghiệp mẹ của nó, Facebook là một tập đoàn lớn, nó hiểu rõ hơn về thiết kế hệ thống.
Tôi đã cố gắng hết sức để cung cấp cho bạn bản tóm tắt cấp cao về nguồn cấp dữ liệu Instagram.
Tôi hy vọng nó hữu ích và bạn sẽ sử dụng nó tốt.
Bình luận