Zum Inhalt

Worker-Übersicht

Worker-Arten

Die BO-Engine betreibt drei Kategorien von Hintergrundprozessen:

Kategorie Worker Schedule
Daemon refreshSeeds Kontinuierlich (30s Loop)
Cron (Hochfrequenz) recoverBuyIntents Alle 2 Minuten
resolvePendingClaims Alle 2 Minuten
updatePotSizes Alle 15 Minuten
Watchdog Alle 5 Minuten
Cron (Tagesbasiert) settle (Pipeline) 00:00 UTC
awardAffiliateBonus 00:30 + 12:00 UTC
reEngagementEmail 10:00 UTC
Cron (Monatlich) awardLeaderboardBonus 1. des Monats

Architektur

                 Crontab (CRON_TZ=UTC)
        ┌───────────┼───────────────────┐
        ▼           ▼                   ▼
   cron-settle.sh  cron-recover-     cron-refresh-
        │          intents.sh        seeds.sh
        ▼           ▼                   ▼
   settle.ts    recoverBuy          refreshSeeds.ts
   (Pipeline)   Intents.ts          (PID-Daemon)
        │           │                   │
        ▼           ▼                   ▼
   ┌──────────────────────────────────────┐
   │         PostgreSQL + Blockchain       │
   └──────────────────────────────────────┘

Worker-Steckbriefe

refreshSeeds (Daemon)

Eigenschaft Wert
Datei workers/refreshSeeds.ts (264 Zeilen)
Typ Daemon mit PID-Lock
Loop Alle 30 Sekunden
Aufgabe VRF- und Drand-Seed-Rotation
Details Siehe Seed-Rotation

recoverBuyIntents

Eigenschaft Wert
Datei workers/recoverBuyIntents.ts (208 Zeilen)
Schedule Alle 2 Minuten
Aufgabe Verlorene Buy-Transaktionen wiederherstellen
Details Siehe Recovery-Mechanismen

resolvePendingClaims

Eigenschaft Wert
Datei workers/resolvePendingClaims.ts (218 Zeilen)
Schedule Alle 2 Minuten
Aufgabe Pending Claims auflösen
Details Siehe Recovery-Mechanismen

updatePotSizes

Eigenschaft Wert
Datei workers/updatePotSizes.ts (224 Zeilen)
Schedule Alle 15 Minuten + nach Settlement
Aufgabe On-Chain-Pot-Daten in chain_stats synchronisieren

Queries pro Pool (5 Pools):

potAcc = treasury.potAcc(poolId)
rolloverAcc = treasury.rolloverAcc(poolId)
jackpotReserveAcc = treasury.jackpotReserveAcc(poolId)

chain_stats Keys: - jackpot_pool_{0-4} = potAcc + rolloverAcc - jackpot_reserve_pool_{0-4} = jackpotReserveAcc - no_hit_streak_pool_{0-4} = jackpotStates.noHitStreak - charity_balance = USDT-Balance des CharityVault

notifyWinners

Eigenschaft Wert
Datei workers/notifyWinners.ts (98 Zeilen)
Trigger Nach Settlement (non-fatal)
Aufgabe Push-Notifications an Gewinner
Details Siehe Benachrichtigungen

awardAffiliateBonus

Eigenschaft Wert
Datei workers/awardAffiliateBonus.ts (128 Zeilen)
Schedule 00:30 + 12:00 UTC
Aufgabe 5 Bonus-Tipps für erfolgreiche Referrals
Details Siehe Bonus-System

awardLeaderboardBonus

Eigenschaft Wert
Datei workers/awardLeaderboardBonus.ts (125 Zeilen)
Schedule 1. des Monats
Aufgabe Monatliche Leaderboard-Belohnungen
Details Siehe Bonus-System

reEngagementEmail

Eigenschaft Wert
Datei workers/reEngagementEmail.ts (206 Zeilen)
Schedule 10:00 UTC
Aufgabe Comeback-E-Mails an inaktive Spieler
Details Siehe Bonus-System

refresh-global-stats

Eigenschaft Wert
Datei cli/refresh-global-stats.ts (205 Zeilen)
Trigger Nach Settlement
Aufgabe Dashboard-Statistiken aktualisieren

Metriken (7-Tage-Fenster + Allzeit): - Biggest Win - Tickets Played - Prizes Won - Winner Count - Draw Count - Win Distribution (nach Treffern) - Hot/Cold Numbers

Speicher: global_stats_cache-Tabelle (Upsert)

Gemeinsame Patterns

DB-Connection

async function withPg<T>(fn: (pg: Client) => Promise<T>): Promise<T> {
  const pg = new PgClient({ connectionString: DATABASE_URL });
  await pg.connect();
  try { return await fn(pg); }
  finally { await pg.end(); }
}

Jeder Worker öffnet eine eigene Verbindung, keine Connection-Pools.

Error Handling

  • Fatal Workers (Settlement): Fehler → Pipeline FAILED → Exit 1
  • Non-Fatal Workers (Pot-Sync, Notifications): try/catch, Warning loggen, weiter
  • Recovery Workers: Individuelles try/catch pro Item, Fehler einzelner Items blockieren nicht andere