Silnik katalogu treści
Silnik katalogowy jest rdzeniem prezentacji gier i kolekcji promocyjnych z przodu: zbiera i normalizuje metadane od dostawców (RGS), zapewnia wyszukiwanie/filtry/ranking, stosuje zasady dostępności według jurysdykcji i marki, miesza personalizację i stacje promocyjne, a następnie dostarcza szybkie odpowiedzi za pośrednictwem API z przewidywalną SLO.
1) Cele i zasady
Szybki odczyt: p95 ≤ 100-150 ms na żądanie katalogu/wyszukiwania.
Prawda i świeżość: gwarantowane znaczenie kluczowych atrybutów (dostępność, jackpoty, statusy dostawców).
Elastyczność: kolekcje redakcyjne i automaty promocyjne bez wydań.
Zgodność: geo/age/content rules, licencje, odpowiedzialne ograniczenia gry.
Multi-najemca/region: izolacja marki i zgodność z rezydencją danych.
Obserwability: Outing Quality Metrics, A/B, Game Conversion/Bet.
2) Model domeny (minimum)
Podmioty:- Gra jest grą/produktem dostawcy.
- Dostawca - RGS/studio.
- Wariant - warianty jednej gry (zmienność, linie, limity, serwer).
- Kolekcja - wybór edytorski/automatyczny (np. „Nowe przedmioty”, „Jackpoty”).
- Umieszczenie - stałe położenie/baner/płytka na stronie/w gnieździe.
- Możliwość/Funkcja - atrybuty gry (darmowe spiny, funkcja kupna, jackpot).
- Zasada - zasady dostępności/ograniczenia.
- Sygnały - sygnały behawioralne/operacyjne (popularność, CTR, przychody).
- Asset - media (ikony, plakaty, demo video) z opcjami dla urządzeń/gęstości.
Klucze: 'game _ id' (stabilne wewnętrzne, nie równe provider_game_id),' lokator _ id', 'region', 'locale'.
3) Połknięcie i normalizacja
Przenośnik:1. Adaptery źródłowe (pullery): integracje z RGS/studios (katalogi, funkcje, RTP, tagi).
2. Sanitize & Map - Map pola zewnętrzne do jednego słownika (ACL), zwaliduj i deduplicate.
3. Wzbogacony: lokalizacje, kategorie, znaczniki semantyczne, oceny graniczne wieku.
4. Umiarkowany: flagi treści (NSFW/symbole religijne/tematy wrażliwe) według rynku.
5. Opublikuj: 'GameUpserted/ "wydarzenia → projekcja katalogu.
Idempotencja: wszystkie wiadomości z 'source _ id' +' version _ ts'; powtórzenie jest przetwarzane bez skutków ubocznych.
Schemat ewolucji: 'schema _ version' w adapterach + migracje maperów.
4) Znormalizowany system (uproszczony)
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) Wyszukiwanie, filtry, fasony
Indeksy: pełny tekst według nazwy/synonimów, facets by 'provider', 'capabilities', 'volatility', 'rtp _ bucket', 'tags'.
Filtry: jurysdykcja/region/język/urządzenie/wiek, tylko aktywne/certyfikowane.
Synonimy/stemming: mapa terminów użytkownika („książki”, „owoce”, „kule”).
Typos: wyszukiwanie tolerancyjne (edycja odległości ≤ 1 -2) z ograniczeniem długości.
6) Ranking: sygnały i formuła
Sygnały (przykład):- Świeżość (czas od wydania).
- Populacja (początki/godzinę, unikalnych graczy).
- Jakość (CTR od katalogu do gry, trzymaj 1/7 dnia).
- Biznes (promocje, promocje, automaty promocyjne).
- Zgodność (miękkie obniżki dla treści wrażliwych, jeśli jest to wymagane).
- Dopasowanie gracza (kompatybilność profilu/preferencji).
score = w1freshness + w2popularity + w3ctr + w4player_fit + w5boost
Wagi są kontrolowane przez konfigurację/eksperymenty; wszystkie sygnały znormalizowane do [0; 1].
7) Personalizacja
Krótka pamięć: ostatnie starty i gatunki, RYW - użytkownik natychmiast widzi świeże działanie.
Długa pamięć: osadzanie profilu gier i graczy (gatunki gier/zmienność/sesje).
Bezpieczeństwo: Personalizacja nigdy nie narusza zasad jurysdykcyjnych/wiekowych.
Fallback: jeśli jest mało sygnałów - ranking neutralny + kolekcje redakcyjne.
8) Kolekcje i staż promocyjny
Zbiory:- Auto: reguła/zapytanie (np. 'możliwości zawiera' jackpot 'AND release_date> = NOW () -30d').
- Redakcja: lista ręczna z zamówieniem i terminem.
- Rozmieszczenie: stałe pozycje na stronach (bohater, wiersz-1-slot-3), A/B, ukierunkowane według segmentu/jurysdykcji.
- Daty i priorytety: 'starts _ at/ends _ at', priorytet kolizji, podgląd przed publikacją.
9) Polityka w zakresie zgodności i dostępności
Geo/jurysdykcja: białe/czarne listy krajów/regionów, weryfikacja licencji/certyfikatów.
Ocena wieku: minimalny wiek, ostrzeżenia, ukrywanie się na rynkach niezgodnych ze wspólnym rynkiem.
Temat/symbolizm: flagi treści wrażliwych według krajów (religia, alkohol itp.).
Odpowiedzialna gra: Ukryj/demote dla graczy limitu/timeout.
Audyt: niezmienny dziennik zmian w dostępności z przyczyn.
10) Wielopoziomowy i wielobranżowy
Wszystkie dane są oznaczone jako 'lokator _ id' i' region '.
Izolacja: kworum/sklepienie według regionu; projekcje międzyregionalne - tylko kruszywa.
Sprawiedliwość: kwoty na połknięcie/publikacje na najemcę, aby „hałaśliwa” marka nie opóźniała reszty.
11) Zarys architektoniczny
Katalog write-core (CP): normalizacja + transactional outbox events.
Projections/Read Models (EC): indeksy wyszukiwania, zmaterializowane zbiory, liczniki popularności.
- Krawędź/CDN dla zimnych stron/obrazów.
- Pamięć podręczna dla zapytań na gorąco (klucz = filtry + strona + lokator + region).
- Ficheflags: ranking toczenia/zasady zbierania bez zwolnienia.
12) API (REST/GraphQL, przykłady)
ODPOCZYNEK
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
}
}
Umowy:
- Zawsze wracaj 'as _ of/freshMs', page, facets.
- Do personalizacji - marker sesji (RYW) bez PII.
13) Sygnały i przepływ danych
Popularność: przyrosty podczas uruchamiania gier → minutowe wiadra → jednostki w projekcji.
CTR/konwersja: Kliknij/uruchom liczniki na lokalizacje/kolekcje.
Statusy operacyjne: podmioty świadczące usługi zdrowotne (RGS), jackpoty/limity (strumień zdarzeń).
Bodźce marketingowe: czynniki czasowe dla gier/kategorii/dostawców.
14) Obserwowalność i SLO
Metryka katalogu:- 'catalog _ p95 _ ms', 'catalog _ p99 _ ms', 'error _ rate'.
- „index _ freshness _ ms” (opóźnienie projektu), „ingest _ lag _ ms”.
- 'ctr', 'click-to-launch', 'collection _ coverage' (% check out from collections).
- 'lift _ ctr', 'lift _ conversion', 'explore vs exploit' дола.
- % prawidłowo stosowane zasady geo/wiekowe, liczba bloków/godzinę.
Wpisy: wzrost 'ingest _ lag _ ms', spadek CTR na zbiorach kluczowych, degradacja dostawcy (tagi w wydaniu).
15) Wydajność i buforowanie
Strategia: gorące zapytania - pamięć podręczna dla 30-120 s z kluczem przez filtry; bloki osobowe - krótki TTL (10-30 s) lub brak pamięci podręcznej.
Niepełnosprawność: Przez 'GameUpsested/KeyChanged/PlacementUpdated' wydarzenia.
Paginacja: stabilne kursory, aby nie „skakać” kartami podczas aktualizacji sygnałów.
16) Praca z mediami
Profile renderowania: rozmiary/gęstości dla sieci web/mobile/TV.
Optymalizacja: WebP/AVIF, leniwe obciążenie, sprite/atlas dla płytek.
Bezpieczeństwo treści: skanowanie, znaki wodne, zakaz inline-PII.
17) Badanie
Testy kontraktowe/schematyczne dla adapterów i API.
Testy przydatności: złote zestawy zapytań → oczekiwane wyniki/zamówienie.
Personalizacja: offline AUC/NDCG + online A/B z metrykami bariery (czas gry, depozyty, sygnały RG).
Chaos: degradacja dostawcy, kolce połykania, opóźnienia indeksowania.
18) Playbooks (książki startowe)
1. Index lag> SLO: zatrzymać kolekcje wtórne, zwiększyć priorytet spożycia, tymczasowo uprościć ranking.
2. Dostawca „czerwony”: niżej/ukryć swoje gry, podnieść kolekcje alternatywne.
3. Skok błędu API: sprawdź pamięć podręczną/backend, włącz czasy zabezpieczeń, zmniejszyć rozmiar strony.
4. Nieprawidłowa dostępność: wycofać ostatnią regułę, włączyć „białą listę” rynków krytycznych, zmiany audytu.
5. Wydanie rankingu: canary rollout (5% → 25% → 50% → 100%), CTR/conversion rollback.
19) Typowe błędy
Mieszanie schematów zewnętrznych dostawców z modelem wewnętrznym (bez ACL).
Brak 'as _ of/freshness' → spory o „przestarzały” katalog.
Personalizacja, która narusza przepisy jurysdykcyjne.
Jedyna „magiczna” formuła rankingu bez rozkładu sygnałów i A/B.
Duże strony bez buforowania i kursorów → p99 „strzelać”.
Dual-write do indeksu i OLTP zamiast zdarzeń + projekcje.
20) Lista kontrolna przedsprzedaży
- Znormalizowany słownik pola i ACL dla wszystkich dostawców.
- Idempotent ingest, outbox/inbox, DLQ i redrive.
- Prognozy katalogowe i indeksy wyszukiwania ze świeżością SLO.
- Ranking kontrolowany wagą, rozkład sygnału i A/B.
- Zasady zgodności (geo/wiek/temat) i audyt zmian.
- Multi-najemca/region: izolacja danych, uczciwość, miejsce zamieszkania.
- API z 'as _ of', fasady, kursory; pamięci podręcznej i niepełnosprawności według zdarzeń.
- p95/p99 metryki, połknięcie/indeksowanie, CTR/konwersja; wpisy.
- Playbooks incydentów; kanarki i ficheflagi.
- Testy znaczenia, kontrakty, chaos i personalizacja.
Wniosek
Silnik katalogowy to „wyszukiwarka + system reguł + prezentacja” nad treścią gry. Silny ACL, znormalizowane dane, projekcje do szybkich odczytów, przejrzyste sygnały rankingowe, personalizacja z metrykami bariery i ścisła zgodność przekształca katalog w zrównoważoną i wymierną dźwignię wzrostu produktu - bez niespodzianek w produkcji i bez kompromisów z regulatorami.