Passa al contenuto principale

cachemanager

Cosa fa

cachemanager e il servizio centralizzato per la cache storica dei dati di mercato.

Implementa una catena a 3 livelli:

  • L3 (Redis) per hit veloci in memoria;
  • L2 (filesystem) su volume persistente Docker (/app/cache);
  • L1 (provider esterni) quando i dati non sono in cache.

Ruoli e responsabilita

  • espone endpoint interni usati dai microservizi per leggere/scrivere cache;
  • gestisce provider esterni storici (FMP, ALPACA, IBKR);
  • applica politiche di controllo dimensione cache su file e Redis;
  • pubblica stato/eventi su Redis Bus.

Porta esposta

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

Architettura grafica

Microservizi interni

decision-engine, tickerScanner, scheduler, market-data-service, ...

HTTP interno (CACHEMANAGER_URL)
Broker/Provider esterni
  • FMP
  • Alpaca
  • IBKR (via ibkr-bridge)
L1 fetch
cachemanager

Orchestrazione cache a livelli L3 -> L2 -> L1

  • merge e normalizzazione candele
  • scrittura su Redis e file cache
  • monitor soglie e cleanup
cache hit/miss
Redis (L3)

Cache in-memory key candles:{symbol}:{tf}

Filesystem (L2)

/app/cache (file mensili JSON per simbolo/tf)

volume persistente: cachemanager_data:/app/cache

Configurazione (docker-compose.paper.yml)

cachemanager:
image: expovin/cachemanager:${CACHEMANAGER_VERSION}
restart: unless-stopped
profiles: ["cachemanager"]
environment:
- DBMANAGER_URL=${DBMANAGER_URL}
- REDIS_URL=${REDIS_URL}
- IBKR_BRIDGE_URL=${IBKRBRIDGE_URL}
- LOG_LEVEL=${LOG_LEVEL}
- ENV=${ENV}
- TZ=${TIMEZONE}
depends_on:
dbmanager:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3006/status/health"]
labels:
- "traefik.enable=true"
- "traefik.http.routers.cachemanager.rule=Host(`api.trading.expovin.it`) && PathPrefix(`/cachemanager`)"
- "traefik.http.services.cachemanager.loadbalancer.server.port=3006"
- "traefik.http.routers.cachemanager.middlewares=cachemanager-stripprefix,cors-default@docker,auth-forward@docker"

Nota sulla persistenza:

  • il filesystem cache L2 e montato con volume esterno al container: cachemanager_data:/app/cache;
  • quindi i file cache sopravvivono ai restart/redeploy del microservizio.

Variabili d'ambiente

Infrastruttura

Variabili obbligatorie gestite dal core del servizio (pattern comune a tutti i microservizi).

VariabileDefaultDescrizione
DATAHUB_URLhttp://datahub:3000URL del servizio datahub (ex DBMANAGER_URL, ancora accettato come alias).
REDIS_URLURI Redis (es. redis://redis:6379). Obbligatorio per il bus eventi, i canali di stato e la cache L3.
LOG_LEVELinfoLivello di log: trace, debug, info, warning, error.
ENVDEVAmbiente di esecuzione (local, paper, prod). Usato nel prefisso dei canali Redis.
TZTimezone di sistema del container (es. America/New_York).
PORT3006Porta su cui il server Express si mette in ascolto.

Connessione a ibkr-bridge

VariabileDefaultDescrizione
IBKRBRIDGE_URLhttp://ibkr-bridge:3017URL del servizio ibkr-bridge. Alias accettato: IBKR_BRIDGE_URL. Usato quando HISTORICAL_PROVIDER=IBKR per le richieste di dati storici OHLCV.
IBKR_EXCHANGENASDAQExchange di default usato per la risoluzione del conid (contract ID IBKR) quando si effettua una ricerca per simbolo.

Provider storico (L1)

Il provider storico viene selezionato tramite la variabile HISTORICAL_PROVIDER. Ogni provider ha le proprie credenziali.

VariabileDefaultDescrizione
HISTORICAL_PROVIDERFMPProvider storico attivo per il fetch dei dati OHLCV da L1. Valori supportati: FMP, ALPACA, IBKR.

FMP (Financial Modeling Prep)

VariabileDefaultDescrizione
FMP_API_KEYAPI key FMP. Obbligatoria quando HISTORICAL_PROVIDER=FMP.

Alpaca

VariabileDefaultDescrizione
APCA_API_KEY_IDAPI key ID Alpaca. Obbligatoria quando HISTORICAL_PROVIDER=ALPACA.
APCA_API_SECRET_KEYAPI secret Alpaca. Obbligatoria quando HISTORICAL_PROVIDER=ALPACA.
ALPACA_MARKET_FEEDsipFeed dati Alpaca da utilizzare (sip per dati consolidati, iex per dati IEX).
ALPACA_REST_URLhttps://data.alpaca.marketsBase URL delle API REST Alpaca. Sovrascrivibile per proxy interni o ambienti di test.
ALPACA_TIMEOUT10000Timeout in millisecondi per le chiamate REST ad Alpaca.

Cache L3 (Redis)

VariabileDefaultDescrizione
L3_USAGE_ALERT_PERCENT95Soglia percentuale di utilizzo della memoria Redis oltre la quale viene emesso un evento di alert CACHE.L3.THRESHOLD.REACHED.

Server HTTP

VariabileDefaultDescrizione
BODY_LIMIT20mbDimensione massima del body accettata dal parser Express (express.json).

Pagine dedicate