【问题标题】:Nodejs proxy request coalescingNodejs代理请求合并
【发布时间】:2019-02-12 16:57:19
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: node.js optimization http-proxy-middleware


    【解决方案1】:

    我的一位同事帮助我破解我自己的答案。它目前用作特定GET-endpoints 的(快速)中间件,基本上将请求散列到地图中,开始一个新的单独请求。并发的传入请求被散列和检查,并在单独的请求回调上遍历,从而被重用。这也意味着如果第一个响应特别慢,那么所有合并的请求都太慢了

    这似乎比将其入侵 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;
      });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2018-10-15
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多