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

时间:2018-02-05 14:00:02

标签: php node.js firefox

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

<?php

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

远程服务是用PHP编写的:

find_library

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

更新

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

Please see the image here

2 个答案:

答案 0 :(得分:2)

以下是一个快速演示,浏览器不会对同一URL的并发请求进行流水线操作,但通常会有不同的URL。为查询字符串添加一个不同的值是一种解决此问题的方法:localhost:3000/?1517849200341使用Date.now()

(一般来说,在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>

答案 1 :(得分:1)

Chrome缓存应该受到指责。在每个选项卡中打开chrome dev控制台并单击“禁用缓存”然后刷新每个选项卡,您将看到异步返回的响应。我假设Firefox也可能在某处具有缓存设置。 或者使用Postman提出多个请求......

或者,如果你真的想看到这个在多个标签中工作,我想你也可以从节点服务器禁用缓存(除了概念证明之外我不建议使用它):

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