gpt4 book ai didi

node.js - Nodejs 代理请求合并

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:50 25 4
gpt4 key购买 nike

我的 http-proxy-middleware 遇到了问题。我用它来代理对另一个服务的请求,即可能调整图像等的大小。

问题是多个客户端可能会多次调用该方法,从而在原始服务上造成困惑。我现在正在研究(某些服务称为请求合并,即清漆)的解决方案,该解决方案将调用服务一次,等待响应并使用相同签名对传入请求进行“排队”,直到第一个请求完成,然后一次返回所有请求...这与“缓存”结果不同,因为我想防止同时多次调用后端并且不一定缓存结果。

我试图找出类似的东西是否可能有不同的调用方式,或者我是否遗漏了其他人已经以某种方式解决的东西......但我找不到任何东西......

由于对于反向代理类型设置来说,用例似乎非常“基本”,所以我预计我的搜索会出现很多点击,但由于问题空间非常通用,所以我什么也没得到......

谢谢!

最佳答案

我的一位同事帮助我破解我自己的答案。它目前用作特定 GET 端点的(快速)中间件,基本上将请求散列到映射中,启动一个新的单独请求。并发传入请求被散列和检查,并在单独的请求回调上行走,从而被重用。这也意味着,如果第一个响应特别慢,则所有合并的请求都太慢

这似乎比将其侵入 http-proxy-middleware 更容易,但是哦,好吧,这完成了工作:)

const axios = require('axios');
const responses = {};
module.exports = (req, res) => {
const queryHash = `${req.path}/${JSON.stringify(req.query)}`;
if (responses[queryHash]) {
console.log('re-using request', queryHash);
responses[queryHash].push(res);
return;
}

console.log('new request', queryHash);
const axiosConfig = {
method: req.method,
url: `[the original backend url]${req.path}`,
params: req.query,
headers: {}
};
if (req.headers.cookie) {
axiosConfig.headers.Cookie = req.headers.cookie;
}
responses[queryHash] = [res];
axios.request(axiosConfig).then((axiosRes) => {
responses[queryHash].forEach((coalescingRequest) => {
coalescingRequest.json(axiosRes.data);
});
responses[queryHash] = undefined;
}).catch((err) => {
responses[queryHash].forEach((coalescingRequest) => {
coalescingRequest.status(500).json(false);
});
responses[queryHash] = undefined;
});
};

关于node.js - Nodejs 代理请求合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com