blog.dopana

Back

Thiết kế một mạng xã hội (Social Network) như Twitter/X hay Threads đòi hỏi khả năng xử lý lượng ghi (Write throughput) cao, phân phối tin tức (Newsfeed Generation) theo thời gian thực và quản lý tài nguyên phương tiện (Media assets) toàn cầu với độ trễ thấp.

Sử dụng hệ sinh thái Cloudflare Edge, chúng ta có thể xây dựng một mạng xã hội hoàn toàn Serverless với Cloudflare Workers, R2 Object Storage, D1 Database, KV, và Durable Objects.

1. Bài toán: Thách thức khi thiết kế Mạng xã hội#

Khi người dùng đăng bài viết kèm hình ảnh/video, hệ thống cần giải quyết 3 bài toán lớn:

  • Feed Generation (Fanout Service): Phân phối bài viết đến hàng ngàn hoặc hàng triệu người theo dõi (Followers).
  • Media Storage & CDN: Tải lên và truy xuất media với chi phí tối ưu và băng thông miễn phí (Zero Egress Fee).
  • Global Consistency & Caching: Đảm bảo đếm lượt Like, Comment và User Profile cập nhật nhanh chóng tại mọi Point of Presence (PoP).

2. Kiến trúc tổng quan (Architecture Overview)#

Hệ thống kết hợp các thành phần của Cloudflare như sau:

  1. Cloudflare Workers: API Gateway xử lý Auth, Post creation, và Feed retrieval.
  2. Cloudflare R2: Lưu trữ ảnh/video trực tiếp không tốn phí egress.
  3. Cloudflare D1: SQLite cơ sở dữ liệu lưu trữ quan hệ User, Post, và Follow.
  4. Cloudflare KV: Cache Timeline Feed của từng User.
  5. Durable Objects (DO): Đóng vai trò Fanout Engine xử lý phân phối feed và bộ đếm lượt Like/Comment tập trung.
+--------------+       HTTP / Upload      +---------------------+
|  User Client | <----------------------> | Cloudflare Workers  |
+--------------+                          +---------------------+
                                            /     |          \
                                  Presigned URL   |           \ Cache Feed
                                        v         v            v
                                   +-------+  +-------+    +-------+
                                   |  R2   |  |  D1   |    |  KV   |
                                   +-------+  +-------+    +-------+
                                                  |
                                            Async Event
                                                  v
                                     +--------------------------+
                                     | Durable Object (Fanout)  |
                                     +--------------------------+
text

3. Chi tiết triển khai Code (Implementation Details)#

3.1. Fanout Queue & Feed Storage với Durable Objects#

Khi một người dùng nổi tiếng đăng bài (Celebrity Post), ta sử dụng Fanout Pattern kết hợp giữa Durable Objects và KV để push feed tới danh sách người theo dõi.

3.2. Direct Upload Media với Cloudflare R2#

Để giảm tải cho Workers, ta cấp Presigned URL cho client upload trực tiếp ảnh/video vào R2 Bucket.

src/media.ts
export async function generateUploadUrl(env: Env, filename: string): Promise<string> {
  // Tạo R2 Signed Upload Request
  const objectKey = `posts/${Date.now()}-${filename}`;
  const signedUrl = await env.MY_R2_BUCKET.createSignedUrl(objectKey, {
    expiresIn: 3600,
    method: 'PUT'
  });

  return signedUrl;
}
typescript

[!NOTE] Cloudflare R2 không tính phí Egress (Egress-free), giúp tiết kiệm hàng ngàn USD chi phí băng thông khi phân phối hình ảnh/video chất lượng cao toàn cầu.

4. Ưu điểm & Điểm lưu ý (Trade-offs)#

[!TIP] Ưu điểm:

  • Zero Infrastructure Management: Không cần quản lý server Redis/Kafka hay Kubernetes cluster.
  • Low Latency Feed: Timeline feed được đọc trực tiếp từ Cloudflare KV đặt tại Edge gần người dùng.

[!WARNING] Giới hạn:

  • Fanout-on-Write vs Fanout-on-Read: Với tài khoản có hàng triệu follower, nên kết hợp Hybird Fanout (chỉ Push feed cho active users, những người dùng khác dùng Fanout-on-Read từ D1).

5. Tài liệu tham khảo#