Cách xử lý nhiều request tới server
Trước đây blog Code Dạo toàn viết về code, hôm nay mình đổi phong cách, viết lên tầm thiết kế hệ thống cho nó máu! Show Kì này, chúng ta tìm sẽ thử thiết kế một hệ thống lớn, phục vụ hàng triệu người dùng. Đây là một câu hỏi khá là khó và không có câu trả lời chính xác (Tương tự những câu: vì sao phụ nữ buồn, làm sao để con gái sướng). Nhân hôm trước, mình có làm bài phỏng vấn tại công ty nọ, có một câu hỏi yêu cầu thiết kế một ứng dụng chat sao cho có thể scale cho hàng triệu người dùng. Trước giờ mình không có kinh nghiệm với cái này, qua quá trình tự tìm hiểu cũng đủ biết sơ sơ để chém gió. Vì vậy mình chia sẻ cho các bạn, Mọi người cùng đọc và góp ý nhé. Tại sao thiết kế hệ thống hàng triệu người dùng lại khó?Thiết kế một hệ thống cho 1, 2 người dùng, chạy trên máy local vô cùng đơn giản. Tuy nhiên, một bài toán dễ đến mấy, khi scope lên đến tầm hàng triệu người dùng cũng sẽ trở thành một bài toán lớn và khó hơn rất nhiều lần. Tại sao vậy? Lấy ví dụ nhé, một con server cùi có thể chịu được 100 request mỗi giây. Khi lượng request lên đến 10000 thì có thể nâng cấp server xịn hơn. Nhưng khi lượng request lên đến 1-2 triệu thì không thể nâng cấp server được nữa, mà phải thiết kế sao cho nhiều server chạy cùng lúc. Hoặc đơn thuần như việc sắp xếp dữ liệu, với 1000 entry thì chạy trong nháy mắt, nhưng với chục triệu, trăm triệu entry thì có thể chạy đến hàng tiếng, lúc này ta phải lựa chọn thuật giải tối ưu. Vấn đề này liên quan tới scalability (khả năng mở rộng của hệ thống). Mặt khác, không phải developer nào cũng có cơ hội để giải quyết bài toán scalability. Với các ứng dụng nhỏ,những dự án outsource, ít người đôi khi chỉ cần dùng một số giải pháp đơn giản là đã giải quyết được. Ở các công ty lớn như Facebook, Uber, Google, đây là bài toán bắt buốc phải giải. Ở Việt Nam chắc sẽ có một số công ty lớn như Zalo, Lozi, Tiki, Thế Giới Di Động mới cần giải quyết vấn đề scalability này. Ba yếu tố quan trọng của một hệ thốngKhi thiết kế một hệ thống phục vụ hàng triệu người dùng, ta cần để ý 3 yếu tố quan trọng nhất: Performance, Availability, và Scalability:
Rất khó để đảm bảo 3 yếu tố này! May thay, đây là bài toàn đã được hàng chục công ty lớn giải, do đó chúng ta có một số phương pháp, thiết kế sẵn có để giải quyết vấn đề này! Các hệ thống của Google, Linkedin, Facebook phải phục vụ hàng trăm triệu người dùngCác thiết kế thường dùng cho hệ thống lớn1. Đảm bảo perfomance
2. Đảm bảo Availability
3. Đảm bảo scalability
KếtNhững kĩ thuật mình nhắc đến trong bài chỉ mang tính chất “cưỡi ngựa xem hoa” (Vậy mà đã gần 2k chữ). Nói thì có vẻ đơn giản, nhưng nếu đi sâu vào một trong các kĩ thuật (load balancer, master/slave, sharding) cũng sẽ mất vài nghìn chữ. Do vậy, mình chỉ liệt kê sơ để bạn đọc có hướng để tìm hiểu thêm. Mặc dù có thể cả đời bạn không cần dùng đến nhưng kĩ năng này (suốt ngày làm web tin tức, web bán hàng, dự án nội bộ công ty), hãy thử tìm hiểu sâu về chúng nhé! Chúng sẽ tăng cường khả năng tư duy và tầm nhìn hệ thống của bạn lên rất nhiều đấy! Nếu có hứng thú, các bạn cứ để comment lại, mình sẽ viết nguyên 1 series về vấn đề này sau nhé! Dưới đây là một số link để tham khảo thêm, bạn nào có tài liệu hay thì cứ share trong mục comment nhé:
P/S: Để theo dõi bài viết trên Tôi Đi Code Dạo, nhớ Subscribe Chat Bot của tụi mình nha. Bot của Code Dạo sẽ gửi bạn những bài viết cực kì hay ho về kĩ năng mềm và cứng, kinh nghiệm trong ngành vào thứ 4 hàng tuần nhé! |