Агрегация и отправка данных от нескольких запросов nodejs

Окружение: nodejs 17.2, expressjs 4.17

Задача: На урл вида "/user-actions" прилетают с разных серверов данные со скоростью примерно 2 запроса в секунду. Надо агрегировать их и раз в секунду отправлять на другой сервер.

Например:

  • Запрос #1: {userId: 1, action: "hitOne"}
  • Запрос #2: {userId: 2, action: "hitFive"}
  • Запрос #3: {userId: 1, action: "hitFive"}

Надо получить 2 объекта

const data = [{userId: 1, action: "hitOne"}, {userId: 2, action: "hitFive"}]

и

const data = [{userId: 1, action: "hitFive"}]

Каждый из этих объектов 1 раз в секунду отправлять на другой сервер, примерно как -то так

http.post('http://newserver.url/user-actions', {data});

Думал сделать переменную, в которую записывать все, что приходит в запросе и по таймеру раз в секунду отправлять эту переменную на новый сервер. Но что-то мне подсказывает: или с переменной будут проблемы (например из-за конкурирующих запросов) а не всегда будут те данные, которых я ждал, или с таймером какая-то лажа выйдет.

Как правильно такой сценарий реализовать?


Ответы (1 шт):

Автор решения: Alexey Ten

Я бы сделал как-то так, если не нужна какая-то суперточность в интервале отправки:


const queue = [];

// Получаем данные
app.all('/user-data', (req, res) => {
   queue.push({ /* данные из запроса */ });
   res.end('ok');
});

const sendData = () => {
    if (!queue.length) return;
    // забираем все данные из очереди
    const data = queue.splice(0);
    // и отправляем
    // http.request('http://newserver.url/user-actions', /* тут правильные параметры для отправки data */);

}

setInterval(sendData, 1000);
→ Ссылка