thắc mắc Câu hỏi về mở rộng server trong phỏng vấn backend

hieunguyen04

Senior Member
Chào các thím,
Em thấy khi đi phỏng vấn BE thường có câu hỏi về việc mở rộng server khi có nhiều request hoặc lượng request tăng đột biến. Em chưa có nhiều kinh nghiệm trong vụ này nên muốn lên đây hỏi các bác cách xử lý. Cụ thể câu hỏi như sau:
  • Trình bày tổng quan cách bạn làm thế nào để xây dựng hệ thống chịu tải lên đến 1M-1B/s.
  • Vào một ngày đẹp trời, lượng request có thể tăng đột biến lên đến gấp 5 lần bình thường :beat_brick::beat_brick:. Bạn làm thế nào để xử lý trong tình huống đó. :beat_shot:
Cảm ơn các thím đã đọc :burn_joss_stick::burn_joss_stick:
 
Last edited:
Hỏi nó ngược lại: thế bây giờ công ty xài backend lưu lượng truy cập là bao nhiêu?
nó nói: tầm 1tr/s thì trả lời là.
dcm chừng nào lên dc 1 tỷ rồi tính, bố thằng hâm. Hỏi vớ vẩn. Chưa được 1 tỷ mà đã hỏi 5 tỷ.
khác nào cầm 100tr trong tay đi hỏi mua nhà 5 tỷ. Rồi chê mắc.
 
Chào các thím,
Em thấy khi đi phỏng vấn BE thường có câu hỏi về việc mở rộng server khi có nhiều request hoặc lượng request tăng đột biến. Em chưa có nhiều kinh nghiệm trong vụ này nên muốn lên đây hỏi các bác cách xử lý. Cụ thể câu hỏi như sau:
  • Trình bày tổng quan cách bạn làm thế nào để xây dựng hệ thống chịu tải lên đến 1M-1B/s.
  • Vào một ngày đẹp trời, lượng request có thể tăng đột biến lên đến gấp 5 lần bình thường :beat_brick::beat_brick:. Bạn làm thế nào để xử lý trong tình huống đó. :beat_shot:
Cảm ơn các thím đã đọc :burn_joss_stick::burn_joss_stick:
Về lý thuyết:
Giả sử bài toán ở đây là dành cho một trang web e-com.

1. Trình bày tổng quan cách bạn làm thế nào để xây dựng hệ thống chịu tải lên đến 1M-1B/s.
  • Step 1:
    • Benchmarks, Load test, Monitoring, Profiling
    • Tìm ra được bottleneck, peak time.
  • Step 2: Tùy thuộc vào bottleneck ở đâu mà xử lý ở đó, tiếp tục lặp lại Step 1
    • Tầng network: Load balancer (app, net ...)
    • Tầng app: scale ngang và dọc các webserver, phân tách riêng rẽ các service. Ví dụ ở bài toán e-com thì tách riêng các service như page, cart, order, payment, user, authen, search .... Với mỗi service này đều có thể scale ngang và dọc luôn.
    • Tầng database: memcache, replicate master slave cho db, heavy write hay heavy read để lựa chọn db cho phù hợp (RDBMS, No-SQL ...). Sử dụng các search engine phù hợp cho searching.
    • Tầng data: CDN, routing, DNS, Store object (img, video ...) vào chỗ phù hợp.
2. Peak time với cloud
  • Tầng net và app: Nếu sử dụng cloud thì nên dùng auto-scale để tối ưu hóa cho peak-time.
  • Tầng db:
    • Nếu db tiếp tục phình to thì có các giải pháp như partition, sharding hoặc chuyển qua No-SQL.
    • Khi lên tới vài ngàn req/s thì đã bắt đầu xây dựng data-warehouse rồi. Cái này thì tùy xem có hỏi tới không vì nó lại là một mảng khác không phải OLTP rồi.
  • Nếu không chơi cloud thì tất nhiên phải chơi tay rồi, nhưng luôn lên kế hoạch dự phòng từ trước. Còn nói thật nếu tăng 5 lần mà chơi on-premise thì chạy đi mà mua server mới cắm vào thôi, éo thằng nào plaining cho trường hợp peak-time 5 lần đâu :D
  • Edit: với on-premise thì giải pháp ngay từ đầu là tìm cách để scale nhanh nhất cho các component trong system. Giải pháp thì có nhiều, ví dụ như dockerization, containerization bọn nó. Sử dụng những thằng orchestration/CI/CD (ex. k8s, ansible, terraform, ...) để control, xử lý.
 
Last edited:
Thực ra mấy câu kiểu này các cty người ta hay hỏi để kiểm tra xem ứng viên có chịu khó tìm tòi nghiên cứu hay không thôi chứ cũng chả quan trọng mấy đâu. Trả lời dc thì thêm điểm cộng, không biết thì cứ bảo không biết. :shame:
 
Công ty nào pv mà hỏi mấy câu này thì dở bỏ mẹ ra, chẳng có cái hệ thống 1M requests/s nào giống cái nào mà nói cả
 
Chào các thím,
Em thấy khi đi phỏng vấn BE thường có câu hỏi về việc mở rộng server khi có nhiều request hoặc lượng request tăng đột biến. Em chưa có nhiều kinh nghiệm trong vụ này nên muốn lên đây hỏi các bác cách xử lý. Cụ thể câu hỏi như sau:
  • Trình bày tổng quan cách bạn làm thế nào để xây dựng hệ thống chịu tải lên đến 1M-1B/s.
  • Vào một ngày đẹp trời, lượng request có thể tăng đột biến lên đến gấp 5 lần bình thường :beat_brick::beat_brick:. Bạn làm thế nào để xử lý trong tình huống đó. :beat_shot:
Cảm ơn các thím đã đọc :burn_joss_stick::burn_joss_stick:
Nếu chỉ ở phần code app thì có thể tham khảo các giải pháp caching ,message queue như redis, rabbitmq, elastic search. Hơn nữa phần chịu tải này liên quan đến thiết kế hệ thống api, services, sử dụng cloud service như firebase hay ko, sử dụng nosql hay ko. Còn devops thì lại ở mảng khác do thằng assmin hệ thống thì liên quan tới ha, db replication. Tùy vào yêu cầu ban đầu mà sử dụng công nghệ nào cho phù hợp
 
Đã đưa vào prodution thì mấy cái tối ưu cached chắc cũng đã làm rồi.

1m-1b chắc là tính theo ngày/tháng, nếu vậy tăng gấp 5 lần chưa chắc là ser chịu ko được bởi vì có ser nào tận dụng hết từng giây đâu.

Cho nên mình nghĩ câu trả lời ở đây là tiếp sức asyn.

Ví dụ peak ở giây 12:00 tăng gấp đôi thì với server được thiết kế tốt asyn ( như nodejs+microserice chẳng hạn) có thể tân dụng tốt các giây tiếp theo 12:01, 12:02 để chịu tải. Tính dẻo là cực cao
 
Đã đưa vào prodution thì mấy cái tối ưu cached chắc cũng đã làm rồi.

1m-1b chắc là tính theo ngày/tháng, nếu vậy tăng gấp 5 lần chưa chắc là ser chịu ko được bởi vì có ser nào tận dụng hết từng giây đâu.

Cho nên mình nghĩ câu trả lời ở đây là tiếp sức asyn.

Ví dụ peak ở giây 12:00 tăng gấp đôi thì với server được thiết kế tốt asyn ( như nodejs+microserice chẳng hạn) có thể tân dụng tốt các giây tiếp theo 12:01, 12:02 để chịu tải. Tính dẻo là cực cao

xây dựng hệ thống chịu tải lên đến 1M-1B/s
1M hoặc 1B request per second chứ không phải per days.

Câu hỏi dạng cho SA. Tùy thuộc vào ý định của interviewer mà trả lời ngắn hay dài. Nếu interviewer muốn hỏi chi tiết tới mức thiết kế và giải pháp thì cần làm rõ các input khác như use-cases, timing, sizing ... từ đó calculate usage để đưa solution và chi tiết hóa solution.
Thông thường sẽ đưa ra design tới mức components và tiến hành scale theo từng components đó.
Tất nhiên sẽ đào sâu thêm về nhiều phần khác như database scale, caching, asynch, microservice, design API, security, các giải pháp beachmark, monitor, stress load test, address bottleneck ....

