Страница 1 из 2

Уникальный ID для Job

Добавлено: Ср июн 13, 2018 8:34 am
paulwinex
Это рассуждения не с целью принять меры а просто как рассуждения, которые ВОЗМОЖНО заинтересуют разработчика в будущем добавить полезную фичу. Потому находимся в разделе болталки.

Пишу сейчас простой монитор который преобразует данные из афанасия в другой формат хранения. Целью его является сохранение статистики в отдельную базу с сохранением удалённых задач.
Возникла проблема с определением задачи по некоему уникальному параметру.
Исток проблемы это нумерация джобов по порядку, при этом удаление джобы освобождает индекс и его забирает другая джоба. В результате у нас получается повтор.

Мой монитор опрашивает сервер, например, 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]}
Что является неоднозначным представлением того что произошло. Для вотча или веба нет разницы что там произошло, они просто берут текущую джобу с индексом 2 и показывают её данные. В моём случае надо все создаваемые джобы фиксировать.

Что делать в этом случае?

Какое я вижу решение с моей точки зрения:

Прежде всего можно опрашивать сервер почаще, например как это делает WEB GUI, но допустим это не получается.

Чтобы не переделывать имеющуюся логику просто добавить каждой джобе еще один параметр, например uid, в который генерить уникальное значение которое не повторится никогда. Его можно делать уже сейчас используя хеш от времуни создания джобы + её ID, и записывать в custom_data. Да, но приходится это делать в 2 действия. Сначала создать джобу, потом получив её ID и другие данные создать хэш и отправить в custom_data.
Кроме того, хотелось бы получать этот UID в эвентах вместо повторяющегося ID. В таком случае одинаковые ID не сколапсятся в одну цифру потому что UID все разные. Этого уже не сделать без изменения самого сервера.

И дополнительный вопрос.
Есть ли сейчас доступ к удалённым джобам? Что-то типа архива. Если нет то хотелось бы добавить сохранение информации об удалённых джобах, хотябы временно. Например 30 дней после удаления.

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 10:32 am
Timur
У задач есть serial - он уникален. По нему всегда можно понять та же ли это задача.

Код: Выделить всё

{'jobs_add': [2], 'jobs_del': [2]}
- WebGUI и AfWatch "понимают" что произошло. Они удалят ноду с id=2 и запросят ноду с id=2, serial они не используют.

Хранилища удалённых задач или какого-нибудь архива нету. Мне тоже бывает нужно, думаю что сделаю, но пока не скажу когда.

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 10:46 am
paulwinex
У задач есть serial - он уникален.
Вот не знал что это, буду пробовать, спасибо.
- WebGUI и AfWatch "понимают" что произошло. Они удалят ноду с id=2 и запросят ноду с id=2, serial они не используют.
Да, они так и сделают но они так и не узнают что там было еще 2 задачи которые имели те же ID бесследно пропали.

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 11:13 am
paulwinex
Serial отчасти помог, но при удалении джоба всё равно приходит ID а не serial и отличить кто есть кто не получается. Всё равно надо сохранять этот ID и даже это не дает однозначности. Задумка хорошая а реализация в одном месте подкачала. Я бы полностью перевел API на Serial, но скорее всего это очень много изменений и багов повлечёт. Что можно сделать в этой ситуации?

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 2:15 pm
Timur
Сериал задумывался для базы данных. Для возможности иметь уникальный ключ. Для возможности отличать задачи. Но не для гуёв, для API, для "обычной" работы с сервером он не задумывался. Гуи, как вы видите прекрасно работают и без него.

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 3:20 pm
paulwinex
Есть ли возможность сделать запрос задачи по serial вместо ID? Либо придется делать поиск по всем задачам.

Re: Уникальный ID для Job

Добавлено: Ср июн 13, 2018 3:55 pm
Timur

Re: Уникальный ID для Job

Добавлено: Чт июн 14, 2018 7:09 am
paulwinex
Благодарю, то что надо.

Re: Уникальный ID для Job

Добавлено: Сб июн 23, 2018 7:29 am
paulwinex
Подскажите что за параметр uids в этом примере?
https://github.com/CGRU/cgru/blob/maste ... _jobs.json
Если запросить данные о джобе в режиме full то такого параметра там нет.

Re: Уникальный ID для Job

Добавлено: Пн июн 25, 2018 10:14 am
Timur
uids - это айдишники пользователей. Можно запрашивать задачи по ним.
full - это "больше" инфы, практически всё что есть. Это надо когда в гуях дабл-клик по задаче делаешь, чтоб построить всё необходимое в новом окне. Да, в таком режиме uids и, возможно, прочие параметры смысла не имеют. Задумывалось что только одну определенную (id) задачу надо запросить.