2016-05-31 11 views
1

Ich habe eine App, die JSON-Anfragen aufnimmt. Diese JSON-Anfragen können bis zu 200k betragen.express bodyParser blockierende Ereignisschleife

app.use(function (req, res, next) { 
    console.time("start2") 
    next(); 
}); 

app.use(bodyParser.json({ limit: '5mb' })); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cors()); 
app.enable('trust proxy'); 


app.use(function (req, res, next) { 
    console.timeEnd("start2") 
    next(); 
}); 

und was auf der Konsole gedruckt wird ist

start2: 591ms 

bin ich richtig in der Annahme, die json Körper des Antrags Parsen der Ereignisschleife für 591 ms blockiert?

Antwort

0

Nein, das kann man nicht davon ausgehen. Es dauert ungefähr 600ms zwischen Ihren console Anrufe, aber nur ein Teil davon wird von body-parser Parsen der JSON-Daten (die wird blockiert die Ereignisschleife). Das Analysieren von 200 K von JSON ist jedoch nicht so zeitaufwendig. Auf meinem Mac dauert es ca. 50ms, um eine 3MB JSON-Datei zu parsen.

Ich denke, dass die meisten dieser 591ms tatsächlich ausgegeben werden lesen die Anfrage Körper (die nicht blockiert).

+0

Danke für die Antwort. Ich habe hier https://github.com/expressjs/body-parser/blob/master/lib/types/json.js#L91 durchgeschaut und wäre es das read() wo sich die meisten der 591ms befinden in einer nicht-Event-Loop-Blocking-Art stattfinden? –

+0

Ja, das wäre meine Vermutung. Sie können die Dateien in './Node_modules/body-parser' Ihres Projekts bearbeiten, um einige zusätzliche Timer hinzuzufügen und zu sehen, ob das tatsächlich korrekt ist :-) – robertklep

+0

Das sieht gut aus. Irgendwelche Gedanken, warum, für ähnliche Anfragen, manchmal dauert es ein paar ms und andere, 500+ ms? Ich sehe derzeit keine anderen Anfragen. –

0

Nein, Sie haben richtigerweise angenommen, dass die Analyse des JSON-Körpers 591 ms dauerte, aber die Ereignisschleife für diese Zeit nicht unbedingt blockiert. Die Middleware in Express (und Connect unter der Haube) ist absichtlich sequenziell, sollte aber in den meisten Fällen die Ereignisschleife nicht blockieren. Es kann die Ereignisschleife blockieren, je nachdem, wie Sie es schreiben, aber die Zeit, die Sie haben, ist nur ein Maß dafür, wie lange es jede Middleware zu nennen nahm next()

Verwandte Themen