繁体   English   中英

延迟节点中传入HTTP请求的处理

[英]Defer handling of incoming HTTP requests in Node

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

我正在运行节点/ Express服务器。 我希望该服务器有效地起到节流阀的作用,因此我想存储(在内存或其他进程(如Redis)中) 传入的 HTTP请求,以便稍后处理(使用response.end())。 这可能吗?

这可能吗?

不需要。您可以在任意位置存储有关请求的状态/信息,但是请求本身将基本上绑定到某个文件描述符,该文件描述符与处理该请求的实际打开套接字相关联,并且实际上没有办法进行移动。

这可能吗?

是的,但有一些限制。

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

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


如果您可以更改客户端的设计,那么您可以做各种各样的事情。 例如,客户端可以发出请求,并且它立即获得的响应可以是唯一的ID和时间值。 这告诉客户端其响应已“推迟”到以后。 同时,服务器存储该请求,并且在计划的延迟时间之前的某个时间,它可以计算该响应。 然后,当客户端再次签回并要求提供特定唯一ID的响应时,服务器可以返回该响应。


如果您可以使用socket.io(甚至是普通的webSocket)连接,则可以轻松一点。 由于基于WebSocket的连接是持久的,因此客户端可以发出请求,然后在服务器感到满意后的某个时候,它将响应发送到该客户端的webSocket连接。

暂无
暂无

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

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