2016-03-06 16 views
15

Hãy mã này, tiêu biểu nút js ví dụ về một máy chủ Http, mà tôi đã thêm chậm trễ 5 giây để mô phỏng một số công việc async diễn ra ở một nơi khác:Tại sao setTimeout chặn ứng dụng Node.js của tôi?

const http = require('http'); 

const hostname = '127.0.0.1'; 
const port = 8080; 

http.createServer((req, res) => { 
    setTimeout(()=>{ 
     res.writeHead(200, { 'Content-Type': 'text/plain' }); 
     res.end('Hello World\n'); 
    },5000); 
}).listen(port, hostname,() => { 
    console.log(`Server running at http://${hostname}:${port}/`); 
}); 

Những gì tôi mong chờ là khi Tôi mở 5 tab, giả sử chậm trễ nửa giây giữa mỗi lần mở, máy chủ phải "trả lời" cho từng tab nhiều hơn hoặc ít hơn với thời gian này:

t=0s - I open first tab 
t=0.5s - I open second tab 
t=1s - I open third tab 
... 
t=5s - First tab stops loading, server has replied 
t=5.5s - Second tab stops loading, server has replied 
t=6s - Third tab stops loading, server has replied 
t=6.5s - Fourth tab stops loading, server has replied 
t=7s - Fifth tab stops loading, server has replied 

Tuy nhiên, hành vi tôi thấy là như sau:

t=0s - I open first tab 
t=0.5s - I open second tab 
t=1s - I open third tab 
... 
t=5s - First tab stops loading, server has replied 
t=10s - Second tab stops loading, server has replied 
t=15s - Third tab stops loading, server has replied 
t=20s - Fourth tab stops loading, server has replied 
t=25s - Fifth tab stops loading, server has replied 

Như thể các yêu cầu tiếp theo không bắt đầu chạy cho đến khi yêu cầu đầu tiên kết thúc. Am i thiếu cái gì ở đây? Tôi nghĩ toàn bộ vấn đề của Node JS là có thể chạy tync không đồng bộ từ một chủ đề duy nhất?

+1

FYI, bạn cũng phải xem các yêu cầu favicon mà các trình duyệt muốn thực hiện cùng với yêu cầu trang. . – jfriend00

Trả lời

17

Sự cố không phải là mã của bạn hoặc Node.js - đó là cách bạn thiết lập thử nghiệm của mình.

Bạn giả định sai rằng trình duyệt của bạn sẽ thực hiện 5 yêu cầu đồng thời, điều này không xảy ra. Các trình duyệt khác nhau có các hành vi khác nhau, nhưng thông thường các trình duyệt giới hạn số lượng tối đa các kết nối đồng thời tới một nguồn gốc duy nhất. Thông số HTTP cung cấp đề xuất tối đa. Tôi thực sự khá ngạc nhiên khi thấy Chrome chỉ mở 1 kết nối duy nhất cho localhost, vì tôi biết Chrome sẽ mở ra 6 nguồn gốc khác - chỉ mới học được điều gì đó mới mẻ!

Sử dụng công cụ khác để chạy thử nghiệm của bạn, một công cụ mà bạn có thể kiểm soát và biết chắc chắn rằng nó thực hiện yêu cầu đồng thời. Sau đó, bạn sẽ thấy hành vi mong đợi.

Ví dụ, tôi chạy mã của bạn và được thử nghiệm với Apache Benchmark như hình dưới đây. Các thông số cho biết: -n 10 là thực hiện 10 yêu cầu, -c 10 là sử dụng đồng thời 10 (nghĩa là, thực hiện tất cả mười yêu cầu đồng thời). Như bạn có thể thấy trong các kết quả dưới đây, tổng thời gian thực hiện cho tất cả các yêu cầu là ~ 5s (và "thời gian theo yêu cầu" 0.5s):

~ $ ab -n 10 -c 10 http://127.0.0.1:8080/ 
This is ApacheBench, Version 2.3 <$Revision: 1663405 $> 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
Licensed to The Apache Software Foundation, http://www.apache.org/ 

Benchmarking 127.0.0.1 (be patient).....done 


Server Software: 
Server Hostname:  127.0.0.1 
Server Port:   8080 

Document Path:  /
Document Length:  12 bytes 

Concurrency Level:  10 
Time taken for tests: 5.019 seconds 
Complete requests:  10 
Failed requests:  0 
Total transferred:  1130 bytes 
HTML transferred:  120 bytes 
Requests per second: 1.99 [#/sec] (mean) 
Time per request:  5019.151 [ms] (mean) 
Time per request:  501.915 [ms] (mean, across all concurrent requests) 
Transfer rate:   0.22 [Kbytes/sec] received 

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.1  0  0 
Processing: 5017 5018 0.3 5018 5018 
Waiting:  5008 5008 0.2 5008 5009 
Total:  5018 5018 0.2 5019 5019 
ERROR: The median and mean for the total time are more than twice the standard 
     deviation apart. These results are NOT reliable. 

Percentage of the requests served within a certain time (ms) 
    50% 5019 
    66% 5019 
    75% 5019 
    80% 5019 
    90% 5019 
    95% 5019 
    98% 5019 
    99% 5019 
100% 5019 (longest request) 
+4

OP cũng có thể tìm trong tab mạng của trình gỡ lỗi Chrome để xem khi nào các yêu cầu thực sự được gửi đến máy chủ. Dòng thời gian trong tab mạng của trình gỡ lỗi sẽ cho biết câu chuyện WHOLE. – jfriend00

+0

Bạn đang rất đúng sir, cố gắng có chrome, firefox và cạnh nhau và làm mới trang trên mỗi trình duyệt, và tôi đã nhận được kết quả mong đợi !! Cũng cảm ơn bạn đã dành thời gian để kiểm tra và đăng kết quả! Câu trả lời Ace, đây là lý do tại sao tôi sống SO :) –

+0

@ jfriend00 Đúng vậy, nó thậm chí không vượt qua tâm trí của tôi rằng tôi sẽ là một vấn đề trình duyệt mặc dù! –

5

Có vẻ điều này chỉ xảy ra trong một số trình duyệt, tôi đã cố gắng với safari và nó hoạt động như mong đợi. Vì vậy, tôi đoán rằng Chrome sẽ giới hạn số lượng yêu cầu giống nhau cho cùng một tài nguyên cùng một lúc

+0

Firefox cũng đang làm việc đó (chặn số lượng kết nối đến cùng một máy chủ) –

+0

@RubenSerrate you'r right – wong2

Các vấn đề liên quan