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