Phỏng vấn thiết kế hệ thống: Thiết kế Twitter
"Thiết kế Twitter" là bài toán kinh điển về tạo bảng tin. Nó trông có vẻ đơn giản — đăng một tweet, đọc một dòng thời gian — nhưng phần thú vị là việc tạo dòng thời gian chính của mỗi người dùng ở quy mô lớn, nơi câu trả lời đúng là một chiến lược fan-out lai. Người phỏng vấn muốn thấy bạn phát hiện ra rằng cả hai cách tiếp cận đơn giản đều thất bại, và suy luận để đi đến sự kết hợp đó.
Hãy tiến hành có chủ đích: làm rõ yêu cầu, ước lượng tỷ lệ đọc/ghi, thiết kế lưu trữ tweet, sau đó là dòng thời gian — so sánh fan-out-on-write với fan-out-on-read và đi đến giải pháp lai xử lý bài toán người nổi tiếng. Hướng dẫn dưới đây theo đúng lộ trình đó.
1. Làm rõ yêu cầu
Giới hạn vào bài toán bảng tin cốt lõi. Người dùng đăng tweet, theo dõi người khác, và đọc một dòng thời gian chính hợp nhất các tweet từ tất cả những người họ theo dõi, mới nhất lên đầu.
- Chức năng: đăng một tweet, theo dõi/bỏ theo dõi, dòng thời gian chính (những người bạn theo dõi), dòng thời gian người dùng (một tác giả); tìm kiếm cơ bản ngoài phạm vi trừ khi được yêu cầu.
- Phi chức năng: cực kỳ nặng về đọc, đọc dòng thời gian độ trễ thấp, tính khả dụng cao; nhất quán cuối cùng cho dòng thời gian là chấp nhận được.
- Cần làm rõ: media, trả lời/chuỗi bình luận, và xếp hạng — nêu ra, rồi giới hạn phạm vi thành một bảng tin theo thứ tự thời gian cho vòng này.
2. Ước lượng quy mô và tỷ lệ đọc/ghi
Tỷ lệ này chi phối toàn bộ thiết kế. Số lượt đọc vượt xa số lượt ghi — người dùng cuộn dòng thời gian của họ thường xuyên hơn nhiều so với việc đăng bài. Với hàng trăm triệu người dùng, hệ thống phải làm cho việc đọc dòng thời gian trở nên rẻ, dù điều đó khiến việc ghi đắt hơn. Quan sát duy nhất này hướng đến việc tính toán trước dòng thời gian.
3. Lưu trữ tweet
Tweet bản thân nó là dữ liệu đơn giản, nặng về việc thêm mới (append). Lưu trữ chúng trong một kho phân vùng theo chiều ngang, với khóa là ID tweet (dùng một ID có thể sắp xếp theo thời gian như Snowflake ID để thứ tự được tích hợp sẵn). Một kho lưu trữ đồ thị xã hội riêng biệt giữ các quan hệ người theo dõi/đang theo dõi.
- Tweet: kho lưu trữ phân tán, phân vùng theo ID tweet; ID có thể sắp xếp theo thời gian mang lại thứ tự thời gian với chi phí thấp.
- Đồ thị xã hội: ai theo dõi ai, được tối ưu hóa cho 'lấy tất cả người theo dõi của X' và 'lấy tất cả người X theo dõi'.
- Một cache (Redis) giữ dữ liệu nóng — các tweet gần đây và dòng thời gian đã được tính toán trước.
4. Tạo dòng thời gian: fan-out khi ghi so với khi đọc
Đây là trọng tâm của bài toán. Fan-out-on-write (đẩy) chèn mỗi tweet mới vào danh sách dòng thời gian đã tính toán trước của mỗi người theo dõi tại thời điểm đăng — việc đọc dòng thời gian trở thành một tra cứu cache rẻ, nhưng một bài đăng từ người có hàng triệu người theo dõi sẽ kích hoạt hàng triệu lượt ghi. Fan-out-on-read (kéo) xây dựng dòng thời gian tại thời điểm đọc bằng cách hợp nhất các tweet gần đây từ tất cả những người bạn theo dõi — ghi rẻ, nhưng đọc chậm và đắt đối với người dùng theo dõi nhiều tài khoản.
- Fan-out-on-write: đọc nhanh, ghi đắt; rất tốt cho người dùng thông thường.
- Fan-out-on-read: ghi rẻ, đọc đắt; cần thiết cho các tài khoản có số lượng người theo dõi khổng lồ.
5. Bài toán người nổi tiếng và giải pháp lai
Không cách tiếp cận thuần túy nào thắng, vì vậy hãy kết hợp chúng. Sử dụng fan-out-on-write cho đại đa số người dùng, nhưng đối với các tài khoản 'người nổi tiếng' có số lượng người theo dõi rất lớn, KHÔNG fan-out các tweet của họ khi ghi. Thay vào đó, tại thời điểm đọc, hợp nhất dòng thời gian đã tính toán trước của một người theo dõi với một lượt kéo trực tiếp từ số ít người nổi tiếng mà họ theo dõi. Điều này giới hạn sự khuếch đại ghi trong khi vẫn giữ việc đọc nhanh — câu trả lời mà người phỏng vấn muốn nghe.
6. Những đánh đổi cần nói ra
Kết thúc bằng những căng thẳng: khuếch đại ghi so với độ trễ đọc (toàn bộ quyết định fan-out), chi phí lưu trữ của dòng thời gian tính toán trước so với việc tính toán lại chúng, và tính nhất quán — một vài giây chậm trễ trước khi một tweet xuất hiện trong dòng thời gian của người theo dõi là chấp nhận được, vì vậy nhất quán cuối cùng cho phép bạn mở rộng quy mô. Nêu rõ ngưỡng của giải pháp lai (cách bạn phân loại một 'người nổi tiếng') cho thấy khả năng đánh giá ở cấp độ senior.
Luyện tập thiết kế hệ thống Twitter với trợ giúp theo thời gian thực
Trợ lý phỏng vấn thiết kế hệ thống của Natively có thể giúp bạn giữ cấu trúc mạch lạc trong một vòng phỏng vấn trực tiếp — gợi ý khía cạnh tiếp theo cần đề cập và hiển thị các đánh đổi theo thời gian thực, tất cả trên chính thiết bị của bạn.
