簡體   English   中英

Node.js代理請求合並

[英]Nodejs proxy request coalescing

我的http-proxy-middleware資料出現問題。 我用它來代理請求到另一個服務,即可能會調整圖像大小等。

問題在於,多個客戶端可能會多次調用該方法,從而在原始服務上創建踩踏事件。 我現在正在研究一種解決方案,該解決方案將調用該服務一次,等待響應並以相同的簽名“排隊”傳入的請求,直到第一個完成,然后全部返回(該服務將某些服務稱為request coalescing )一次即可...這與“緩存”結果不同,原因是我想防止同時調用后端多次,而不必緩存結果。

我正在嘗試查找類似的名稱是否可能被不同地稱呼,或者我是否錯過了其他人已經解決的某些東西……但我找不到任何東西……

由於用例對於反向代理類型設置來說似乎很“基本”,所以我原本希望在搜索中找到很多匹配項,但是由於問題空間非常通用,所以我什么也沒得到...

謝謝!

我的一位同事幫助我破解了自己的答案。 當前,它用作特定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;
  });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM