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

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

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

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

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


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

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

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


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

6 ответов

7 просмотров

Что за задания такие, где нужно выполнить их 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 (если это вообще нужно). Плюс управляя приоритетом заданий и количеством очередей можно достаточно гибко ограничивать разрешенную нагрузку. Ну и самое главное, на мой взгляд - можно масштабировать воркеры, если заданий станет очень много (может и шедулер тоже, но там могут быть проблемы с одновременной записью, которые я хз как решить). Если задания отрабатывают параллельно, схема усложняется, но реализация сильно зависит от деталей.

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
Открыл свой двухкилобайтный экзешник в x32dbg, а тут какая-то хрень. Смущает кнопка "выполнить до пользовательского кода", а что ещё может быть в файле помимо него ?
НѣкъиⰘижєжєиꙁъвьсєсвѣтьноѣсѣтиѥсть•
11
Вопрос тем кто смотрит видео и слушает подкасты - как вы потом ищете нужную вам информацию? Вот статью я прочитал, потом могу искать нужную мне часть банальным поиском. Пропус...
Aleksandr Druzhinin
4
Мне были интересны дишные хаки и я нашёл любопытный способ на форуме через __traits, что-то вроде int delegate(int) fac = (int n) => n == 0 ? 1 : n * __traits(parent, {})(n - ...
Constantin F.
1
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
14
@FAssembler ты много с формами работал, как цикл обработки сообщений от окошек надо делать, чтобы IsDialogMessage не ломал ввод в эдиты и навигация по табам работала?
The Bird of Hermes
8
Карта сайта