重定向http请求而不下载正文中的数据



我有什么

  • 传入的单个http请求,数据量约为10mb(我在几秒钟内得到数百个(
  • 几个服务器。loadBalancerserver-1server-2。。。availableServer

我当前正在做的事情
1-loadBalancer收到请求。下载数据。选择服务器。将请求发送到availableServer
2-处理后的数据发送回loadBalancer
4-负载均衡器将结果发送给用户。

问题
loadBalancer额外下载、上传和处理大数据。这降低了用户的响应时间。

我想要的
1-Http/https请求将到达我的loadBalancer服务器
2-loadBalancer选择目标服务器并重定向请求,而不下载请求正文中的大数据
3-主服务器将处理数据并将结果返回给用户。

我的问题
如何在不下载正文中数据的情况下重定向请求?或者我应该用什么技巧来克服这种情况。我只想让loadBalancer轻轻触摸一下,请求将其调整到正确的方向。

可能但不需要的解决方案
用户可以简单地调用

var bestServerUrl = get('loadBalancer/getAvailableServerUrl')
var result = post('bestserverUrl/processData',bigData)

但这种方式是不可取的。对用户来说变得更加复杂。用户可能只使用一个服务器url。应该由我来处理。

请参阅http代理中间件,动态目标。您的负载平衡器的行为类似于具有动态目标的代理。

如下面的代码所示,负载均衡器(在端口8080上(在接收请求体时,将请求体逐块地馈送到可用服务器(在端口8061上(。(该代码模拟以1秒间隔发送的两个块。(

express()
.use(function(req, res) {
req.on("data", function(data) {
console.log("Received " + data);
});
})
.listen(8081, function() {
express()
.use(createProxyMiddleware({target: "http://localhost:8081"}))
.listen(8080, function() {
var req = http.request("http://localhost:8080", {method: "POST"});
req.write("A");
console.log("Sent A");
setTimeout(function() {
req.write("B");
console.log("Sent B");
}, 1000);
});
});

负载均衡器在重定向大数据之前不会完全下载大数据。它打开一个到可用服务器的传出请求,并将传入请求管道传输到该传出请求中。传输的数据块有多大取决于Node.js中的缓冲设置。最终,整个大数据都会通过负载均衡器,但它不需要一次在内存中保留多个块。

最新更新