Пишу сейчас простой монитор который преобразует данные из афанасия в другой формат хранения. Целью его является сохранение статистики в отдельную базу с сохранением удалённых задач.
Возникла проблема с определением задачи по некоему уникальному параметру.
Исток проблемы это нумерация джобов по порядку, при этом удаление джобы освобождает индекс и его забирает другая джоба. В результате у нас получается повтор.
Мой монитор опрашивает сервер, например, 1 раз в 30 сек.
Предположим такую ситуацию:
1. Создалась джоба (ID 2)
Сабмитер во время отправки назначает какое-то уникальное значение (UID) в custom_data
2. Как-то обновилась, пошел прогресс, изменился статус.
В этот момент монитор запрашивает события. Он получает инфу о том что задача 2 создана, опрашивает сервер чтобы получить детали о задаче.
Задача записывается в отдельную базу используя уникальное значение UID из custom_data и соответствие этого значения текущему ID=2.
Второй эвент который он получит это job_changed. Получив ID 2 монитор запросит текущую задачу 2 с сервера, его UID и найдет соответствие в базе.
3. Задача удаляется
Монитор получит информацию что задача 2 удалена. Опрашивать сервер нет смысла так как задачи уже не существует. Монитор просто находит по этому ID джобу у себя, отмечает её как удалённую и удаляет этот ID, так как он не актуален и может принадлежать другой джобе.
А теперь доспустим что создается джоба с ID=2, монитор её получил и записал. Потом в период 30 сек эта задача удаляется, потом создается новая, так же получая ID=2, и тоже удаляется. В результате монитор получит инфу о том что создана дзоба с ID=2 и удалено две задачи с ID=2, и я не могу опросить сервер чтобы узнать их UID потому что они уже удалены. Более того, сервер присылает ID=2 в количестве одной штуки. То есть удалены задачи с индексом 2 сколько-то штук. А сколько и какие это вам уже не знать.
Если у меня в течение 30 сек создастся и удалится задача. она все 3 раза будет иметь один и тот же ID и в эвентах я получу следующее:
Код: Выделить всё
{'jobs_add': [2], 'jobs_del': [2]}
Что делать в этом случае?
Какое я вижу решение с моей точки зрения:
Прежде всего можно опрашивать сервер почаще, например как это делает WEB GUI, но допустим это не получается.
Чтобы не переделывать имеющуюся логику просто добавить каждой джобе еще один параметр, например uid, в который генерить уникальное значение которое не повторится никогда. Его можно делать уже сейчас используя хеш от времуни создания джобы + её ID, и записывать в custom_data. Да, но приходится это делать в 2 действия. Сначала создать джобу, потом получив её ID и другие данные создать хэш и отправить в custom_data.
Кроме того, хотелось бы получать этот UID в эвентах вместо повторяющегося ID. В таком случае одинаковые ID не сколапсятся в одну цифру потому что UID все разные. Этого уже не сделать без изменения самого сервера.
И дополнительный вопрос.
Есть ли сейчас доступ к удалённым джобам? Что-то типа архива. Если нет то хотелось бы добавить сохранение информации об удалённых джобах, хотябы временно. Например 30 дней после удаления.