thảo luận Chuẩn bị phỏng vấn senior nodejs

  • Người tạo chủ đề Người tạo chủ đề Anh_Chí
  • Ngày bắt đầu Ngày bắt đầu
Actor model như process của elixir hay TPL Dataflow của .Net thì sợ gì data race, deadlock... gì nữa nhỉ.

Hai cái hình của anh có phải ý muốn nói nodejs là non-blocking, còn các multiple threaded language (server) khác là blocking?
Giải thích thêm đi anh, mấy kiến thức sâu về nodejs em không rõ.
 
Giải thích thêm đi anh, mấy kiến thức sâu về nodejs em không rõ.
Tôi chưa từng code nodejs, nhưng tôi hiểu single thread là như này.

Main thread chỉ làm nhiệm vụ nhận http requests, rồi nó đẩy IO operation (như db call) tới IO driver. Như vậy main thread giống một reverse proxy server, nó chỉ có nhiệm vụ nhận việc rồi phân chia công việc cho mấy thằng con. Khi nào thằng con thực hiện xong công việc thì nó thông báo tới main thread bằng callback (aka continuation passing style), để thằng main thread trả kết quả cho client.
-> Như vậy nodejs cho thích hợp cho ứng dụng nặng IO.

Còn với ứng dụng nặng xử lý CPU, nodejs phải thực hiện công việc trên main thread -> block main thread.
 
Tôi chưa từng code nodejs, nhưng tôi hiểu single thread là như này.

Main thread chỉ làm nhiệm vụ nhận http requests, rồi nó đẩy IO operation (như db call) tới IO driver. Như vậy main thread giống một reverse proxy server, nó chỉ có nhiệm vụ nhận việc rồi phân chia công việc cho mấy thằng con. Khi nào thằng con thực hiện xong công việc thì nó thông báo tới main thread bằng callback (aka continuation passing style), để thằng main thread trả kết quả cho client.
-> Như vậy nodejs cho thích hợp cho ứng dụng nặng IO.

Còn với ứng dụng nặng xử lý CPU, nodejs phải thực hiện công việc trên main thread -> block main thread.
Cho em hỏi ngu vì sao ứng dụng nặng thì làm trên main thread, nó ko share đc ạ?
Và OS hay gì xác định đó là ứng dụng nặng à
 
Cho em hỏi ngu vì sao ứng dụng nặng thì làm trên main thread, nó ko share đc ạ?
Và OS hay gì xác định đó là ứng dụng nặng à
Operation/task được chia thành 2 loại IO bound và CPU bound. IO bound nghĩa là IO driver thực hiện công việc, ví dụ đọc file, db call, http request; còn CPU bound tất nhiên là CPU thực hiện, ví dụ như xử lý ảnh, parsing... JS (nodejs) là single thread nghĩa là nó không thể tạo thêm 1 thread khác để cả 2 thread cùng thực hiện song song 1 CPU bound task.
 
Hai cái hình của anh có phải ý muốn nói nodejs là non-blocking, còn các multiple threaded language (server) khác là blocking?
Hình sao nghĩa vậy, ko có hàm ý ẩn dụ

-> Như vậy nodejs cho thích hợp cho ứng dụng nặng IO.

Còn với ứng dụng nặng xử lý CPU, nodejs phải thực hiện công việc trên main thread -> block main thread.
Heavy task thì sử dụng task queue hoặc microservice
Kiến trúc microservices tận dụng rất tốt I/O của NodeJs
 
Hình sao nghĩa vậy, ko có hàm ý ẩn dụ


Heavy task thì sử dụng task queue hoặc microservice
Kiến trúc microservices tận dụng rất tốt I/O của NodeJs
Hình của anh bên trên là Nodejs server, bên dưới là multithreaded server, và anh nói rằng 7 thread xử lý được tối đa 7 requests cùng một lúc. Phải hiểu như nào đây?

Cái task queue và microservice mà anh bảo về bản chất là chạy nhiều task song song -> sử dụng tối đa CPU.
 
Hình của anh bên trên là Nodejs server, bên dưới là multithreaded server, và anh nói rằng 7 thread xử lý được tối đa 7 requests cùng một lúc. Phải hiểu như nào đây?

Cái task queue và microservice mà anh bảo về bản chất là chạy nhiều task song song -> sử dụng tối đa CPU.
à, cái đó là do ngôn ngữ viết của mình ko diễn đạt được vấn đề mình muốn nói
 
1 thread chạy coroutine, 7 threads handle request => tối đa tải được 7 users cùng lúc, còn lại sẽ được thread 1st xếp vào hàng đợi.

Hiện tại thì kiến trúc này xử dụng tài nguyên tối ưu nhất cho phần lớn hệ thống, ko bị bottleneck I/O hay ngốn bộ nhớ do multithreaded


1*WVP8haZ_BXxVPEzsPDZWsQ.png




1*uqKyhnkBDHT9jdEWQaMv_g.png

mình từng handle 10k requests/response bằng multi threaded server.
Chưa bao giờ mình bị blocking IO bao giờ cả.
 
ơ nếu như process ấy chiếm trọn tài nguyên cpu để xử lý - eg: streaming chẳng hạn. mặc dù ko block process nhưng chỉ 1 thread nên chậm hẳn. Khi ấy thường nodejs sẽ xử lý thế nào mấy fen.
Bạn không hiểu rồi .
Nodejs single thread không phải chỉ dùng 1 thread để xử lý toàn bộ mọi thứ.
Để cho chính xác thì Nodejs sử dụng 2 thread pool.
Thread pool 1 dùng cho việc phân phối tiến trình xử lý . Đối với CPU nó sẽ dùng 1 thread
Thread pool 2 dùng cho việc xử lý tiến trình . Mặc định max là 4 thread(có thể cấu hình env) của CPU

Điều đó có nghĩa nếu bạn chạy 5 function 1 lúc (không cấu hình nodejs).
Đối với CPU 4 thread thì sẽ trong 1 lúc nó dùng tổng cộng 4 thread để xử lý function, 1 thread để phân phối thread nào sẽ xử lý function đó .

Tại sao mình nói là 4 thread xử lý trong khi đó CPU chỉ support 4 thead, vì 1 thread phân phối sau khi chạy xong nó sẽ được trống chỗ

1_i2G3Dfs8umtkU3AA-L5M2A.png

Nguồn ảnh :(https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64)
Quy trình xử lý như sau:

Phân phối (Cpu còn 3 thread) -> Sau khi phân phối (Cpu còn 4 thread) -> Xử lý (Cpu không còn thread nào)

Như vậy còn 1 function nó sẽ xử lý sau khi có 1 thread được trống.


P/s: Các bạn có thể coi tại nguồn này sẽ hiểu rõ hơn : https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64
 
ơ nếu như process ấy chiếm trọn tài nguyên cpu để xử lý - eg: streaming chẳng hạn. mặc dù ko block process nhưng chỉ 1 thread nên chậm hẳn. Khi ấy thường nodejs sẽ xử lý thế nào mấy fen.
Đối với streaming , mình thì chưa thấy source nào nodejs ngon cả . Để tối ưu việc decode ,encode h264 h265 thường thì dùng C để tối ưu hóa tốc độ
 
mình từng handle 10k requests/response bằng multi threaded server.
Chưa bao giờ mình bị blocking IO bao giờ cả.
blocking IO diễn ra ở miliseconds nên ko thấy được là phải

1 thread thường khi call api database -> sẽ bị block cho đến khi có results trả về
1 thread coroutines call api database -> tiếp tục xử lý request tiếp theo, results sẽ trả về trong callback

Nếu thắc mắc callback được gọi khi nào thì check docs của framework đang sử dụng để tìm Event Loop Execution Order
 
Bạn không hiểu rồi .
Nodejs single thread không phải chỉ dùng 1 thread để xử lý toàn bộ mọi thứ.
Để cho chính xác thì Nodejs sử dụng 2 thread pool.
Thread pool 1 dùng cho việc phân phối tiến trình xử lý . Đối với CPU nó sẽ dùng 1 thread
Thread pool 2 dùng cho việc xử lý tiến trình . Mặc định max là 4 thread(có thể cấu hình env) của CPU

