Motor de catalog de conținut
Motorul de catalog este nucleul vitrinelor de joc și al colecțiilor promo din față: colectează și normalizează metadatele de la furnizori (RGS), oferă căutare/filtre/clasament, aplică reguli de accesibilitate după jurisdicție și marcă, amestecă personalizarea și plasările promo și apoi oferă răspunsuri rapide prin API cu SLO previzibil.
1) Obiective și principii
Citește rapid: p95 ≤ 100-150 ms per director/cerere de căutare.
Adevăr și prospețime: relevanța garantată a atributelor cheie (disponibilitate, jackpot-uri, statutul furnizorului).
Flexibilitate: colecții editoriale și sloturi promoționale fără lansări.
Conformitate: reguli de geo/vârstă/conținut, licențe, restricții de joc responsabil.
Multi-chiriaș/regiune: izolarea mărcii și respectarea rezidenței de date.
Observabilitate: Măsurători de calitate, A/B, Conversie joc/Pariu.
2) Model de domeniu (minim)
Entități:- Jocul este un joc/produs al furnizorului.
- Furnizor - RGS/studio.
- Variantă - variante de un joc (volatilitate, linii, limite, server).
- Colecție - selecție editorială/automată (ex. „Elemente noi”, „Jackpot-uri”).
- Plasare - poziție fixă/banner/țiglă pe pagină/în slot.
- Capacitate/caracteristică - atribute de joc (rotiri gratuite, funcție de cumpărare, jackpot).
- Regula jurisdicției - norme privind accesibilitatea/restricțiile.
- Semnale - semnale comportamentale/operaționale (popularitate, CTR, venituri).
- Active - media (icoane, postere, videoclipuri demo) cu opțiuni pentru dispozitive/densități.
Chei: 'game _ id' (intern stabil, nu egal cu provider_game_id),' tenant _ id', 'regiune', 'locale'.
3) Ingerarea și normalizarea
Transportor:1. Adaptoare sursă (pullere): integrări cu RGS/studiouri (directoare, caracteristici, RTP, etichete).
2. Sanitize & Map - Hărți câmpuri externe într-un singur dicționar (ACL), validați și deduplicați.
3. Îmbogățiți: localizări, categorii, etichete semantice, ratinguri limită de vârstă.
4. Moderat: steaguri de conținut (NSFW/simboluri religioase/subiecte sensibile) pe piață.
5. Publicați: 'GameUpserted/ProviderStatusChanged' evenimente → proiecție catalog.
Idempotence: toate mesajele cu 'source _ id' +' version _ ts'; repetarea este procesată fără efecte secundare.
Schema de evoluție: 'schema _ versiune' în adaptoare + migrații mapper.
4) Schema normalizată (simplificată)
json
{
"game_id": "g_3f92",
"tenant_id": "brand_eu",
"provider": { "id": "pr_evolution", "name": "Evolution" },
"title": { "en": "Lightning Roulette", "de": "Lightning Roulette" },
"capabilities": ["live","roulette","multiplier","bonus"],
"rtp": 97.3,
"volatility": "high",
"limits": { "min": 0.1, "max": 1000.0, "currency": "EUR" },
"jurisdiction": {
"allowed": ["MT","EE","DE"],
"blocked": ["NL","BE"],
"age_rating": 21
},
"assets": {
"tile": { "1x":"...", "2x":"..." },
"poster": { "web":"...", "mobile":"..." }
},
"tags": ["new","jackpot"],
"release_date": "2025-09-12",
"status": "active",
"variants": [{ "id":"v1","server":"eu-central-1","rtp":97.3 }]
}
5) Căutare, filtre, fațete
Indexuri: text complet după nume/sinonime, fațete după „furnizor”, „capabilități”, „volatilitate”, „rtp _ bucket”, „etichete”.
Filtre: jurisdicție/regiune/limbă/dispozitiv/vârstă, activ/certificat numai.
Sinonime: o hartă a termenilor utilizatorilor („cărți”, „fructe”, „bile”).
Greșeli de ortografie: căutare tolerantă (editați distanța ≤1 -2) cu restricție de lungime.
6) Clasament: semnale și formulă
Semnale (exemplu):- Prospețime (timp de la lansare).
- Populație (start/oră, jucători unici).
- Calitate (CTR de la catalog la joc, țineți 1/7 zi).
- Afaceri (marketing stimulează, oferte, sloturi promoționale).
- Conformitate (downgrade-uri moi pentru conținut sensibil, dacă este necesar).
- Player-fit (compatibilitate profil/preferință).
score = w1freshness + w2popularity + w3ctr + w4player_fit + w5boost
Greutățile sunt controlate prin configurare/experimente; toate semnalele normalizate la [0; 1].
7) Personalizare
Memorie scurtă: lansări și genuri recente, RYW - utilizatorul vede imediat o acțiune proaspătă.
Memorie lungă: încorporarea jocului și a profilului jucătorului (genuri de joc/volatilitate/sesiuni).
Securitate: Personalizarea nu încalcă niciodată regulile jurisdicționale/de vârstă.
Rezervă: dacă există puține semnale - clasament neutru + colecții editoriale.
8) Colecții și plasamente promoționale
Colecţii:- Auto: regulă/interogare (ex. 'capacities contine' jackpot 'SI release_date> = NOW () -30d').
- Editorial: listă manuală cu ordine și sincronizare.
- Plasări: poziții fixe pe pagini (erou, rând-1-slot-3), A/B, direcționare pe segment/jurisdicție.
- Date și priorități: 'starts _ at/ends _ at', coliziune prioritară, previzualizare înainte de publicare.
9) Politica de conformitate și accesibilitate
Geo/jurisdicție: liste albe/negre de țări/regiuni, verificarea licențelor/certificatelor.
Vârsta: vârsta minimă, avertismente, ascunderea pentru piețe incompatibile.
Subiect/simbolism: steaguri ale conținutului sensibil pe țări (religie, alcool etc.).
Joc responsabil: Ascunde/retrogradează pentru jucători limită/timeout.
Audit: jurnal imuabil de modificări în disponibilitatea cu motive.
10) Multi-chiriaș și multi-regiune
Toate datele sunt marcate "chiriaș _ id' și" regiune ".
Izolare: cvorumuri/bolți pe regiuni; proiecții transregionale - numai agregate.
Corectitudine: cote pentru ingerare/publicații per chiriaș, astfel încât marca „zgomotoasă” să nu întârzie restul.
11) Contur arhitectural
Write-core directory (CP): normalizare + evenimente outbox tranzacționale.
Proiecții/Modele de citire (EC): indici de căutare, colecții materializate, contoare de popularitate.
- Edge/CDN pentru pagini/imagini reci.
- Cache-uri de memorie pentru interogări fierbinți (cheie = filtre + pagină + chiriaș + regiune).
- Ficheflags: clasament de rulare/reguli de colectare fără eliberare.
12) API (REST/GraphQL, exemple)
ODIHNĂ
GET /v1/catalog?tenant=brand_eu®ion=EE&locale=ru
&filter=jackpot,true&sort=score_desc&page=1&size=24
→ 200 { items:[...], facets:{...}, as_of:"2025-10-31T12:10:02Z" }
GraphQL (fragment)
graphql query Catalog($tenant:String!,$region:String!,$q:String,$filters:Filters){
catalog(tenant:$tenant, region:$region, q:$q, filters:$filters){
items { gameId title provider { name } score badges assets { tile } }
facets { providers { key,count } capabilities { key,count } }
freshnessMs
}
}
Contracte:
- Intotdeauna intoarce 'as _ of/prospetimeMs', paging, fatete.
- Pentru personalizare - marker de sesiune (RYW) fără PII.
13) Semnale și fluxul de date
Popularitate: creșteri la lansarea jocurilor → găleți minut → unități în proiecție.
CTR/conversie: Faceți clic/ghișee de lansare pe plasamente/colecții.
Statusuri de operare: furnizori de sănătate (RGS), jackpot-uri/limite (flux de evenimente).
Marketing stimulează: factori de timp pentru jocuri/categorii/furnizori.
14) Observabilitate și SLO
Indicatori directoriali:- 'catalog _ p95 _ ms',' catalog _ p99 _ ms', 'error _ rate'.
- 'index _ freshness _ ms' (întârziere proiect),' inger _ lag _ ms'.
- 'ctr', 'click-to-launch', 'collection _ coverage' (% check out din colecții).
- 'lift _ ctr', 'lift _ conversion', 'explore vs exploit "доля.
- % norme geo/vârstă aplicate corect, număr de blocuri/oră.
Alerte: creșterea 'ingest _ lag _ ms', scăderea CTR pe colecțiile cheie, degradarea furnizorului (etichetele din număr).
15) Performanță și cache
Strategie: interogări la cald - cache pentru 30-120 s cu o cheie de filtre; blocuri personale - scurt TTL (10-30 s) sau nici o memorie cache.
Invaliditate: Prin 'GameUpserted/AvailabilityChanged/PlacementUpdated' evenimente.
Paginare: cursoare stabile, astfel încât să nu „sari” carduri atunci când actualizarea semnalelor.
16) Lucrul cu mass-media
Profile randare: dimensiuni/densitati pentru web/mobile/TV.
Optimizare: WebP/AVIF, lazy-load, sprite/atlas pentru gresie.
Securitatea conținutului: scanare, filigrane, interdicție inline-PII.
17) Testarea
Contract/Schema de încercări pentru adaptoare și API-uri.
Teste relevante: seturi de aur de interogări → rezultate așteptate/ordine.
Personalizare: ASC offline/NDCG + online A/B cu valori guardrail (timp în joc, depozite, semnale RG).
Haos: degradarea furnizorului, piroane de ingerare, întârzieri de indexare.
18) Cărți de joc (runbooks)
1. Index lag> SLO: opriți colecțiile secundare, creșteți prioritatea ingerării, simplificați temporar clasarea.
2. Furnizorul „roșu”: coborâți/ascundeți jocurile sale, ridicați colecții alternative.
3. Salt de eroare API: verificați memoria cache/backend, activați timpii de securitate, reduceți dimensiunea paginii.
4. Disponibilitate incorectă: întoarceți ultima regulă, includeți o „listă albă” de piețe critice, modificări de audit.
5. Clasament: rollout canar (5% → 25% → 50% → 100%), CTR/rollback de conversie.
19) Erori tipice
Amestecarea schemelor furnizorilor externi cu un model intern (fără ACL).
Absența 'as _ of/prospețime' → dispute cu privire la directorul „învechit”.
Personalizare care încalcă regulile jurisdicţionale.
Singura formulă de clasare „magică” fără descompunerea semnalelor și A/B.
Pagini mari fără cache și cursoare → p99 „trage”.
Dual-write la index și OLTP în loc de evenimente + proiecții.
20) Lista de verificare pre-vânzare
- Dicționar de câmp normalizat și ACL pentru toți furnizorii.
- Idempotent ingera, outbox/inbox, DLQ și redrive.
- Catalog proiecții și indici de căutare cu SLO prospețime.
- Clasamentul controlat de greutate, descompunerea semnalului și A/B.
- Regulile de conformitate (geo/vârstă/subiect) și auditul modificărilor.
- Multi-chiriaș/regiune: izolarea datelor, corectitudine, rezidență.
- API cu 'as _ of', fațete, cursoare; cache și handicap în funcție de eveniment.
- p95/p99 metrici, ingerare/indexare, CTR/conversie; alerte.
- Registrele de redare incidente; eliberări canare și ficheflags.
- Teste de relevanță, contracte, haos și personalizare.
Concluzie
Motorul de catalog este un „motor de căutare + sistem de reguli + vitrină” peste conținutul jocului. Date puternice ACL, normalizate, proiecții pentru citiri rapide, semnale transparente de clasificare, personalizare cu măsurători de gard și conformare strictă transformă catalogul într-o pârghie de creștere durabilă și măsurabilă a produsului - fără surprize în producție și fără compromisuri cu autoritățile de reglementare.