我的http-proxy-middleware东西遇到了问题。我正在使用它将请求代理到另一个服务,即可能会调整图像大小等。
问题在于,多个客户端可能多次调用该方法,从而在原始服务上创建踩踏事件。我现在正在研究(某些服务称为request coalescing
,即清漆)一种解决方案,该解决方案将调用该服务一次,等待响应并以相同的签名“排队”传入的请求,直到第一个完成为止,并且一次返回所有结果...这与“缓存”结果不同,因为我想防止同时调用后端多次,而不必缓存结果。
我正在尝试寻找类似的名称,还是我想念其他人已经解决的某些东西...但是我找不到任何东西...
由于用例对于反向代理类型设置来说似乎很“基本”,所以我本来希望在搜索中找到很多匹配项,但是由于问题空间非常通用,所以我什么也没得到...
谢谢!
答案 0 :(得分:0)
我的一位同事帮助了我 hack 我自己的答案。目前,它已用作特定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;
});
};