Theo mình thì với back-end engineer thì sẽ không cần đào sâu tới mức như trên, interviewer ở đây chỉ muốn xem bạn kia có nắm được các lý thuyết cơ bản để scale một hệ thống lên không hay thôi. Không cần trả lời quá sâu.
 
Có một hướng không cần mở rộng server, đó là tối ưu các thành phần có sẵn để hoạt động hiệu quả hơn. Thực ra ngày nay dev dùng quá nhiều công nghệ, nhiều lớp abstract nên hiệu năng theo đó cũng bị tụt đi, giải quyết thì toàn bằng cách đắp thêm phần cứng nhưng thực ra nhiều khi một server là quá đủ.

Ví dụ: một trong các hướng tối ưu mà không thấy mấy bác ở trên nói là tối ưu network stack. Network stack của linux mặc định đang chỉ gọi là tạm ổn, tốt cho đa mục đích chứ không phải hiệu năng cao. Đây là bài viết khá chi tiết về đường đi của một packet từ lúc đến card mạng cho đến khi đến tầng application: https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/. Có thể thấy là qua rất nhiều bước và không phải bước nào cũng đã tinh chỉnh sẵn.

Có hai hướng giải quyết, một cách tay to là bypass hết tất cả network stack của kernel, sử dụng một framework như DPDK để xử lý raw packet từ queue của NIC, implement hết các protocol từ thấp đến cao.

Cách đơn giản hơn là tunning một số bước để nó hoạt động phù hợp hơn với nhu cầu của mình. Ví dụ như hiện này nhiều NIC là multi queue, nên có thể config lại để ví dụ như packet từ địa chỉ IP A - B sẽ đi vào queue #0 (do NIC cho phép cấu hình hàm hash), rồi cũng có thể config để packet đi đến queue #1 sẽ vào CPU #2, #3, ... chứ không phải copy qua lại giữa các CPU như mặc định.

Cloudflare có vài bài hướng dẫn khá hay về chủ đề này:
Tối ưu theo throughput: 1 triệu packet/s với 1 server 6 core: https://blog.cloudflare.com/how-to-receive-a-million-packets/
Tối ưu theo latency: trung bình 15 microsecond / request: https://blog.cloudflare.com/how-to-achieve-low-latency/

Còn về container network thì càng nhiều thứ hay ho khác để tối ưu nữa. Mặc định khi chạy docker là chấp nhận hi sinh hiệu năng network, nhất là tăng latency, tốn CPU vì phải giả lập một con switch với đầy đủ tính năng như MAC learning, Spanning tree protocol (bridge network). Docker cũng có sẵn vài giải pháp khác như macvlan, ipvlan đỡ tốn tài nguyên hơn nhưng không phải mặc định và vẫn cần phải tìm hiểu để cấu hình thêm.

Sang bên K8S thì lại hay nữa, vì lúc này cần phải có cơ chế để routing giữ các pod một cách trong suốt, trong khi mỗi pod có thể ở cùng hoặc khác node. Cái này gọi là CNI (Container Network Interface). K8S mặc định không có CNI nào mà phải tự cài thêm khi setup. CNI phổ biến nhất là Flannel, sử dụng VXLAN. Dùng VXLAN có nghĩa là hiệu năng lại tụt đi đôi chút vì bản chất của nó là encapsulate packet layer bằng một packet UDP layer 4 để trao đổi giữa các node, tức là mất thêm CPU để xử lý cho 3 layer nữa. Cũng tương tự như docker, có các giải pháp CNI khác hiệu năng tốt hơn. Đây là một bài so sánh, lấy base là --host=network: https://machinezone.github.io/research/networking-solutions-for-kubernetes/
 
Tăng traffic bất thường, mà lại là real traffic thì là giải pháp auto scale. Còn không phải real traffic thì cần xây dựng firewall.
Còn xây dựng hệ thống chịu tải 1M-1B, thì còn phải xem request đó vào resource gì? nếu là static resource thì đẩy ra cdn. Còn không thì phải horizon hệ thống, đẩy request ra các region, cluster khác nhau. Tối ưu code, xem có cache củng chỗ nào được không, sử dụng async non-blocking, event message pattern nọ chai bla bla.
Đó là lý thuyết đọc trên mạng, còn thực tế thì chưa gặp case 1M-1B / second, nên ko biết
 
