1

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

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

我试图找出类似的东西是否可能被称为不同的东西,或者我错过了其他人已经以某种方式解决的东西......但我找不到任何东西......

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

谢谢!

4

1 回答 1

0

我的一位同事帮助我破解了自己的答案。它目前用作特定端点的(快速)中间件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;
  });
};
于 2019-02-14T11:50:02.007 回答