Passa al contenuto principale

scheduler

Cosa fa

scheduler centralizza la pianificazione dei job backend (cron giornalieri/settimanali/mensili), li esegue via HTTP verso altri microservizi e traccia lo stato di esecuzione.

Ruoli e responsabilita

  • lettura configurazione job da datahub (tabella scheduler_jobs);
  • esecuzione job sincroni e asincroni con retry/backoff;
  • pubblicazione eventi di lifecycle (TASK.STARTED, TASK.COMPLETED, TASK.ERROR) su Redis;
  • persistenza stato ultima esecuzione (last_run_at, last_status) su Redis KV + datahub;
  • firma token interni (x-internal-token) quando invoca endpoint /internal/*.

Porta esposta

  • Porta interna servizio: 3014
  • Esposizione via Traefik: https://api.trading.expovin.it/scheduler/*

Architettura grafica

Operatori / Frontend

Gestione job via REST (/jobs, /reload, /run)

Traefik

Routing /scheduler/* + CORS + ForwardAuth

HTTP API + internal orchestration
scheduler

SchedulerCore + SchedulerEngine (cron, retry, async hooks)

  • carica job da datahub (scheduler_jobs)
  • firma token interni per endpoint /internal/*
  • pubblica eventi TASK.* su Redis
datahub

CRUD scheduler_jobs + last_run persistito

Redis

bus eventi + hook async + KV last-run

Microservizi target

decision-engine, tickerScanner, altri endpoint job

Autenticazione interna service-to-service

Quando un job punta a endpoint /internal/*, scheduler firma un token con chiave privata (INTERNAL_JWT_PRIVATE_KEY) e lo inoltra nel header x-internal-token.

Dettaglio completo del modello chiave privata/pubblica:

Configurazione (docker-compose.paper.yml)

scheduler:
image: expovin/scheduler:${SCHEDULER_VERSION}
restart: unless-stopped
depends_on:
dbmanager:
condition: service_healthy
networks:
- trading_net
profiles: ["scheduler"]
environment:
- DBMANAGER_URL=${DBMANAGER_URL}
- CACHEMANAGER_URL=${CACHEMANAGER_URL}
- ALERTINGSERVICE_URL=${ALERTINGMANAGER_URL}
- REDIS_URL=${REDIS_URL}
- LOG_LEVEL=${LOG_LEVEL}
- ENV=${ENV}
- LOG_BATCH_MAX_BYTES=${LOG_BATCH_MAX_BYTES}
- ENABLE_DB_LOG=${ENABLE_DB_LOG}
- INTERNAL_JWT_PRIVATE_KEY=${INTERNAL_JWT_PRIVATE_KEY}
- INTERNAL_JWT_PUBLIC_KEY=${INTERNAL_JWT_PUBLIC_KEY}
- INTERNAL_JWT_ISS=${INTERNAL_JWT_ISS}
- INTERNAL_JWT_EXP_SECONDS=${INTERNAL_JWT_EXP_SECONDS}
- TZ=${TIMEZONE}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3014/status/health"]
labels:
- "traefik.enable=true"
- "traefik.http.routers.scheduler.rule=Host(`api.trading.expovin.it`) && PathPrefix(`/scheduler`)"
- "traefik.http.services.scheduler.loadbalancer.server.port=3014"
- "traefik.http.routers.scheduler.middlewares=scheduler-stripprefix,cors-default@docker,auth-forward@docker"

Variabili d'ambiente

Infrastruttura

Variabili obbligatorie gestite da BaseService (comune a tutti i microservizi).

VariabileDefaultDescrizione
DATAHUB_URLhttp://datahub:3000URL del servizio datahub (ex DBMANAGER_URL, ancora accettato come alias). Usato per caricare i job dalla tabella scheduler_jobs e aggiornare last_run_at/last_status.
CACHEMANAGER_URLhttp://cachemanager:3006URL del cachemanager. Disponibile come variabile di contesto per i job che puntano a endpoint del cachemanager.
ALERTINGSERVICE_URLhttp://alertingservice:3008URL dell'alertingservice. Disponibile come variabile di contesto per i job che puntano a endpoint del servizio di alerting.
REDIS_URLURI Redis (es. redis://redis:6379). Obbligatorio per il bus eventi, la pubblicazione degli eventi TASK.* e la persistenza last_run in KV.
LOG_LEVELinfoLivello di log: trace, debug, info, warning, error.
ENVDEVAmbiente di esecuzione (local, paper, prod). Usato nel prefisso dei canali Redis.
LOG_BATCH_MAX_BYTESDimensione massima batch per il log su DB (funzionalità dbLogger).
ENABLE_DB_LOGSe true, abilita la scrittura dei log su DB via datahub.
TZTimezone di sistema del container (es. America/New_York).

Autenticazione interna service-to-service

VariabileDefaultDescrizione
INTERNAL_JWT_PRIVATE_KEYChiave privata RSA/EC usata per firmare i token x-internal-token quando un job invoca endpoint /internal/*. Obbligatoria se esistono job che puntano a endpoint interni.
INTERNAL_JWT_PUBLIC_KEYChiave pubblica RSA/EC corrispondente. Distribuita agli altri microservizi per la validazione del token.
INTERNAL_JWT_ISSIssuer (iss) del token JWT interno. Il valore di default nel codice è astraai-internal.
INTERNAL_JWT_EXP_SECONDS60Durata in secondi del token interno. Il token ha TTL di 60 secondi per default.

Scheduling e timezone

VariabileDefaultDescrizione
SCHEDULER_TZAsia/DubaiTimezone di default applicata ai job che non specificano una timezone propria in scheduler_jobs.

URL microservizi (contesto job)

Le variabili seguenti definiscono gli URL base dei microservizi del sistema. Vengono usate indirettamente dallo scheduler come destinazione HTTP dei job configurati in scheduler_jobs.

VariabileDefaultDescrizione
MARKETSIMULATOR_URLhttp://marketsimulator:3003URL del market simulator.
ORDERSIMULATOR_URLhttp://ordersimulator:3004URL dell'order simulator.
ORDERLISTNER_URLhttp://orderlistner:3005URL dell'order listener.
STRATEGYUTILS_URLhttp://strategyUtils:3007URL delle strategy utils.
CAPITALMANAGER_URLhttp://capitalmanager:3009URL del capital manager.
SMA_URLhttp://sma:3010URL del servizio SMA.
SLTP_URLhttp://sltp:3011URL del servizio SLTP.
LIVEMARKETLISTNER_URLhttp://livemarketlistner:3012URL del live market listener.
TICKERSCANNER_URLhttp://tickerscanner:3013URL del tickerscanner. Usato per i job che invocano /internal/fundamentals/user-daily-scores.
SCHEDULER_URLhttp://scheduler:3014URL dello scheduler stesso (auto-referenza).

FMP (Financial Modeling Prep)

Usato dallo scheduler per il controllo dell'apertura dei mercati (openMarket: true nei job).

VariabileDefaultDescrizione
FMP_API_KEYAPI key FMP. Richiesta dai job con openMarket: true per verificare lo stato del mercato prima dell'esecuzione. Se assente, il controllo viene saltato e il job viene comunque eseguito.
FMP_BASE_URLhttps://financialmodelingprep.comBase URL delle API FMP. Sovrascrivibile per ambienti di test o proxy interni.

Internals

VariabileDefaultDescrizione
PORT3014Porta su cui il server REST è in ascolto.
SCHEDULER_INIT_RETRY_MS10000Intervallo in millisecondi tra un tentativo e il successivo di inizializzazione quando il datahub non è raggiungibile.
MICROSERVICE_NAMEschedulerNome del microservizio usato nei log e nei canali Redis. Sovrascrivibile per ambienti di debug.

Pagine dedicate