1.7 KiB
1.7 KiB
Candles cache: precompute wszystkich timeframe (1s…1d)
Cel: przełączanie tf w UI ma być natychmiastowe. Backend ma ciągle liczyć i przechowywać świeczki dla wszystkich timeframe:
1s 3s 5s 15s 30s 1m 3m 5m 15m 30m 1h 4h 12h 1d
Jak to działa
- Ticki (append-only) lądują w
drift_ticks. - Worker
candles-cache-worker:- liczy świeczki dla każdego
bucket_secondsbezpośrednio zdrift_ticks, - trzyma w DB “ostatnie N” świec (domyślnie
N=1024) per(symbol, source, tf), - jeśli danych historycznych jest mniej (np. brak wielu dni) — zapisuje tylko to, co istnieje,
- robi backfill/warmup przy starcie i potem dopisuje “na bieżąco” w pętli.
- liczy świeczki dla każdego
- API
GET /v1/chartczyta cache-first zdrift_candles_cache(fallback do on-demand funkcji, jeśli cache pusty).
Tabela
drift_candles_cache(Timescale hypertable, partycjonowanie pobucket)bucket_seconds= długość świecy w sekundachsource=''oznacza “(any)” (brak filtra po źródle ticków)
Worker
Plik: services/candles-worker/candles-cache-worker.mjs
Env:
CANDLES_SYMBOLS(np.SOL-PERP,PUMP-PERP)CANDLES_SOURCES(np.any,drift_oracle)CANDLES_TFS(np.1s,3s,5s,15s,...,1d)CANDLES_TARGET_POINTS(default1024)CANDLES_BACKFILL_DAYS(opcjonalnie: wymusza minimalny warmup “co najmniej X dni”)CANDLES_POLL_MS(default5000)
Dlaczego to jest szybkie
- najcięższe agregacje są robione raz i utrzymywane “na bieżąco”,
- przełączenie
tfto tylko query po gotowych wierszach (order_by bucket desc limit N), - “flow/brick stack” w
/v1/chartjest liczone z cache “point candles” (np.1s/3s/5s/15s/…) bez skanowaniadrift_ticks.