Объединение прокси-запросов Nodejs - PullRequest
0 голосов
/ 12 февраля 2019

У меня проблема с моими http-proxy-middleware вещами.Я использую его для прокси-запросов к другому сервису, который может изменять размеры изображений и т. Д.

Проблема заключается в том, что несколько клиентов могут вызывать метод несколько раз и, таким образом, создавать давку в исходном сервисе.Сейчас я изучаю (что некоторые службы называют request coalescing т.е. лаком) решение, которое будет вызывать службу один раз, ждать ответа и «ставить в очередь» входящие запросы с той же сигнатурой, пока не будет выполнена первая, и вернуть их.все за один раз ... Это отличается от «кэширования» результатов из-за того, что я хочу предотвратить одновременный вызов бэкэнда и не обязательно кэшировать результаты.

Я пытаюсь найтиесли что-то подобное можно назвать по-другому, или я что-то упускаю, что другие уже каким-то образом решили ... но я ничего не могу найти ...

Поскольку сценарий использования кажется довольно «базовым» для обратного-процедура установки типа, я бы ожидал много хитов в моих поисках, но, поскольку область проблем довольно общая, я ничего не получаю ...

Спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Мой коллега помог мне взломать мой собственный ответ.В настоящее время он используется в качестве (экспресс) промежуточного программного обеспечения для конкретных GET -конечных точек и в основном хэширует запрос в карту, запускает новый отдельный запрос.Параллельные входящие запросы хэшируются, проверяются и проходят отдельный обратный вызов запроса и, таким образом, используются повторно.Это также означает, что если первый ответ является особенно медленным, все объединенные запросы слишком

Это казалось бы проще, чем взломать его в http-proxy-middleware, но, ну да, это сделало свою работу :)1006 *

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;
  });
};
...