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

Привет всем Используем манго дб у нас пользователь запускает с админки

задание, там есть такое поле как кол-во повторений задания

мы каждое повторение разбираем на + 1 строку в базе

потом когда обработчики будут исполнять, они будут брать каждую строку себе в обработку и будет каждое повторение как отдельная строка


так вот заданий у нас от пользоватлей планируется тысячи, возьмем к примеру условно 2000 заданий

и если каждое задание юзер захочет повторить по 10 000 раз, это в сумме будет

2000 * 10 000 = 20 000 000 строк


вообще такой подход имеет право на жизнь? Или обычно по другому делают?

6 ответов

17 просмотров

Что за задания такие, где нужно выполнить их 10к раз?

As@@t-A Автор вопроса
Максим Мартынов
Что за задания такие, где нужно выполнить их 10к р...

Повторы задания, там Парсинг данных, но речь не об этом

As@@t A
Повторы задания, там Парсинг данных, но речь не об...

И что, если данные не удалось распарсить, задание 10к раз будет падать с той же ошибкой?

As@@t-A Автор вопроса

Самый простой вариант реализации: Приложение получает от пользователя запрос с типом задания и параметрами, в т.ч. количеством повторов. Для задания в базе создаётся 1 строка. Кроме столбцов с параметрами запуска нужны следующие: состояние задачи (Scheduled), число ошибочных запусков (0) и максимальное количество запусков. Затем процесс/поток шедулер триггерит его запуск, записывая в очередь (rabbitmq, activemq, kafka) сообщение с данными по выполнению задачи и меняет его состояние на Running. Воркер получает сообщение, обрабатывает, затем в другую очередь возвращает состояние Success или Failed. Шедулер его получает и меняет состояние задачи. В случае статуса Failed нужно увеличить счётчик ошибочных запусков. Периодически шедулер проверяет, нужно ли запускать задачу. Если состояние Success, или Canceled (пользователь отменил через интерфейс), или Running (уже запущено), или Failed и количество запусков стало равно максимальному, то ничего делать не нужно, в противном случае нужно ещё раз отправить в очередь задание на обработку. В таком виде база не будет засираться ненужными записями. Плюс есть возможность отменять задания. Можно даже реализовать прибивание запущенного воркера. Для этого он должен сразу при получении сообщения о выполнении задачи отправлять в очередь с результатами свой идентификатор (например, pid), который шедулер затем запишет в базу. При получении от пользователя запроса на остановку отправять в очередь сообщение, которое либо воркер получит из очереди в отдельном потоке и воспримет как сигнал к собственной остановке, либо его получит другой воркер и как-то сможет найти его среди процессов и убить. Отправку этого запроса в очередь можно тоже реализовать по-разному, либо писать в обход шедулера, но тогда он как-то должен узнавать о том, что воркер был прибит, либо завести отдельное состояние Stopping, которое будет учитывать шедулер. Плюс есть возможность вносить задержку между запусками. Например, записывать в отдельный столбец время последнего обновления и пропускать задание, если с момента последнего запуска прошло менее 5 минут. Плюс есть возможность управлять временем запуска задания, например строго в период 10:00-20:00 (если это вообще нужно). Плюс управляя приоритетом заданий и количеством очередей можно достаточно гибко ограничивать разрешенную нагрузку. Ну и самое главное, на мой взгляд - можно масштабировать воркеры, если заданий станет очень много (может и шедулер тоже, но там могут быть проблемы с одновременной записью, которые я хз как решить). Если задания отрабатывают параллельно, схема усложняется, но реализация сильно зависит от деталей.

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

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

Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
9
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Карта сайта