Задачи и внедрявания
Задачи
Задачата (job) е една единица работа за един агент или конектор. Внедряванията се разклоняват на много задачи; скриптовете, опресняванията на инвентаризацията и рестартиранията са единични задачи.
sentсе задава, когато задачата бъде записана в WebSocket. Безackв рамките на 60 s задачата се връща вcreatedи се изпраща отново при следващата връзка. Съобщениетоhelloна агента изброява задачите, които той все още държи, така че двете страни се синхронизират след повторно свързване.- Агентите изпълняват задачите последователно за всяко устройство (без едновременни инсталатори); сървърът все пак може да постави много задачи в опашка.
- Всяка задача има
expires_at; периодичната проверка за офлайн устройства маркира задачите с изтекъл срок катоtimeout. - Започнала задача (
running; агентите изпращат съобщение за напредък, когато задача започне) изтичаtimeout_seconds+ 5 минути след началото си. Агентът изпълнява задачите на устройството една след друга, затова задача, която е потвърдил, но не е започнал, чака, докато има неприключила по-ранна задача на устройството, и след това се отчита от момента, в който последната от тях е приключила (сесиите за отдалечен работен плот не се броят). - Резултатите са идемпотентни: дублиран
job.resultза приключила задача се игнорира. - Тайните, от които задачата се нуждае (LDAP парола, идентификационни данни
за push инсталиране, токен за регистриране, връзки за изтегляне), се
добавят при доставката от обогатителите на задачи (job enrichers).
Таблицата
jobsсъхранява само препратки или запечатан шифротекст.
Планировчик на внедряванията
Основни инварианти:
deployment_targetsсе материализира веднъж при стартирането. Устройствата, регистрирани по-късно, не се добавят автоматично; Add new devices изпълнява филтъра отново.- Едно преминаване избира само целите в
pendingна онлайн устройства, като спазваmax_concurrency(цели в опашка, изтегляне или инсталиране) и прозореца за поддръжка в часовата зона на обекта на устройството. - Прозорецът се оценява в SQL:
deployment_in_window(now, coalesce(site tz, tenant default tz), start, end). - Едновременно се изпълнява само едно преминаване за внедряване
(
SELECT … FOR UPDATEвърху реда на внедряването; резултатите за цели първо заключват внедряването в същия ред, а при взаимно блокиране (deadlock) се прави повторен опит), така че няколко реплики могат безопасно да изпълняват преминавания. - Преминаванията се изпълняват на всеки 30 s, при всяко
helloот агент, който има чакащи цели, и след всеки резултат за цел (обединени за всяка секунда). Преминаването също така уточнява състоянието на целите, чиято задача е приключила без резултат. - Неуспешна цел или цел с изтекло време, за която има оставащи повторни
опити, се връща в
pendingсnext_attempt_at = now + retry_backoff × 2^(attempt-1). - Когато внедряването изтече, чакащите и поставените в опашка цели изтичат (задачите в опашката се отменят на агента).
- Състоянието и броячите на внедряването се преизчисляват от неговите цели при всяка промяна и се кешират в реда.
- Задачите не съхраняват връзка за изтегляне. Обогатителят за пакети
предварително подписва нов URL, валиден един час, при всяка доставка на
задачата; агентите опресняват изтекла връзка чрез
GET /api/agent/v1/packages/{id}/download-url.
Определяне на целите
all, devices (изричен списък) или filter (филтърът за устройства
плюс условия software_present / software_absent с незадължително
сравнение на версията чрез version_cmp). Устройствата без агент и
изведените от експлоатация устройства се изключват и се отчитат в
excluded_count. Най-много 20 000 цели (too_many_targets).
Планировчикът се тества от
entrosity-axis.backend/internal/deploy/scheduler_integration_test.go,
който симулира парк от устройства в различни часови зони, прозорци,
повторни опити и повторни свързвания.