Điều đó có nghĩa nếu bạn chạy 5 function 1 lúc (không cấu hình nodejs).
Đối với CPU 4 thread thì sẽ trong 1 lúc nó dùng tổng cộng 4 thread để xử lý function, 1 thread để phân phối thread nào sẽ xử lý function đó .

Tại sao mình nói là 4 thread xử lý trong khi đó CPU chỉ support 4 thead, vì 1 thread phân phối sau khi chạy xong nó sẽ được trống chỗ

Xem tệp đính kèm 372758
Nguồn ảnh :(https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64)
Quy trình xử lý như sau:

Phân phối (Cpu còn 3 thread) -> Sau khi phân phối (Cpu còn 4 thread) -> Xử lý (Cpu không còn thread nào)

Như vậy còn 1 function nó sẽ xử lý sau khi có 1 thread được trống.


P/s: Các bạn có thể coi tại nguồn này sẽ hiểu rõ hơn : https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64
đa số CPU hiện nay điều hỗ trợ siêu phân luồng nên hiếm có cpu 4 thread lắm, nên threadpool mình đều set size = số logical core - 1
 
Mấy bác đang nói về nodejs native hay worker thread mới có thế? Chứ nếu các tác vụ tính toán non IO chỉ dùng 1 thread thôi chứ nhỉ

Sent from Xiaomi Redmi 5 Plus using vozFApp
 
Bạn không hiểu rồi .
Nodejs single thread không phải chỉ dùng 1 thread để xử lý toàn bộ mọi thứ.
Để cho chính xác thì Nodejs sử dụng 2 thread pool.
Thread pool 1 dùng cho việc phân phối tiến trình xử lý . Đối với CPU nó sẽ dùng 1 thread
Thread pool 2 dùng cho việc xử lý tiến trình . Mặc định max là 4 thread(có thể cấu hình env) của CPU

Điều đó có nghĩa nếu bạn chạy 5 function 1 lúc (không cấu hình nodejs).
Đối với CPU 4 thread thì sẽ trong 1 lúc nó dùng tổng cộng 4 thread để xử lý function, 1 thread để phân phối thread nào sẽ xử lý function đó .

Tại sao mình nói là 4 thread xử lý trong khi đó CPU chỉ support 4 thead, vì 1 thread phân phối sau khi chạy xong nó sẽ được trống chỗ

Xem tệp đính kèm 372758
Nguồn ảnh :(https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64)
Quy trình xử lý như sau:

Phân phối (Cpu còn 3 thread) -> Sau khi phân phối (Cpu còn 4 thread) -> Xử lý (Cpu không còn thread nào)

Như vậy còn 1 function nó sẽ xử lý sau khi có 1 thread được trống.


P/s: Các bạn có thể coi tại nguồn này sẽ hiểu rõ hơn : https://medium.com/better-programming/is-node-js-really-single-threaded-7ea59bcc8d64
cái multi threaded của nodejs chắc là libuv hoặc là parallel gc chứ có phải là trong runtime của node đâu :v
mà tôi đíu hiểu tại sao js dev cứ cố đấm ăn xôi đánh tráo khái niệm để bảo nodejs là multi threaded làm gì. nó làm quái nào có mechanism cho multi threaded đâu, mấy cái có toàn là mấy cái bên ngoài.

giờ tôi chạy cái bash script loop với fork() nó dùng toàn bộ cpu (có 1000 cái cpu thì nó cũng 100% cả 1000), vậy bash là multi threading language à?
 
cái multi threaded của nodejs chắc là libuv hoặc là parallel gc chứ có phải là trong runtime của node đâu :v
mà tôi đíu hiểu tại sao js dev cứ cố đấm ăn xôi đánh tráo khái niệm để bảo nodejs là multi threaded làm gì. nó làm quái nào có mechanism cho multi threaded đâu, mấy cái có toàn là mấy cái bên ngoài.

