延迟处理Node中的传入HTTP请求

时间:2015-07-27 03:57:30

标签: node.js http express

我故意将其保持在较高水平,因为我怀疑我在这里遗漏了一些基本概念。

我正在运行Node / Express服务器。我希望这个服务器有效地充当一个限制,所以我想在以后存储(在内存或其他进程,如Redis)传入 http请求(使用response.end())时间。这可能吗?

2 个答案:

答案 0 :(得分:0)

  

这可能吗?

没有。您可以在任何地方存储有关请求的状态/信息,但请求本身将从根本上与某个文件描述符绑定,该文件描述符与处理请求的实际打开套接字绑定,并且实际上没有办法移动它。

答案 1 :(得分:0)

  

这可能吗?

是的,但有一些限制。

首先,如果您不打算更改发出请求的客户端的设计,您将必须响应HTTP连接所在的套接字。 HTTP连接是从客户端到服务器的实时套接字连接。必须在该套接字上发送响应。这意味着如果您在响应之前要等待一段时间,则必须保持该套接字处于活动状态,并在套接字达到超时之前找到响应的方法,并放弃等待响应。浏览器都会设置某种客户端超时设置,如果它们在这段时间内没有收到响应,它们将关闭套接字并假设请求不成功。您必须在比此超时更短的时间内做出响应,或者您必须通过慢慢地运送某些响应的碎片来强制客户延长它的超时,以使客户认为数据即将到来(我没有我自己试过这个。)

仅供参考,传入的连接不能“存储”在另一个进程或磁盘上。您必须在节点/快速服务器中跟踪它们。

如果您可以更改客户端的设计,那么您可以执行各种操作。例如,客户端可以发出请求,并且它立即获得的响应可以是唯一ID和时间值。这告诉客户端,它的响应已经“延迟”,直到稍后。同时,服务器存储请求,并且在计划的延迟时间之前的某个时间,它可以计算该响应。然后,当客户端再次检入并询问特定唯一ID的响应时,服务器可以返回该响应。

如果您可以使用socket.io(甚至是简单的webSocket)连接,那么您可以更轻松地完成它。由于基于webSocket的连接是持久的,客户端可以发出请求,然后在服务器感觉到它之后的某个时间,它可以将响应发送到该客户端的webSocket连接。

相关问题