Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как создать очередь почты с помощью kue? (https://javascript.ru/forum/node-js-io-js/81267-kak-sozdat-ochered-pochty-s-pomoshhyu-kue.html)

Hellishcode 01.11.2020 13:54

Как создать очередь почты с помощью kue?
 
Добрый день.
Есть письма, которые отправляет пользователь.
При отправке, каждое письмо помещается в базу данных, где ей присваевается номер письма и время добавления в базу.
В отправке писем, есть лимит на минуту, то есть, пользователь не может отправить больше 100 писем в минуту. Если количество писем превышено, то следующее письмо станет в очередь и отправится через минуту и так далее.
Вот часть моего кода.
queue.create(`email`, {
    title: `HELLO KUE 1`,
    id: Math.floor(Math.random() * Math.floor(100)),
    to: 'tj@learnboost.com',
  })
    .save((err) => {
      if (!err) console.log(`error`);
    }
  );

Но я не понимаю, как правильно вызвать queue.process
Вызывать setInterval каждую минуту? Я думал, что у kue есть механизм для этого?
Подскажите пожалуйста, как это можно сделать с помощью kue

laimas 02.11.2020 11:12

Цитата:

Сообщение от Hellishcode
Вызывать setInterval каждую минуту? Я думал, что у kue есть механизм для этого?

Не знаю Node, и даже не представляю, что за зверь kue, но такие задачи не скрипт выполняет по таймеру, а вешают их на cron. Он в указанные интервалы времени запускает скрипт, который извлекает из базы, обрабатывает и отправляет.

Но о каких пользователях речь, надо полагать это владелец, а 100 в минуту, это ограничение хоста? А ведь не только это ограничение важно, важны еще и домены, на которые отправляется почта. Если на какой либо почтовый сервер с вашего домена будут пачками отправляться письма каждую минуту, то это большая вероятность того, что ваш домен попадет в итоге в черный список.

voraa 02.11.2020 11:39

Я тоже, к сожалению, не силен в этой теме, но просто призадумался. Что значит 100 писем в минуту и как их (письма и минуты) считать?
Допустим в интервал от 0 до 30 сек отправлено 10 писем
В интервал от 30 до 60 сек - 60 писем
От 60 до 90 - 60 писем
От 90 до 120 - 10 писем.

Считается ли, что за минуту от 30 до 90 сек отправлено больше 100 писем?

voraa 02.11.2020 13:41

О до меня дошло
Цитата:

Сообщение от Hellishcode
каждое письмо помещается в базу данных, где ей присваевается номер письма и время добавления в базу.

Надо смотреть время отправки сотого назад письма (если оно есть).

laimas 02.11.2020 19:05

voraa,
как? Ну неужели, если речь идет о рассылке, вы запустите какой-то скрипт и станете ждать окончания его работы? Сомневаюсь. :)

Такие вещи обычно отдаются планировщику задач, и к базе он обращается не "к сотому назад", а помещает в базу статус выполнения задачи и время ее последнего выполнения. Вот от этой метки и извлекаются из базы очередные N записей.

Hellishcode 05.11.2020 12:30

Но не буду же я писать setInterval который будет обращаться к базе? Я думал, что в kue есть подобный механизм - отложенная очередь - или что-то типа того....

SuperZen 05.11.2020 14:45

Вощемана нужен RateLimiter

1) Kue is no longer maintained
Please see e.g. Bull as an alternative. Thank you!

2) https://github.com/Automattic/kue/issues/441
https://www.binpress.com/rate-limiting-with-redis-2/

--
Почему kue? Разраб же пишет бери это:
https://github.com/OptimalBits/bull/...RENCE.md#queue

laimas 05.11.2020 14:55

Цитата:

Сообщение от Hellishcode
Но не буду же я писать setInterval который будет обращаться к базе? Я думал, что в kue есть подобный механизм

Я не знаю вообще, что такое kue, тем паче что в нем есть. Но рассылка и подобные задачи, это скрипты вызываемые планировщиком. Следовательно на сервере пишут скрипт - диспетчер задач. К нему обращается планировщик. Диспетчер извлекает из таблицы задач задачу (задачи), которые актуальны на текущее время, если статус задачи имеет состояние "не выполнено" и время последнего выполнения задачи. Запускает скрипт (скрипты) задач, которые и обслуживают и рассылку, и прочие задачи. Скрипт занимающийся рассылкой извлекает N записей и базы от последнего времени выполнения задачи. Если более записей не будет, задача выполнена и скрипт пишет в таблицу задач статус "выполнено".

Планировщик задач, это cron, запускаемый в указанные интервалы времени, это может быть каждую минуту, 10 минут, час ... И он есть на каждом уважающем себя хосте, а в панели управления хостом обязательно поясняется как у конкретного хостера запустить из под cron скрипт.


Часовой пояс GMT +3, время: 05:21.