Điều gì sẽ xảy ra khi đăng bài trên facebook hoặc instagram ??? Bí mật đằng sau hệ thống News feed
Bạn có bao giờ tò mò về cơ chế hoạt động đằng sau những bảng tin liên tục cập nhật trên Facebook, Instagram hay Twitter? Nếu có, đây là cơ hội để bạn thỏa mãn trí tò mò và thử sức với thử thách thiết kế hệ thống news feed - một câu hỏi phỏng vấn hóc búa nhưng cũng đầy thú vị!
Hãy tưởng tượng bạn là một kỹ sư phần mềm, được giao nhiệm vụ thiết kế hệ thống bảng tin cho một mạng xã hội khổng lồ với hàng triệu người dùng. Liệu bạn có thể đáp ứng được yêu cầu khắt khe về hiệu suất, tính linh hoạt và khả năng mở rộng?
Vậy cùng Sydexa.com thử bắt tay vào thiết kế hệ thống cực kỳ thú vị này nha
Bạn cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha. Và chúng mình có động lực ra những bài viết thú vị hơn nữa 😄😄😄
Cùng Sydexa khám phá công nghệ vô cùng quan trọng này nha!!! 😄😄
Chúng mình có tạo Group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha 😄😄😄
Các bạn tham gia để gây dựng cộng đồng System Design Việt Nam thật lớn mạnh nhé 😍😍😍
Cộng Đồng System Design Việt Nam: https://www.facebook.com/groups/sydexa
Kênh TikTok: https://www.tiktok.com/@sydexa.com
Xác định yêu cầu và phạm vi thiết kế
Để thiết kế hệ thống hiệu quả, cần nắm rõ yêu cầu và phạm vi mà hệ thống sẽ đáp ứng. Cùng làm rõ một vài yếu cầu cho bài toán nào
Sydexa: Hệ thống này sẽ được triển khai trên nền tảng nào? Ứng dụng di động, ứng dụng web, hay cả hai?
Khách hàng: Chúng tôi muốn hệ thống có thể truy cập trên cả hai nền tảng.
Sydexa: Tính năng nào là cốt lõi của hệ thống?
Khách hàng: Tính năng quan trọng nhất là cho phép người dùng đăng bài và xem bài đăng của bạn bè trên bảng tin.
Sydexa: Cách thức sắp xếp bảng tin như thế nào? Theo thời gian đăng hay theo một tiêu chí nào khác?
Khách hàng: Để đơn giản, chúng tôi muốn bảng tin được sắp xếp theo thứ tự thời gian.
Sydexa: Mỗi người dùng có thể kết bạn với tối đa bao nhiêu người?
Khách hàng: Chúng tôi ước tính mỗi người dùng sẽ có khoảng 10000 bạn bè.
Sydexa: Khách hàng dự kiến hệ thống sẽ có bao nhiêu người dùng hoạt động mỗi ngày?
Khách hàng: Chúng tôi kỳ vọng sẽ có khoảng 10 triệu người dùng hoạt động hàng ngày.
Sydexa: Bảng tin có hỗ trợ các định dạng nội dung nào?
Khách hàng: Bảng tin cần hỗ trợ văn bản, hình ảnh và video.
Thông qua quá trình trao đổi này, Sydexa đã thu thập được các yêu cầu cơ bản về hệ thống. Đây là bước đầu tiên quan trọng để tiến hành thiết kế hệ thống một cách chi tiết và hiệu quả.
Thiết kế kiến trúc tổng quan
Hệ thống hoạt động dựa trên hai quy trình chính:
- Quá trình đăng bài: Mỗi khi người dùng đăng bài viết mới, hệ thống sẽ tiến hành lưu trữ nội dung bài viết vào cơ sở dữ liệu và đồng thời sao chép vào bộ nhớ đệm để tăng tốc độ truy xuất thông tin. Bên cạnh đó, hệ thống cũng sẽ tự động cập nhật bài viết mới này vào luồng bài viết của tất cả bạn bè của người dùng đó.
- Quá trình xây dựng trang news feed: Để đảm bảo tính đơn giản và tối ưu hóa trải nghiệm người dùng, news feed của mỗi cá nhân được hình thành bằng cách tập hợp toàn bộ bài viết từ bạn bè của họ và sắp xếp theo thứ tự thời gian từ mới đến cũ. Nhờ đó, những bài viết mới nhất sẽ luôn được hiển thị ở vị trí đầu tiên trên news feed.
API cho Newsfeed
API Newsfeed đóng vai trò là cầu nối chính giữa ứng dụng client và máy chủ, cho phép chúng tương tác với nhau. Các API này hoạt động dựa trên giao thức HTTP, tạo điều kiện cho client thực hiện các thao tác như đăng bài, lấy news feed, kết bạn, v.v. Trong số đó, hai API quan trọng nhất là API đăng bài và API truy xuất news feed.
API Đăng Bài
API đăng bài được sử dụng để người dùng có thể chia sẻ những bài viết mới lên news feed của mình. Khi người dùng thực hiện thao tác đăng bài, một yêu cầu HTTP POST sẽ được gửi đến máy chủ. Cấu trúc của API này sẽ có dạng POST /v1/me/feed.
Yêu cầu này cần phải bao gồm tham số thiết yếu:
- content: Đây là phần nội dung văn bản mà người dùng muốn truyền tải trong bài viết của mình.
API Cập Nhật News Feed
API cập nhật news feed có nhiệm vụ cung cấp cho người dùng những thông tin mới nhất, bao gồm các bài đăng từ bạn bè và những người họ theo dõi. Khi người dùng muốn xem những nội dung mới nhất, một yêu cầu HTTP GET sẽ được gửi tới máy chủ. API này được thiết kế với cấu trúc GET /v1/me/feed.
Thiết kế luồng đăng bài viết:
Hình minh họa dưới đây thể hiện thiết kế tổng quan của luồng đăng bài.
Người dùng: Truy cập bảng tin thông qua trình duyệt web hoặc ứng dụng di động và đăng bài viết mới với nội dung "hellovietnam" bằng cách sử dụng API: /v1/me/feed?content=hellovietnam.
Bộ cân bằng tải (Load Balancer): Tiếp nhận yêu cầu từ người dùng và phân phối nó đến một trong các máy chủ web sẵn có dựa trên thuật toán cân bằng tải, đảm bảo hiệu suất và khả năng mở rộng của hệ thống.
Máy chủ web (Web Servers): Nhận yêu cầu từ bộ cân bằng tải, tiến hành xác định loại yêu cầu và chuyển tiếp đến các service nội bộ (internal services) tương ứng để xử lý.
Service đăng bài (Post Service): Lưu trữ nội dung bài viết "hellovietnam" vào cả cơ sở dữ liệu và bộ nhớ đệm (cache) để tối ưu hóa tốc độ truy xuất và đảm bảo tính sẵn sàng của dữ liệu.
Service phân phối bài viết (Fanout Service): Đẩy nội dung bài viết mới đến news feed của bạn bè người dùng. Dữ liệu news feed được lưu trữ trong bộ nhớ đệm để tăng tốc độ truy xuất khi người dùng khác xem bảng tin.
Service gửi thông báo (Notification Service): Gửi thông báo cho bạn bè của người dùng về bài đăng mới thông qua các kênh như thông báo đẩy (push notification) hoặc thông báo trong ứng dụng.
Thiết kế Luồng Xây Dựng News Feed
Trong phần này, chúng ta thảo luận về cách tạo ra news feed của mỗi người dùng. Hình minh họa dưới đây cho thấy thiết kế tổng quan của hệ thống
Người dùng: Gửi yêu cầu truy xuất news feed thông qua đường dẫn: /v1/me/feed
.
Bộ cân bằng tải (Load Balancer): Tiếp nhận yêu cầu và phân phối nó một cách thông minh đến một trong các máy chủ web sẵn có, đảm bảo hiệu suất và khả năng chịu tải của hệ thống.
Máy chủ web (Web Servers): Nhận diện yêu cầu và chuyển hướng nó đến dịch vụ news feed (newsfeed service) để xử lý.
Service News Feed (Newsfeed Service): Truy xuất dữ liệu news feed từ bộ nhớ đệm (newsfeed cache)
Bộ nhớ đệm News Feed (Newsfeed Cache): Lưu trữ danh sách các ID bài viết cần thiết để hiển thị trên news feed của người dùng, giúp giảm thiểu thời gian truy vấn cơ sở dữ liệu và tối ưu hóa hiệu suất hệ thống.
3. Đào sâu vào thiết kế hệ thống
Ở phần trước, chúng ta đã có cái nhìn tổng quan về hai quy trình cốt lõi của hệ thống: đăng bài và xây dựng news feed. Bây giờ, hãy cùng nhau khám phá chi tiết từng quy trình để hiểu rõ hơn về cách thức hoạt động của hệ thống này.
Đăng Bài (Feed Publishing)
Hình minh họa trên phác thảo chi tiết quy trình đăng bài. Trong phần thiết kế tổng quan trước đó, chúng ta đã đề cập đến hầu hết các thành phần. Bây giờ, hãy tập trung vào hai thành phần quan trọng: máy chủ web (web servers) và dịch vụ phân phối (fanout service).
Máy chủ web (Web Servers)
Bên cạnh việc giao tiếp với các ứng dụng hoặc trình duyệt của người dùng (client), máy chủ web còn đảm nhiệm hai nhiệm vụ quan trọng: xác thực và giới hạn tần suất đăng bài.
Xác thực: Chỉ những người dùng đã đăng nhập thành công mới được phép đăng bài. Điều này giúp đảm bảo tính bảo mật và tránh việc đăng bài trái phép.
Giới hạn tần suất đăng bài: Hệ thống sẽ kiểm soát số lượng bài đăng mà một người dùng có thể thực hiện trong một khoảng thời gian nhất định. Đây là biện pháp quan trọng để ngăn chặn spam và các nội dung không mong muốn, giúp duy trì chất lượng của news feed.
Dịch vụ Phân phối bài viết (Fanout Service)
Fanout là quá trình lan truyền một bài đăng tới toàn bộ bạn bè của người dùng. Có hai mô hình fanout phổ biến:
- Fanout on write (fanout khi ghi - hay còn gọi là mô hình đẩy - push model): News feed được tính toán và cập nhật ngay tại thời điểm đăng bài. Bài đăng mới sẽ được gửi trực tiếp vào bộ nhớ đệm của bạn bè (News Feed Cache) ngay khi nó được công khai, giúp họ nhận được thông tin mới nhất ngay lập tức.
- Ưu điểm:
- News feed được cập nhật theo thời gian thực, mang đến trải nghiệm người dùng liền mạch.
- Tốc độ truy xuất news feed nhanh chóng do đã được tính toán trước đó.
- Nhược điểm:
- Nếu người dùng có số lượng bạn bè lớn, việc truy vấn danh sách bạn bè và cập nhật news feed cho tất cả họ sẽ tiêu tốn nhiều thời gian và tài nguyên hệ thống. Đây được gọi là vấn đề "điểm nóng" (hotkey).
- Đối với những người dùng không hoạt động thường xuyên, việc tính toán trước news feed có thể gây lãng phí tài nguyên.
- Fanout on read (Fanout khi đọc - hay còn gọi là mô hình kéo - pull model): News feed được tạo ra theo yêu cầu, tại thời điểm người dùng truy cập vào trang chủ. Các bài đăng gần đây sẽ được lấy về và hiển thị cho người dùng.
- Ưu điểm:
- Hiệu quả hơn đối với người dùng không hoạt động thường xuyên, tránh lãng phí tài nguyên tính toán.
- Không gặp phải vấn đề "điểm nóng" do dữ liệu không được đẩy tới bạn bè theo thời gian thực.
- Nhược điểm:
- Tốc độ truy xuất news feed có thể chậm hơn do không được tính toán trước.
Giải pháp Kết hợp (Hybrid Approach):
Để tận dụng tối đa ưu điểm và hạn chế nhược điểm của cả hai mô hình trên, chúng ta sẽ áp dụng một giải pháp kết hợp linh hoạt.
Mô hình đẩy (Push Model): Được ưu tiên sử dụng cho đa số người dùng, đảm bảo trải nghiệm truy cập news feed nhanh chóng và mượt mà.
Mô hình kéo (Pull Model): Được áp dụng cho những người dùng đặc biệt như người nổi tiếng hoặc người có số lượng bạn bè/người theo dõi lớn. Trong trường hợp này, hệ thống cho phép người theo dõi chủ động "kéo" nội dung bài đăng theo nhu cầu, tránh tình trạng quá tải hệ thống. Đồng thời, kỹ thuật băm nhất quán (consistent hashing) được sử dụng để phân phối yêu cầu và dữ liệu một cách đồng đều, giảm thiểu hiệu quả vấn đề "điểm nóng" (hotkey).
Với cách tiếp cận này, hệ thống vừa đảm bảo hiệu suất cao cho người dùng thông thường, vừa có khả năng thích ứng linh hoạt với những trường hợp đặc biệt, mang đến trải nghiệm tốt nhất cho mọi người dùng.
Chi tiết về Fanout Service:
- Lấy ID bạn bè: Hệ thống sẽ bắt đầu bằng cách truy vấn cơ sở dữ liệu đồ thị (graph database) để nhanh chóng xác định danh sách bạn bè của người dùng. Cơ sở dữ liệu đồ thị được thiết kế đặc biệt để quản lý các mối quan hệ phức tạp như mạng lưới bạn bè, giúp việc này trở nên cực kỳ hiệu quả.
- Lấy thông tin bạn bè: Tiếp theo, hệ thống sẽ xem xét thông tin bạn bè được lưu trữ trong bộ nhớ đệm người dùng (User Cache). Điều này cho phép hệ thống lọc ra những người bạn mà người dùng đã chặn hoặc đã tùy chỉnh cài đặt chia sẻ nội dung, đảm bảo rằng bảng tin của họ chỉ hiển thị những gì họ muốn xem.
- Gửi danh sách bạn bè và ID bài đăng mới: Danh sách bạn bè đã được cá nhân hóa, cùng với ID của bài đăng mới, sẽ được gửi đến một hàng đợi tin nhắn (message queue). Hàng đợi này hoạt động như một người trung gian đáng tin cậy, đảm bảo rằng dữ liệu được truyền đi một cách an toàn và hiệu quả.
- Fanout workers: Lấy dữ liệu từ hàng đợi tin nhắn và lưu trữ dữ liệu newsfeed trong bộ nhớ đệm. Bộ nhớ đệm news feed (news feed cache) có thể được coi là một bảng ánh xạ
<post_id, user_id>
. - Lưu trữ
<post_id, user_id>
: Trong bộ nhớ đệm sẽ có dạng như sau:
Bộ nhớ đệm news feed(news feed cache):
- Bộ nhớ đệm news feed hoạt động như một bảng ánh xạ
<post_id, user_id>
. Khi có bài đăng mới, nó sẽ được thêm vào bảng. - Để tiết kiệm bộ nhớ, chỉ có ID được lưu trữ, không phải toàn bộ đối tượng người dùng và nội dung bài đăng.
- Có một giới hạn cấu hình về số lượng ID được lưu trữ. Vì người dùng thường chỉ quan tâm đến nội dung mới nhất, tỷ lệ cache miss (không tìm thấy dữ liệu trong bộ nhớ đệm) là thấp.
Xem News Feed (Newsfeed retrieval)
Hình minh họa dưới đây phác thảo thiết kế chi tiết cho quá trình truy xuất news feed.
Như hình mình họa, nội dung đa phương tiện (hình ảnh, video,...) được lưu trữ trong CDN để truy xuất nhanh chóng. Chúng ta hãy xem cách client truy xuất news feed:
- Người dùng gửi yêu cầu: Người dùng gửi yêu cầu lấy dữ liệu news feed mới nhất thông qua API:
/v1/me/feed
. - Bộ cân bằng tải (Load balancer): Phân phối yêu cầu đến các máy chủ web (web servers).
- Máy chủ web (Web servers): Gọi đến news feed service để lấy các bài đăng của bạn bè.
- News feed service: Lấy danh sách ID bài đăng từ news feed cache.
- Hoàn thiện dữ liệu news feed: News feed của người dùng không chỉ là danh sách ID bài đăng. Nó bao gồm tên người dùng, ảnh đại diện, nội dung bài đăng, hình ảnh bài đăng,... Do đó, news feed service lấy các đối tượng người dùng và bài đăng hoàn chỉnh từ các bộ nhớ đệm (user cache và post cache) để xây dựng news feed đầy đủ thông tin.
- Trả về news feed hoàn thiện: News feed hoàn thiện được trả về cho client ở định dạng JSON để hiển thị.
Kiến trúc bộ nhớ đệm (Cache architecture)
Bộ nhớ đệm cực kỳ quan trọng đối với news feed system. Hệ thống này chia bộ nhớ đệm thành 5 tầng:
News Feed: Lưu trữ ID của news feeds.
Content: Lưu trữ dữ liệu của tất cả các bài đăng. Nội dung phổ biến được lưu trữ trong bộ nhớ đệm nóng (hot cache) để truy cập nhanh hơn.
Social Graph: Lưu trữ dữ liệu mối quan hệ giữa người dùng (ví dụ: ai là bạn bè của ai).
Action: Lưu trữ thông tin về việc người dùng đã thích, trả lời hoặc thực hiện các hành động khác trên một bài đăng.
Counters: Lưu trữ các bộ đếm cho lượt thích, trả lời, người theo dõi, đang theo dõi,...
Lưu ý:
- Việc sử dụng bộ nhớ đệm ở nhiều lớp khác nhau giúp tối ưu hóa tốc độ truy xuất và giảm tải cho cơ sở dữ liệu.
- Mỗi lớp bộ nhớ đệm có thể sử dụng công nghệ lưu trữ khác nhau tùy thuộc vào yêu cầu về tốc độ, dung lượng và thời gian lưu trữ dữ liệu.
- Ví dụ: bộ nhớ đệm News Feed có thể sử dụng Redis, bộ nhớ đệm Content có thể sử dụng Memcached, v.v.
Tổng kết
Trong bài viết này, chúng ta đã tìm hiểu về cách thiết kế một news feed system . Thiết kế của chúng ta bao gồm hai luồng: Đăng bài (feed publishing) và xem bài đăng (newsfeed retrieval).
Như chúng ta đã thấy, việc thiết kế một hệ thống news feed không hề đơn giản và không có một giải pháp duy nhất phù hợp cho mọi tình huống. Mỗi công ty có những yêu cầu và hạn chế riêng, đòi hỏi sự linh hoạt và khả năng thích ứng trong thiết kế.
Điều quan trọng là phải hiểu rõ những ưu nhược điểm của từng lựa chọn thiết kế và công nghệ, từ đó đưa ra quyết định phù hợp nhất với bối cảnh cụ thể.
Và đó là một chuyến thám công nghệ giúp cách xây dựng một hệ thống news feed hoạt động sẵn sàng cho lượng người dùng lớn. Sydexa hẹn các bạn ở một bài viết thú vị nữa nha 😍😍😍😍
Nếu thấy bài viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha 😄😄😄
Lời nhắn
Chúng mình có tạo Group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha 😄😄😄
Các bạn tham gia để gây dựng cộng đồng System Design Việt Nam thật lớn mạnh nhé 😍😍😍
Cộng Đồng System Design Việt Nam: https://www.facebook.com/groups/sydexa
Kênh TikTok: https://www.tiktok.com/@sydexa.com
All rights reserved