170 похожих чатов

Всем привет! Кейс - рассылка уведомлений 5-ти тысячам пользователей Сейчас: Для рассылки

всем - запускается JOB, которая в фоне добавляет другие JOB с низким приоритетом очереди на отправку сообщения пользователю.
Получается 1-я JOB порождает и добавляет в очередь 5-тысяч JOB.

Но возникает проблема, так как запрос на рассылку поступает на контроллер из веб-приложения, то некоторые умудряются запустить рассылку 2 и более раз

Как предотвратить запуск рассылки если уже идет рассылка?

Я предположил несколько вариантов:

1. Упаковать все в Batch и мониторить по идентификатору - но наполнить переменную $job (как показано в документации) 5-ю тысячями объектов NotifyJob в которую я передам каждого пользователя - слишком жирно для памяти

2. Сделать определенное поле в кеше, но тогда - как обязать последнюю Job сменить статус на "нет рассылки"

18 ответов

22 просмотра

Лок с id рассылки с некоторым ttl

L-K Автор вопроса
Yushkevich Vitaly
Лок с id рассылки с некоторым ttl

А можете расписать идею пошире. А то не понял немного

Вот как вариант https://laravel.com/docs/10.x/queues#unique-jobs

Yushkevich Vitaly
Лок с id рассылки с некоторым ttl

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

L-K Автор вопроса
Egor Gruzdev
Вот как вариант https://laravel.com/docs/10.x/que...

Да... Я понял уже что надо все завернуть в одну джобу и поставить на нее безлимитный тайм чтобы она обрабатвала 5тысяч пользователей а ошибочных пропускала

для чего порождать 5к задач, если можно обойтись одной? в момент создания очереди определяем ее уникальный идентификатор который позволит провести дедубликацию. пример. берем айди пользователя и json реквеста. складываем, берем от строки хэш. это и будет уникальный идентификатор под этим идентификатором кладем данные в редиску (не заставляйте базу отдавать вам такие большие ответы, не любит он такого) перед тем как задиспатчить джобу - проверяем есть ли такая запись в редиске? есть - скипаем, нет - диспатчим в джобу передаем только идентификатор редиски. не пихайте 5к айдишников, они уже хранятся отдельно (для параноиков используем файл вместо редиски) далее джоба поднимается и начинает вычитывать айдишники. взяла пачку в 10 штук, исполнила, записала прогресс. взяла, исполнила, записала. прогресс. упала, поднялась, проверила диф между основных хранилищем и тем что записано в прогрессе и продолжает выполняться. но возможно стоит посмотреть в сторону сервисов предоставляющих услуги батч рассылки. одним запросом вы отправляете все эмейлы и забываете.

L-K Автор вопроса
Алексей
для чего порождать 5к задач, если можно обойтись о...

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

L K
5к задач было сделано для параллельного и независи...

если у вас 300 почтовых серверов которые асинхронно выполняют рассылку - ну может быть и круто параллельно и независимо делать рассылку а если у вас 1 почтовый сервре который в 1 потоке синхронно обрабатывает ваши запросы - так может ну его нафиг спамить конкурентными запросами его? ладно если у вас 1 воркер на этой очереди, все ваши джобы одна за другой будут отрабатывать. а если 10 воркеров? я хз что у вас за почтовый сервер, но он может и обидеться под нагрузкой

L-K Автор вопроса
Алексей
если у вас 300 почтовых серверов которые асинхронн...

Там телеграм рассылка и параллельно по 2, 3 джобы

L-K Автор вопроса
L K
Там телеграм рассылка и параллельно по 2, 3 джобы

ааа, вы телегу пушите? тогда развлекайтесь конечно)) хз сколько там тротлинг, но я бы на всякий случай чекнул этот момент)))

L-K Автор вопроса

Развлекайтесь?))) в чем подвох?))

L K
Развлекайтесь?))) в чем подвох?))

если тротлинга нет и телега вас не пошлет нахрен - то нет ниакого подвоха. я не читал апи телеги, но на 98% уверен что что то там с тротлингом должно быть...

L-K Автор вопроса
Алексей
если тротлинга нет и телега вас не пошлет нахрен -...

Там троттлинг. Есть. Но мы делаем таймаут когда он появляется

L K
Там троттлинг. Есть. Но мы делаем таймаут когда он...

ну тут уже дело ваше. первоначальный запрос вроде закрыли)

L-K Автор вопроса
SiZE
Стремный вариант. Надо угадать, время, количество....

Причем тут угадывание? У тебя есть прогнозное время, за которое Джоба должна нагенерить других джоб. Твоя задача - не сделать оверлап. Это решается легко и разными способами. https://divinglaravel.com/dispatching-unique-jobs-to-laravel-queues Вот пример, про который я писал. Что в нем стремного?

>Как предотвратить запуск рассылки если уже идет рассылка? консюмить очередь и если там есть месаги не запускать просто?

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Карта сайта