Chào các thím,
Em thấy khi đi phỏng vấn BE thường có câu hỏi về việc mở rộng server khi có nhiều request hoặc lượng request tăng đột biến. Em chưa có nhiều kinh nghiệm trong vụ này nên muốn lên đây hỏi các bác cách xử lý. Cụ thể câu hỏi như sau:
  • Trình bày tổng quan cách bạn làm thế nào để xây dựng hệ thống chịu tải lên đến 1M-1B/s.
  • Vào một ngày đẹp trời, lượng request có thể tăng đột biến lên đến gấp 5 lần bình thường :beat_brick::beat_brick:. Bạn làm thế nào để xử lý trong tình huống đó. :beat_shot:
Cảm ơn các thím đã đọc :burn_joss_stick::burn_joss_stick:
cứ💰mà vã :byebye:

via theNEXTvoz for iPhone
 
Nói chung các công ty startup hỏi scale traffic lên tỷ requests/s thì thường là traffic của họ khoảng chục requests/s thôi
shit.gif
 
Em hỏi thật chứ có thím nào làm cái này chưa ạ? tầm 1 triệu - 1 tỉ request 1 giây ấy ạ :D
Câu hỏi này rõ vớ vẩn vì workload mỗi request như thế nào thì không nói. tỉ request để serve html khác, tỉ request serve video khác, tỉ request serve image khác, tỉ request compute intensive khác, tỉ request i/o intensive khác.
Đó là tôi chém thế chứ cái web tôi kiếm 1000 user 1 ngày còn không ra, lấy đâu ra tỉ request :cry:.
Thằng nào hỏi câu này cứ vặn lại cty anh nào kiếm cho được ngàn user/1s thì em sẽ có giải pháp giải quyết bài toán tỉ request :sneaky:
 
Có một hướng không cần mở rộng server, đó là tối ưu các thành phần có sẵn để hoạt động hiệu quả hơn. Thực ra ngày nay dev dùng quá nhiều công nghệ, nhiều lớp abstract nên hiệu năng theo đó cũng bị tụt đi, giải quyết thì toàn bằng cách đắp thêm phần cứng nhưng thực ra nhiều khi một server là quá đủ.
Bác phán quá chuẩn nhưng lại đem edge case ra làm ví dụ rồi. Cái bài bác viết chỉ cần ở những thằng cdn như cloudflare, còn đa phần cái đống bottleneck nó nằm ở db, app, chứ cắm đầu optimize network stack mà mấy thằng khác nghẽn thì cũng chẳng có tác dụng gì
 
Câu hỏi này rõ vớ vẩn vì workload mỗi request như thế nào thì không nói. tỉ request để serve html khác, tỉ request serve video khác, tỉ request serve image khác, tỉ request compute intensive khác, tỉ request i/o intensive khác.
Interviewer vai trò ở đây giống như customer. Anh bắt customer đưa hết yêu cầu ra rồi anh cứ thế cắm mặt vào làm à? Anh không hỏi lại, làm rõ, phân tích (nhiều khi là gợi ý cho khách) thì lấy đâu ra thông tin mà anh làm?
Mà thôi nói customer làm gì cho xa. Đặt vị trí anh là lead/ senior, PO/PM bảo anh lên kế hoạch scale hệ thống ra gấp 10 lần. Anh cần làm những gì? Những thông số kia anh đi lấy ở đâu? Anh tự ngồi mò ra chắc? Hay anh đi hỏi teammate của anh xem lấy nó thế nào và lấy nó ở đâu?

Tôi thấy hài hước là nhiều anh đi phỏng vấn nhưng gặp câu hỏi không rõ cũng chẳng bao giờ hỏi lại interviewer, lại cứ bắt họ đưa ra cái đầu bài chuẩn đét rồi các anh mỗi việc ngồi làm. Thử hỏi trong thực tế có cái gì như vậy không?
Người ta hỏi những câu như này để đánh giá năng lực teamwork, năng lực phân tích và lấy thông tin thông qua trao đổi của các anh. Các anh chưa gì đã chỉ biết chửi người ta mà không nghĩ lại xem họ đang muốn gì.
Còn nếu anh muốn thế. Anh cứ mãi làm thợ code thôi :feel_good:
 
Last edited:
Back
Top