繁体   English   中英

如何使Node.js有效地处理多个请求?

[英]How to make Node.js handle multiple requests efficiently?

我正在尝试编写一个Node.js应用程序,该应用程序接受来自客户端的传入请求,然后调用远程服务器上的某些Web服务以检索数据。

const express = require('express')
const request = require('request')
const moment = require('moment')

const app = express()

app.get('/', (req, res) => {

    request('http://localhost/sleep.php', (error, response, body) => {
        res.send('get data at ' + moment().format())
    })

})

app.listen(3000)

远程服务是用PHP编写的:

<?php

    sleep(10);
    echo 'Return something!';

问题在于,如果有新请求进入,则Node.js将被阻止,直到完成最后一个回调为止。 如何解决这个问题? 有任何想法吗?

更新:

实际上,我同时通过Firefox发出了两个请求,第二个请求花费了将近20秒。

请在这里查看图片

这是一个快速的演示,浏览器不会通过管道传递对同一URL的并发请求,但通常会提供不同的URL。 为查询字符串添加一个不同的值是一种解决此问题的技术localhost:3000/?1517849200341使用Date.now() localhost:3000/?1517849200341

(广义上讲,在HTTP / 1.1中禁用了流水线操作,但是浏览器将在同一端使用多个TCP连接。通过设置最大流数,流水线操作是HTTP / 2的一部分。我真的不知道这是什么意思或如何解释以下结果。)

 async function log(fn) { console.log(Date()); await Promise.all(fn()); console.log(Date()); } const req1 = 'https://httpbin.org/delay/1'; const req2 = 'https://nghttp2.org/httpbin/delay/1'; const req3 = 'https://httpbin.org/delay/1?a'; const req4 = 'https://httpbin.org/delay/1?b'; const req5 = 'https://httpbin.org/delay/1?c'; const req6 = 'https://httpbin.org/delay/1?d'; const req7 = 'https://nghttp2.org/httpbin/delay/1?a'; const req8 = 'https://nghttp2.org/httpbin/delay/1?b'; const req9 = 'https://nghttp2.org/httpbin/delay/1?c'; const req10 = 'https://nghttp2.org/httpbin/delay/1?d'; btn1.addEventListener('click', () => log(() => [ fetch(req1), fetch(req1), fetch(req1), fetch(req1), fetch(req1), ])); btn2.addEventListener('click', () => log(() => [ fetch(req2), fetch(req2), fetch(req2), fetch(req2), fetch(req2), ])); btn3.addEventListener('click', () => log(() => [ fetch(req1), fetch(req3), fetch(req4), fetch(req5), fetch(req6), ])); btn4.addEventListener('click', () => log(() => [ fetch(req2), fetch(req7), fetch(req8), fetch(req9), fetch(req10), ])); 
 <button id=btn1>HTTP/1.1, same URLs</button> <button id=btn2>HTTP/2, same URLs</button> <button id=btn3>HTTP/1.1, different URLs</button> <button id=btn4>HTTP/2, different URLs</button> 

Chrome缓存是罪魁祸首。 在每个选项卡中打开chrome开发人员控制台,然后单击“禁用缓存”,然后刷新每个选项卡,您会看到异步返回的响应。我认为Firefox可能也在某处设置了缓存。 或使用邮递员发出多个请求...

或者,如果您真的想在多个选项卡中看到此功能,我想您还可以禁用节点服务器的缓存(除了概念验证之外,我不建议您这样做):

...
var nocache = require('nocache')
const app = express()
app.use(nocache())
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM