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

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

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

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

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


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

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

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


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

6 ответов

20 просмотров

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта