Integração Temporal

Esta página é uma referência de configuração para clientes e workers do Temporal. O fragmento final do registro mostra como conectar as entradas; ele não é um projeto independente.

Os tipos de entrada temporal.client e temporal.worker conectam workflows e atividades do Wippy ao Temporal.

Configuração do Cliente

O tipo de entrada temporal.client define uma conexão com um servidor Temporal.

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

Campos Obrigatórios

Campo Descrição
address Endereço do servidor Temporal (host:port)

Campos Opcionais

Campo Padrão Descrição
namespace "default" Namespace Temporal
tq_prefix "" Prefixo de nome de task queue para todas as operações
connection_timeout "10s" Timeout de conexão
keep_alive_time "30s" Intervalo de keep-alive
keep_alive_timeout "10s" Timeout de keep-alive

Autenticação

Sem Autenticação

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

Chave de API (Temporal Cloud)

Forneça a chave de API via um destes métodos:

# 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"

Campos de autenticação e credenciais resolvem placeholders ${env:NAME} através do registro de ambiente no momento da decodificação. As diretivas legadas api_key_env / key_pem_env resolvem da mesma forma, mas estão obsoletas; prefira 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"

Certificado e chave também podem ser fornecidos como strings PEM ou do ambiente:

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

Configuração TLS

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)

Verificações de Saúde

health_check:
  enabled: true
  interval: "30s"

Propagação de Contexto de Segurança

O Wippy propaga o ator e o escopo do chamador para workflows e atividades como um header Temporal assinado. A assinatura é HMAC-SHA256 com uma chave mantida pela entrada do cliente:

- 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}
Campo Descrição
security_hmac_key Chave de assinatura codificada em base64; deve decodificar para ao menos 32 bytes
security_hmac_previous_keys Chaves codificadas em base64 ainda aceitas para verificação, para rotação

Ambos os campos são base64 no YAML porque são campos de bytes. Uma chave com menos de 32 bytes decodificados é rejeitada na validação da configuração, assim como declarar security_hmac_previous_keys sem security_hmac_key. Novos headers são sempre assinados com security_hmac_key; toda chave anterior listada é tentada na verificação, então a rotação é: adicione a nova chave como security_hmac_key, mova a antiga para security_hmac_previous_keys e remova-a assim que nenhuma execução em andamento a carregue.

Iniciar um workflow sob um ator ou escopo requer a chave. Se o chamador tem um contexto de segurança e o cliente não tem chave de assinatura, o header não pode ser assinado e o start falha. Um cliente sem chave só pode iniciar workflows a partir de um contexto que não carregue nem ator nem escopo.

O worker obtém as chaves da entrada de cliente que referencia, portanto um worker herda assinatura e verificação de client: sem configurar nada por conta própria. Veja Workflows e Atividades.

Configuração do Worker

O tipo de entrada temporal.worker define um worker que executa workflows e atividades.

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

Campos Obrigatórios

Campo Descrição
client Referência a uma entrada temporal.client
task_queue Nome da task queue

Opções do Worker

Configure o comportamento do worker:

- name: worker
  kind: temporal.worker
  client: app:temporal_client
  task_queue: "my-app-queue"
  worker_options:
    # Identidade
    identity: ""                          # Identidade do worker (aparece na UI do Temporal)

    # Concorrência
    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}              # Lê do registro env
    use_versioning: false
    default_versioning_behavior: "pinned" # or "auto_upgrade"

Campos de credenciais e identificadores resolvem placeholders ${env:NAME} através do registro de ambiente no momento da decodificação. A diretiva legada build_id_env resolve da mesma forma, mas está obsoleta; prefira build_id: ${env:NAME}.

Comportamento de Versionamento

default_versioning_behavior controla como novas execuções de workflow escolhem um build ID de worker quando use_versioning está ativado:

Valor Comportamento
pinned O workflow permanece no build ID em que iniciou durante toda a sua execução
auto_upgrade O workflow pode ser retomado no build ID compatível mais recente após cada tarefa

build_id: ${env:NAME} lê o build ID do registro de ambiente quando um build_id literal não é fornecido.

Session Worker

enable_session_worker: true permite que o worker execute Sessões do Temporal: uma série de atividades fixadas a um único worker (útil quando atividades compartilham estado local como um diretório temporário ou uma conexão aberta). max_concurrent_session_execution_size limita as sessões concorrentes no worker.

Padrões de Concorrência

Opção Padrão
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

Exemplo de configuração

Este fragmento do registro conecta um workflow e uma atividade a um worker. Ele pressupõe um servidor Temporal acessível em localhost:7233 e os dois arquivos de origem Lua referenciados; consulte as páginas de workflows e atividades para ver suas implementações.

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

Veja Também