giờ tôi chạy cái bash script loop với fork() nó dùng toàn bộ cpu (có 1000 cái cpu thì nó cũng 100% cả 1000), vậy bash là multi threading language à?
Tại sao lại dùng từ đánh trái khái niệm nhỉ .
1. Anh đã nói language, vậy anh phải hiểu định nghĩa single thread language nghĩa là gì.
2. Cái tôi đang nói là cách nó vận hành thực tế, khái niệm, định nghĩa của anh có liên quan quái gì đến cách tôi nói nó vận hành à? Lạc trôi đi đâu đấy, dòng nào tôi bảo nó không phải single thread? Anh đánh tráo câu chữ của tôi hay cố tình giả ngu không hiểu để tự nâng? Tôi ghi rất rõ đề bài là đang nói thread cpu, anh đánh trái khái niệm giữa thread language và thread cpu thế thì dẹp đi nha
 
cái multi threaded của nodejs chắc là libuv hoặc là parallel gc chứ có phải là trong runtime của node đâu :v
mà tôi đíu hiểu tại sao js dev cứ cố đấm ăn xôi đánh tráo khái niệm để bảo nodejs là multi threaded làm gì. nó làm quái nào có mechanism cho multi threaded đâu, mấy cái có toàn là mấy cái bên ngoài.

giờ tôi chạy cái bash script loop với fork() nó dùng toàn bộ cpu (có 1000 cái cpu thì nó cũng 100% cả 1000), vậy bash là multi threading language à?

Từ node12 có thread worker rồi thím, mà chắc vẫn cùi, bản chất vẫn là single thread k dùng nên dùng cho mấy tác vụ hao CPU

Sent from Xiaomi Redmi 5 Plus using vozFApp
 
Từ node12 có thread worker rồi thím, mà chắc vẫn cùi, bản chất vẫn là single thread k dùng nên dùng cho mấy tác vụ hao CPU

Sent from Xiaomi Redmi 5 Plus using vozFApp
Trước khi có worker thread thì dùng microservice để xử lý hao cpu task, mở đầu là thằng Netflix (cty lớn đầu tiên ứng dụng kiến trúc microservices)

Hiện tại main thread trong nodejs chỉ xử lý non-blocking I/O, còn lại (bao gồm blocking I/O) đều giao cho worker thread làm nên 1 main thread có thể cân rất nhiều request cùng lúc.
 
Trước khi có worker thread thì dùng microservice để xử lý hao cpu task, mở đầu là thằng Netflix (cty lớn đầu tiên ứng dụng kiến trúc microservices)

Hiện tại main thread trong nodejs chỉ xử lý non-blocking I/O, còn lại (bao gồm blocking I/O) đều giao cho worker thread làm nên 1 main thread có thể cân rất nhiều request cùng lúc.
tôi nhớ thằng to đầu tiên dùng node là ebay hay paypal gì đó cơ mà nhỉ?

mà tôi hỏi lại lần nữa các bạn nodejs dev ham hố gì cái multi threaded mà cứ nhận vơ thế?
bây giờ tôi hỏi các bạn các bạn chạy 3 4 threads (ở đây là real os thread nhé không tính bọn giả lập) mà vẫn gửi thông tin được qua nhau không qua thằng trung gian (IPC) có được không?
 
https://nodesource.com/blog/worker-threads-nodejs/

đây, bạn nào tìm hộ tôi dòng nào nó bảo worker threads == multi threaded tôi xem nào?

p/s: cho tới hiện giờ tôi đọc tutorial thì người ta vẫn deploy nodejs app (eg expressjs) bằng cluster, chưa thấy ai hô hào cluster đã lỗi thời nodejs giờ đã multi threaded cả?
có lẽ nào thông tin tôi đọc đều lạc hậu hết rồi ở thế giới khác một node app đã tận dụng được hết core như hack?
 
Sửa lần cuối:

Thống kê chủ đề

Ngày tạo
Anh_Chí,
Người trả lời cuối
giacat.vuhau,
Trả lời
76
Lượt xem
19.884
Quay lại
Lên đầu trang