Temporal-Integration

Diese Seite ist eine Konfigurationsreferenz für Temporal-Clients und -Worker. Das abschließende Registry-Fragment zeigt, wie die Einträge verbunden werden; es ist kein eigenständiges Projekt.

Die Entry-Typen temporal.client und temporal.worker verbinden Wippy-Workflows und -Activities mit Temporal.

Client-Konfiguration

Der temporal.client-Entry-Typ definiert eine Verbindung zu einem Temporal-Server.

- name: temporal_client
  kind: temporal.client
  address: "localhost:7233"
  namespace: "default"
  lifecycle:
    auto_start: true

Erforderliche Felder

Feld Beschreibung
address Temporal-Server-Adresse (host:port)

Optionale Felder

Feld Standard Beschreibung
namespace "default" Temporal-Namespace
tq_prefix "" Task-Queue-Namenspräfix für alle Operationen
connection_timeout "10s" Verbindungs-Timeout
keep_alive_time "30s" Keep-Alive-Intervall
keep_alive_timeout "10s" Keep-Alive-Timeout

Authentifizierung

Keine Authentifizierung

- name: temporal_client
  kind: temporal.client
  address: "localhost:7233"
  auth:
    type: none

API-Schlüssel (Temporal Cloud)

Stellen Sie den API-Schlüssel über eine dieser Methoden bereit:

# Direct value
- name: temporal_client
  kind: temporal.client
  address: "your-namespace.tmprl.cloud:7233"
  namespace: "your-namespace"
  auth:
    type: api_key
    api_key: "your-api-key"

# From environment variable
- name: temporal_client
  kind: temporal.client
  address: "your-namespace.tmprl.cloud:7233"
  namespace: "your-namespace"
  auth:
    type: api_key
    api_key: ${env:TEMPORAL_API_KEY}

# From file
- name: temporal_client
  kind: temporal.client
  address: "your-namespace.tmprl.cloud:7233"
  namespace: "your-namespace"
  auth:
    type: api_key
    api_key_file: "/etc/secrets/temporal-api-key"

Auth- und Credential-Felder lösen ${env:NAME}-Platzhalter beim Dekodieren über die Umgebungs-Registry auf. Die Legacy-Direktiven api_key_env / key_pem_env werden auf dieselbe Weise aufgelöst, sind aber veraltet; bevorzugen Sie api_key: ${env:NAME} / key_pem: ${env:NAME}.

mTLS

- name: temporal_client
  kind: temporal.client
  address: "temporal.example.com:7233"
  namespace: "production"
  auth:
    type: mtls
    cert_file: "/path/to/client.pem"
    key_file: "/path/to/client.key"
  tls:
    enabled: true
    ca_file: "/path/to/ca.pem"

Zertifikat und Schlüssel können auch als PEM-Strings oder aus der Umgebung bereitgestellt werden:

auth:
  type: mtls
  cert_pem: |
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----    
  key_pem: ${env:TEMPORAL_CLIENT_KEY}

TLS-Konfiguration

tls:
  enabled: true
  ca_file: "/path/to/ca.pem"
  server_name: "temporal.example.com"    # Override server name verification
  insecure_skip_verify: false            # Skip verification (dev only)

Gesundheitsprüfungen

health_check:
  enabled: true
  interval: "30s"

Propagierung des Sicherheitskontexts

Wippy propagiert den aufrufenden Akteur und dessen Scope als signierten Temporal-Header an Workflows und Activities. Signiert wird mit HMAC-SHA256 und einem Schlüssel, den der Client-Eintrag hält:

- name: temporal_client
  kind: temporal.client
  address: "localhost:7233"
  security_hmac_key: ${env:TEMPORAL_SECURITY_KEY}
  security_hmac_previous_keys:
    - ${env:TEMPORAL_SECURITY_KEY_PREVIOUS}
Feld Beschreibung
security_hmac_key Base64-kodierter Signierschlüssel; muss zu mindestens 32 Bytes dekodieren
security_hmac_previous_keys Base64-kodierte Schlüssel, die zur Verifizierung weiterhin akzeptiert werden, für die Rotation

Beide Felder sind in YAML base64-kodiert, weil es Byte-Felder sind. Ein Schlüssel mit weniger als 32 dekodierten Bytes wird bei der Konfigurationsvalidierung abgelehnt, ebenso das Deklarieren von security_hmac_previous_keys ohne security_hmac_key. Neue Header werden immer mit security_hmac_key signiert; bei der Verifizierung wird jeder aufgeführte vorherige Schlüssel probiert. Die Rotation lautet also: den neuen Schlüssel als security_hmac_key hinzufügen, den alten nach security_hmac_previous_keys verschieben und ihn entfernen, sobald keine laufende Ausführung ihn mehr trägt.

Das Starten eines Workflows unter einem Akteur oder Scope erfordert den Schlüssel. Hat der Aufrufer einen Sicherheitskontext und der Client keinen Signierschlüssel, kann der Header nicht signiert werden und der Start schlägt fehl. Ein Client ohne Schlüssel kann Workflows nur aus einem Kontext starten, der weder Akteur noch Scope trägt.

Der Worker bezieht die Schlüssel aus dem Client-Eintrag, auf den er verweist, sodass ein Worker Signierung und Verifizierung von client: erbt, ohne selbst etwas zu konfigurieren. Siehe Workflows und Activities.

Worker-Konfiguration

Der temporal.worker-Entry-Typ definiert einen Worker, der Workflows und Activities ausführt.

- name: worker
  kind: temporal.worker
  client: app:temporal_client
  task_queue: "my-app-queue"
  lifecycle:
    auto_start: true
    requires:
      - app:temporal_client

Erforderliche Felder

Feld Beschreibung
client Referenz auf temporal.client-Eintrag
task_queue Task-Queue-Name

Worker-Optionen

Worker-Verhalten konfigurieren:

- name: worker
  kind: temporal.worker
  client: app:temporal_client
  task_queue: "my-app-queue"
  worker_options:
    # Identität
    identity: ""                          # Worker-Identität (erscheint in der Temporal-UI)

    # Nebenläufigkeit
    max_concurrent_activity_execution_size: 1000
    max_concurrent_workflow_task_execution_size: 1000
    max_concurrent_local_activity_execution_size: 1000
    max_concurrent_session_execution_size: 1000
    max_concurrent_eager_activity_execution_size: 0

    # Pollers
    max_concurrent_activity_task_pollers: 20
    max_concurrent_workflow_task_pollers: 20

    # Rate limiting
    worker_activities_per_second: 0        # 0 = unlimited
    worker_local_activities_per_second: 0
    task_queue_activities_per_second: 0

    # Timeouts
    sticky_schedule_to_start_timeout: "5s"
    worker_stop_timeout: "0s"
    deadlock_detection_timeout: "0s"
    max_heartbeat_throttle_interval: "0s"
    default_heartbeat_throttle_interval: "0s"

    # Feature flags
    enable_logging_in_replay: false
    enable_session_worker: false
    disable_workflow_worker: false
    local_activity_worker_only: false
    disable_eager_activities: false
    disable_registration_aliasing: false

    # Versioning
    deployment_name: ""
    build_id: ""
    build_id: ${env:BUILD_ID}              # Aus der Env-Registry lesen
    use_versioning: false
    default_versioning_behavior: "pinned" # or "auto_upgrade"

Credential- und Bezeichnerfelder lösen ${env:NAME}-Platzhalter beim Dekodieren über die Umgebungs-Registry auf. Die Legacy-Direktive build_id_env wird auf dieselbe Weise aufgelöst, ist aber veraltet; bevorzugen Sie build_id: ${env:NAME}.

Versionierungsverhalten

default_versioning_behavior steuert, wie neue Workflow-Läufe eine Worker-Build-ID auswählen, wenn use_versioning aktiviert ist:

Wert Verhalten
pinned Workflow bleibt für die gesamte Laufzeit auf der Build-ID, mit der er gestartet wurde
auto_upgrade Workflow kann nach jedem Task auf der neuesten kompatiblen Build-ID fortgesetzt werden

build_id: ${env:NAME} liest die Build-ID aus der Env-Registry, wenn keine literale build_id angegeben ist.

Session Worker

enable_session_worker: true lässt den Worker Temporal Sessions ausführen: eine Reihe von Activities, die an einen einzelnen Worker gebunden sind (nützlich, wenn Activities lokalen Zustand wie ein temporäres Verzeichnis oder eine offene Verbindung teilen). max_concurrent_session_execution_size begrenzt die gleichzeitigen Sessions auf dem Worker.

Nebenläufigkeits-Standards

Option Standard
max_concurrent_activity_execution_size 1000
max_concurrent_workflow_task_execution_size 1000
max_concurrent_local_activity_execution_size 1000
max_concurrent_session_execution_size 1000
max_concurrent_activity_task_pollers 20
max_concurrent_workflow_task_pollers 20
sticky_schedule_to_start_timeout 5s

Konfigurationsbeispiel

Dieses Registry-Fragment verbindet einen Workflow und eine Activity mit einem Worker. Es setzt einen erreichbaren Temporal-Server unter localhost:7233 und die beiden referenzierten Lua-Quelldateien voraus; deren Implementierungen finden Sie auf den Seiten zu Workflows und Activities.

version: "1.0"
namespace: app

entries:
  - name: temporal_client
    kind: temporal.client
    address: "localhost:7233"
    namespace: "default"
    lifecycle:
      auto_start: true

  - name: worker
    kind: temporal.worker
    client: app:temporal_client
    task_queue: "orders"
    lifecycle:
      auto_start: true
      requires:
        - app:temporal_client

  - name: order_workflow
    kind: workflow.lua
    source: file://order_workflow.lua
    method: main
    modules:
      - funcs
      - time
    meta:
      temporal:
        workflow:
          worker: app:worker

  - name: charge_payment
    kind: function.lua
    source: file://payment.lua
    method: charge
    modules:
      - env
      - errors
      - http_client
      - json
    meta:
      temporal:
        activity:
          worker: app:worker

Siehe auch