Этот проект является 100% экспериментальным. Пожалуйста, не пытайтесь установить контроллер в какой-либо производственной и/или общей среде.
Цель контроллера временных рабочих — упростить запуск рабочих процессов в Kubernetes, используя при этом управление версиями рабочих.
Детерминированные ограничения Temporal могут вызвать головную боль при развертывании или откате изменений кода рабочего процесса.
Традиционный подход к детерминизму рабочего процесса заключается в том, чтобы заблокировать новое поведение за проверками версий. Со временем эти проверки могут стать источником технического долга, поскольку их безопасное удаление из базы кода — это тщательный процесс, который часто включает в себя опрос всех запущенных рабочих процессов.
Управление версиями рабочих — это альтернативный подход, который позволяет привязывать выполнение рабочего процесса к работникам, выполняющим определенную версию кода. Это позволяет автору рабочего процесса пропускать проверки версий в коде и вместо этого запускать несколько версий своего рабочего процесса параллельно, полагаясь на Temporal, который будет закреплять выполнение рабочего процесса за рабочими процессами, выполняющими совместимый код.
Этот проект направлен на обеспечение автоматизации, которая упрощает учет, включая отслеживание того, какие рабочие версии все еще имеют активные рабочие процессы, управление жизненным циклом рабочих развертываний с поддержкой версий и вызов временных API для обновления версии по умолчанию после развертывания.
Регистрация новых рабочих версий
Создание ресурсов развертывания рабочих версий с поддержкой версий
Удаление недоступных рабочих развертываний
Ручное, синее/зеленое и прогрессивное развертывание новых рабочих версий.
Автоматическое масштабирование рабочих развертываний
Автоматический переход на совместимые рабочие версии
Канарский анализ новых рабочих версий
Необязательная отмена после истечения времени ожидания для рабочих процессов в старых версиях.
Передача сигнала ContinueAsNew
в рабочие процессы в старых версиях
Чтобы быть совместимыми с этим контроллером, рабочие процессы должны быть настроены с использованием следующих стандартных переменных среды:
WORKER_BUILD_ID
TEMPORAL_HOST_PORT
TEMPORAL_TASK_QUEUE
TEMPORAL_NAMESPACE
Каждый из них будет автоматически установлен в среде шаблона модуля, и его не нужно указывать вручную вне спецификации TemporalWorker
.
Каждый ресурс TemporalWorker
управляет одним или несколькими стандартными ресурсами Deployment
. Каждое развертывание управляет модулями, которые, в свою очередь, опрашивают Temporal на предмет задач, закрепленных за их соответствующими версиями.
блок-схема ТД
wd[TemporalWorker]
подграф «Последняя/рабочая версия по умолчанию»
d5["Развертывание v5"]
rs5["Набор реплик v5"]
p5a["Под v5-a"]
p5b["Под v5-b"]
p5c["Под v5-c"]
d5 --> rs5
rs5 -> p5a
rs5 --> p5b
rs5 --> p5c
конец
подграф «Устаревшие рабочие версии»
d1["Развертывание v1"]
rs1["Набор реплик v1"]
p1a["Под v1-a"]
p1b["Под v1-b"]
d1 --> rs1
rs1 --> p1a
rs1 --> p1b
dN["Развертывание..."]
конец
вд --> d1
вд --> дН
вд --> d5
п1а -. "версия опроса v1" .-> сервер
п1б -. "версия опроса v1" .-> сервер
п5а -. «версия опроса v5».-> сервер
п5б -. «версия опроса v5».-> сервер
р5с -. «версия опроса v5».-> сервер
сервер["Временный сервер"]
ЗагрузкаПри развертывании новой рабочей версии рабочий контроллер автоматизирует регистрацию новой рабочей версии по умолчанию в Temporal.
Когда старые рабочие процессы завершают выполнение и устаревшие рабочие версии больше не нужны, рабочий контроллер также освобождает ресурсы, удаляя старые развертывания.
последовательностьдиаграмма
автономер
участник Dev как разработчик
участник K8s как Kubernetes
Ctl участника как WorkerController
участник Т как Временный
Dev->>K8s: создать TemporalWorker «foo» (v1)
K8s -->> Ctl: уведомить о создании TemporalWorker «foo».
Ctl->>K8s: создать развертывание «foo-v1»
Ctl->>T: зарегистрировать v1 как новую версию по умолчанию.
Dev->>K8s: обновление TemporalWorker "foo" (v2)
K8s -->> Ctl: Уведомить TemporalWorker "foo" об обновлении
Ctl->>K8s: создать развертывание «foo-v2».
Ctl->>T: зарегистрировать v2 как новую версию по умолчанию.
Ctl->>Ctl: запустить обнаружение критических изменений между v1 и v2.
Ctl->>T: Если версии совместимы, объедините v1 и v2.
циклический опрос, временный API
Ctl -->>T: дождитесь завершения выполнения рабочего процесса v1.
конец
Ctl->>K8s: удалить развертывание «foo-v1».
ЗагрузкаЭтот проект находится на очень ранней стадии; поэтому вклады внешнего кода пока не запрашиваются.
Сообщения об ошибках и пожелания по функциям приветствуются! Пожалуйста, сообщите о проблеме.
Вы также можете обратиться к @jlegrone
на Temporal Slack, если у вас есть вопросы, предложения или вы хотите внести другой вклад.