skip to content
Архитектура в курилке
(AI translated)

Temporal с Keda и почему это не взлетает

/ чтиво на 2 минуты

Содержание

TLDR

Temporal должен быть версии v1.27+, и четырежды перепроверьте имена очередей.

Terminal window
temporal worker deployment list

должен вернуть

Name CreateTime CurrentVersionDeploymentName CurrentVersionBuildID RampingVersionDeploymentName RampingVersionBuildID RampingVersionPercentage

Temporal + Keda = ❤️

Если вы оказались здесь, значит, вы либо любите Temporal, либо ваш надоедливый коллега убедил всех вокруг наконец-то выкинуть Kafka со всеми её dead letter queues и прочей ерундой.

Или вы можете быть как я — тот, кто потратил почти неделю на бесконечный дебаг, бился головой о терминал и сомневался в собственном рассудке, потому что поды не масштабировались. Хотя в очереди на обработку висело около 11 тысяч воркфлоу.

Не будем тянуть, погружаемся.

Настройка

Обычная установка Keda через Helm. На момент написания статьи версия была 2.20.1. Согласно докам, этой версии более чем достаточно для работы с нативными метриками очередей Temporal.

Простой ScaledObject к моему деплойменту (почти целиком сворован из примера keda-temporal):

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: some-worker-that-needed-some-help
namespace: my-favourite-namespace
spec:
scaleTargetRef:
name: some-worker-that-needed-some-help
minReplicaCount: 1
maxReplicaCount: 3
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 30
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleDown:
stabilizationWindowSeconds: 60
policies:
- type: Pods
value: 1
periodSeconds: 60
triggers:
- type: temporal
metadata:
namespace: default
taskQueue: my-queue
targetQueueSize: "10"
endpoint: temporal-frontend.temporal:7233

Ничего особенного — просто простейший пример, чтобы масштабироваться с одного пода, когда случаются всплески создания воркфлоу.

Но нет, не работает. В какой-то момент я уже сомневался, а видел ли мой QA вообще, чтобы оно работало (прости, что сомневался в тебе), потому что на dev всё работало нормально, на stage тоже, а вот на проде стояла реально древняя установка Temporal. Прям древняя. Её развернул ещё позапрошлый DevOps, и с тех пор она безотказно пахала. И ни одна статья, ни одна страница документации не упоминала, что Keda завязана на API, который появился только в v1.27

А проверить это довольно просто:

Terminal window
temporal worker deployment list

Правильная версия должна вернуть что-то вроде этого:

Name CreateTime CurrentVersionDeploymentName CurrentVersionBuildID RampingVersionDeploymentName RampingVersionBuildID RampingVersionPercentage

Даже если ни одного деплоймента у нас нет, мы видим, что API работает и хотя бы что-то возвращает. Иначе вы получите что-то вроде:

Error: unknown method ListWorkerDeployments for service temporal.api.workflowservice.v1.WorkflowService

И об этом нигде не написано. И никто не вернёт всё это потраченное время. Я пишу это, чтобы помочь заблудшей душе, если она столкнётся с той же проблемой на своём пути.

После этого можно проверить: как только в Temporal появляются новые воркфлоу, либо ScaledObject меняет свой статус, либо можно посмотреть на связанный ресурс HPA (k get hpa -w) и увидеть, что его значения меняются.

И, пожалуйста, ради всего святого, если у вас несколько окружений — синхронизируйте версии между ними.

Берегите себя и своих близких.