Нужно вытащить выписку по пользователю. Выписку можно вытаскивать максимум за 31 день. Вопрос: как на беке организовать логику эндпоинта, который получает любое значение from-to и на основании количества месяцев делает нужное количество запросов к банку раз в минуту?
1. Норм ли делать обычный setInterval? 2. Как хендлить что текущий setInterval уже работает, и юзеру нужно выкинуть ошибку мол «процесс уже запущен»? И можно ли так вообще делать, или нужно в массив текущего setInterval добавить новые значения юзера
создавай какую-нибудь запись в редисе с таймаутом (гугли redis locks), и в коде тупо проверяй ее наличие (если есть - запрос не посылай). setInterval - выглядит как костыль
А как проверять редис? Редис ведь тоже нужно пинговать)
если отвалиться редис - то тут явно будет какое-то исключение, пинговать его - ты имеешь ввиду мониторить ?
Ну да Вот ты говоришь что в редис можно поставить 60 секундный токен, и его чекать А как его чекать? Фронт хочет отправить 1 запрос с from-to, и забыть, а бек должен в фоне сам выполнить нужное количество запросов
https://github.com/OptimalBits/bull у була есть отложенные таски и рейт-лимит для них, юзает редис
ну когда ты с фронта принимаешь запросы - ты можешь в БД создать запись, отдать на фронт ссылку для просмотра результата, а когда получишь инфу данные в Бд обновить. Как фронт узнает что инфа получена - уже другое дело, либо сокетами оповестить, либо пусть фронт с определенным интервалом проверяет статус по ссылке
можно просто сделать очередь и один долгий промис
Та о фронте забудь) он попросил бек и сам об этом забыл Вопрос только в том как беку это захендлить
Это как?
Не уверен что хочу еще одну либу в зависимостях и пару потраченных вечеров на чтение доки чтоб сделать эту задачу
ну разезолвить запрос только когда соберешь все данные (которые можно запросить раз в минуту)
Мне не нужен один огромный промис Фронт по сути дает команду «сделай это», но не ждет результата
у p-queue есть опции по запуску N задач раз в M времени https://github.com/sindresorhus/p-queue
ну вот я об этом же +- и говорил
а тогда если его не надо оповещать что типо запрос прошел успешно и вот тебе данные тогда сразу ему 200 и через очередь собирай данные
Не смог найти в доке инфу (это определенно касается не самой либы) как запускать очереди только для конкретного юзера Т.е. в одно время систему может юзать 10 человек, все они могут запросить загрузку данных, а значит у меня должно быть 10 параллельных очередей Как такое реализовать лучше всего?)
А, или по сути новый инстанс PQueue это и есть то что мне нужно Типо пришел запрос сделать что-то, я сделал новый инстанс в и очередь этого инстанса накидал запросы Лан, вопрос видимо решен
new Map. ключ -- юзер ид, значение -- очередь. надо еще продумать как удалять неактивные очереди, чтобы память не текла. ну или создавать новый инстанс, без Map. если тебе не надо заново обращаться к очереди
Та ну удалять по-идее легко Просто последним запросом в очереди добавить коллбек, который мэпу очищает Но мне заново обращаться по-идее не нужно, так что думаю и new хватит Спасибо за идеи)
А нормально ли будет такие данные держать в памяти сервера?)
Обсуждают сегодня