Содержание
TLDR
Temporal должен быть версии v1.27+, и четырежды перепроверьте имена очередей.
temporal worker deployment listдолжен вернуть
Name CreateTime CurrentVersionDeploymentName CurrentVersionBuildID RampingVersionDeploymentName RampingVersionBuildID RampingVersionPercentageTemporal + Keda = ❤️
Если вы оказались здесь, значит, вы либо любите Temporal, либо ваш надоедливый коллега убедил всех вокруг наконец-то выкинуть Kafka со всеми её dead letter queues и прочей ерундой.
Или вы можете быть как я — тот, кто потратил почти неделю на бесконечный дебаг, бился головой о терминал и сомневался в собственном рассудке, потому что поды не масштабировались. Хотя в очереди на обработку висело около 11 тысяч воркфлоу.
Не будем тянуть, погружаемся.
Настройка
Обычная установка Keda через Helm. На момент написания статьи версия была 2.20.1. Согласно докам, этой версии более чем достаточно для работы с нативными метриками очередей Temporal.
Простой ScaledObject к моему деплойменту (почти целиком сворован из примера keda-temporal):
apiVersion: keda.sh/v1alpha1kind: ScaledObjectmetadata: name: some-worker-that-needed-some-help namespace: my-favourite-namespacespec: 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
А проверить это довольно просто:
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) и увидеть, что его значения меняются.
И, пожалуйста, ради всего святого, если у вас несколько окружений — синхронизируйте версии между ними.
Берегите себя и своих близких.
