Phỏng vấn thiết kế hệ thống: Thiết kế Uber
"Thiết kế Uber" là một trong những đề bài thiết kế hệ thống phổ biến nhất vì nó đụng đến chỉ mục không gian địa lý, truyền phát vị trí theo thời gian thực, ghép cặp (matching) và lưu lượng ghi cao, tất cả cùng một lúc. Người phỏng vấn không tìm kiếm kiến trúc thực sự của Uber — họ muốn thấy bạn xác định phạm vi bài toán, đưa ra những lựa chọn có thể bảo vệ được, và suy luận thành lời về quy mô.
Hãy làm theo một trình tự có chủ đích: làm rõ yêu cầu, ước lượng quy mô, phác thảo các thực thể và API cốt lõi, thiết kế dữ liệu và luồng ghép cặp, sau đó bàn về các điểm nghẽn và đánh đổi. Hướng dẫn dưới đây theo trình tự đó để bạn luyện tập cấu trúc, không chỉ câu trả lời.
1. Làm rõ yêu cầu
Tách yêu cầu chức năng khỏi phi chức năng, và cố định phạm vi trước khi thiết kế. Hành khách đặt một chuyến đi và thấy lái xe tiến đến theo thời gian thực; lái xe bật trạng thái online và nhận các yêu cầu gần đó; hệ thống ghép cặp họ và theo dõi chuyến đi đến khi hoàn thành.
- Chức năng: đặt chuyến đi, ghép cặp với lái xe gần đó, theo dõi chuyến đi theo thời gian thực, tính cước, lịch sử chuyến đi.
- Phi chức năng: ghép cặp độ trễ thấp (vài giây), tính khả dụng cao, cập nhật vị trí theo thời gian thực, tính nhất quán rằng một lái xe chỉ được gán cho đúng một hành khách.
- Ngoài phạm vi (hãy nói rõ): phần nội bộ xử lý thanh toán, đánh giá, ML tính giá cao điểm — chỉ cần nêu ra rồi gác lại.
2. Ước lượng quy mô
Những con số ước tính thô làm cơ sở cho các lựa chọn sau này. Giả sử có khoảng 10 triệu lái xe hoạt động hằng ngày, mỗi 4 giây gửi một tín hiệu vị trí — tức là khoảng 2,5 triệu lượt ghi mỗi giây đối với dữ liệu vị trí, một tải trọng nặng về ghi khiến việc dùng một bảng quan hệ đơn giản làm đường dẫn nóng bị loại ngay.
3. Các thành phần và API cốt lõi
Phác thảo các dịch vụ và luồng yêu cầu. Giữ luồng ghép cặp độc lập với kho lưu trữ chuyến đi bền vững để mỗi phần có thể mở rộng theo đặc tính riêng của nó.
- Dịch vụ vị trí: tiếp nhận tín hiệu từ lái xe, giữ vị trí hiện tại trong một chỉ mục không gian địa lý trong bộ nhớ.
- Dịch vụ ghép cặp: khi có yêu cầu đặt xe, truy vấn các lái xe online gần đó và gán một người.
- Dịch vụ chuyến đi: bản ghi bền vững về vòng đời chuyến đi (đã yêu cầu → đã ghép cặp → đang diễn ra → hoàn tất).
- Thông báo/truyền phát: gửi vị trí trực tiếp của lái xe đến hành khách (WebSocket/long-poll).
4. Ghép cặp theo không gian địa lý — trọng tâm của bài toán
Đây là điều người phỏng vấn muốn nghe nhất. Lưu trữ kinh độ/vĩ độ thô rồi quét qua là O(n); bạn cần một chỉ mục không gian. Hãy giải thích quadtree hoặc geohashing: chia bản đồ thành các ô (cell) để 'tìm lái xe gần điểm này' trở thành truy vấn vài ô, không phải quét toàn bộ.
Geohashing mã hóa một khu vực thành một chuỗi ngắn, trong đó tiền tố chung biểu thị sự gần nhau về không gian, biến 'gần' thành một truy vấn tiền tố. Các ô hiện tại của lái xe nằm trong một kho lưu trữ trong bộ nhớ (ví dụ Redis) để đọc nhanh và cập nhật thường xuyên; độ chi tiết của ô là một đánh đổi có thể điều chỉnh giữa độ chính xác và mức độ phân tán truy vấn.
5. Khả năng mở rộng và điểm nghẽn
Chỉ ra các điểm chịu áp lực và cách bạn sẽ giảm tải. Luồng 2,5 triệu lượt ghi vị trí mỗi giây là điểm chiếm ưu thế nhất.
- Phân mảnh (shard) chỉ mục vị trí theo địa lý — lái xe và hành khách của một thành phố được xử lý bởi cùng một shard, giữ việc ghép cặp ở mức cục bộ.
- Hấp thụ đợt tăng vọt ghi bằng một kho lưu trữ trong bộ nhớ và các lượt ghi bền vững không đồng bộ; bạn không cần mọi tín hiệu phải vào một cơ sở dữ liệu bền vững.
- Đảm bảo một lái xe-một hành khách bằng một phép gán nguyên tử (khóa hoặc cập nhật có điều kiện) để tránh đặt trùng.
- Dùng một hàng đợi tin nhắn (Kafka) giữa khâu tiếp nhận vị trí và các bên tiêu thụ phía sau để tách rời các đợt tăng vọt.
6. Những đánh đổi cần nói ra
Kết thúc bằng cách nêu ra những căng thẳng mà người phỏng vấn đánh giá cao: nhất quán mạnh so với nhất quán cuối cùng (việc gán lái xe phải mạnh; việc hiển thị vị trí có thể là cuối cùng), tốc độ trong bộ nhớ so với độ bền, và độ chính xác kích thước ô so với mức độ phân tán truy vấn. Nói rõ những điều này là điểm khác biệt giữa một câu trả lời đạt và một câu trả lời xuất sắc.
Luyện tập thiết kế hệ thống Uber 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.
