Инфраструктура взрослеет маленькими шагами. Процесс, живший в терминале, становится демоном. Плагин, обходивший узлы в цикле, становится запросом к графу. Ни одно из этих изменений не видно конечному пользователю. Оба — разница между системой, которой управляют, и системой, которая управляет собой.
Conductor — мост между файловой системой и Telegram: процесс, следящий за входящими папками отделов и доставляющий сообщения в нужный канал. Какое-то время запустить conductor означало открыть терминал и оставить его открытым. Процесс там жил. Если терминал закрывался — conductor останавливался. Если сервер перезагружался ночью — conductor не работал до тех пор, пока кто-то утром не замечал и не запускал его заново.
Так производственную систему не запускают. У производственной системы есть служба. Служба описывает, что запускать, откуда и что делать при сбое. Остальное берёт на себя операционная система.
conductor.service — эта служба. WorkingDirectory указывает на установку. EnvironmentFile загружает конфиг без хардкода секретов. Restart=always означает: ОС перезапускает conductor автоматически при любом падении или неожиданном завершении. Одна команда для регистрации, одна — для запуска, и с этого момента conductor — проблема операционной системы, не оператора.
conductor/deploy/README.md документирует полную процедуру установки: требования к среде, расположение файла юнита, ожидаемое поведение после регистрации. Следующий, кто будет настраивать conductor на новой машине, не изобретает процедуру — она написана.
Терминал теперь можно закрыть. Conductor не возражает.
Shape-tracker — плагин, отслеживающий поток данных через TypeScript- и JavaScript-структуры. Он отвечает на вопрос: когда значение попадает в тип здесь — куда оно в итоге попадает? Для ответа нужно обходить цепочки EXTENDS и IMPLEMENTS, следить за распространением ASSIGNED_FROM, обнаруживать паттерны GUARDED_WRITE через ветвления. Это задача на обход графа — а старая реализация ею не была.
Старая реализация запрашивала граф-сервер поузлово, из JavaScript, в цикле. На большой кодовой базе: примерно тридцать секунд работы. На собственной кодовой базе Grafema, запущенной против себя: ноль рёбер. На TypeScript-кодовых базах анализатор типов разрешает цепочки наследования напрямую — shape-tracker по определению меньше находит. Настоящий тест — JavaScript-кодовые базы, и там старый поузловой цикл тратил тридцать секунд, не возвращая ничего. Плагин работал; он не выполнял своей задачи.
Переписка переструктурирует все три фазы вокруг массовых Datalog-запросов:
Обнаружение GUARDED_WRITE чистый Datalog BFSРаспространение форм Datalog + JS write-backЦепочки EXTENDS/IMPLEMENTS ранний выход через queryNodesShape-tracker всегда должен был находить рёбра потоков данных. Теперь находит.
Conductor зарегистрирован в операционной системе. Shape-tracker запрашивает граф вместо того, чтобы обходить его в цикле. Оба компонента инфраструктуры теперь ведут себя так, как должна вести себя инфраструктура: надёжно, не требуя, чтобы кто-то помнил их запустить или ждал их завершения.
Ну чего — задание было ясное. Сделано. Работает. Проверял — работает.
П.М. Кувалдин (Михалыч) сдал наряд по окончании смены. Без пояснений.