Мазмұн каталогының қозғалтқышы
Каталог қозғалтқышы - бұл ойын витриналары мен промо-іріктеулердің өзегі: ол провайдерлерден (RGS) метадеректерді жинайды және қалыпқа келтіреді, іздеуді/сүзгілерді/ранжирлеуді қамтамасыз етеді, юрисдикциялар мен брендтер бойынша қолжетімділік ережелерін қолданады, дербестендіруді және промо-плейсменттерді араластырады, содан кейін API арқылы жылдам жауаптар береді болжамды SLO.
1) Мақсаттар мен қағидаттар
Жылдам оқу: каталог/іздеу сұрауына p95 ≤ 100-150 мс.
Шындық пен жаңалық: негізгі атрибуттардың кепілдік берілген өзектілігі (қолжетімділік, джекпоттар, провайдерлік мәртебелер).
Икемділік: редакторлық коллекциялар мен жарнамалық слоттар.
Сәйкестік: гео/жас/контент ережелері, лицензиялар, жауапты ойын шектеулері.
Мульти-тенант/өңір: брендтерді оқшаулау және data residency.
Бақылануы: беру сапасының метрикасы, A/B, ойынға/мөлшерлемеге конверсия.
2) Домендік модель (минимум)
Мәні:- Game - провайдердің ойыны/өнімі.
- Provider - RGS/студия.
- Variant - бір ойынның нұсқалары (құбылмалылық, желілер, лимиттер, сервер).
- Collection - редакторлық/автоматты іріктеу (мысалы, «Новинки», «Джекпоты»).
- Placement - бетке/слотқа бекітілген позиция/баннер/тайл.
- Capability/Feature - ойын атрибуттары (free spins, buy feature, джекпот).
- JurisdictionRule - қол жетімділік/шектеулер ережелері.
- Сигналдар - мінез-құлық/операциялық сигналдар (танымалдылық, CTR, revenue).
- Asset - құрылғыларға/тығыздықтарға арналған нұсқалары бар медиа (иконкалар, постерлер, демо-видео).
Кілттер: 'game _ id' (ішкі тұрақты, тең емес provider_game_id), 'tenant _ id', 'region', 'locale'.
3) Ingest және қалыпқа келтіру
Конвейер:1. Source Adapters (пуллерлер): RGS/студиялармен интеграциялау (каталогтар, фичтер, RTP, тегтер).
2. Sanitize & Map: сыртқы өрістердің бірыңғай сөздікке (ACL) маппингі, валидация және дедупликация.
3. Enrich: оқшаулау, санаттар, семантикалық тегтер, жас шектеулерінің рейтингтері.
4. Moderate: нарықтар бойынша контент-жалаулар (NSFW/діни символдар/сезімтал тақырыптар).
5. Publish: 'GameUpserted/ProviderStatusChanged' → оқиғалары.
Сәйкестік: барлық хабарлар 'source _ id' + 'version _ ts'; қайталау жанама әсерсіз өңделеді.
Эволюция схемасы: 'schema _ version' адаптерлерінде + мапперлер көші-қоны.
4) Қалыпқа келтірілген схема (оңайлатылған)
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) Іздеу, сүзгілер, фасеттер
Индекстер: атауы/синонимдері бойынша толық мәтін, 'provider', 'capabilities', 'volatility', 'rtp _ bucket', 'tags' бойынша фасеттер.
Сүзгілер: юрисдикция/өңір/тіл/құрылғы/жас, тек белсенді/сертификатталған.
Синонимдер/стемминг: пайдаланушы терминдерінің картасы («кітапшалар», «жемістер», «шарлар»).
Қателер: ұзындығы шектелген tolerant search (edit distance ≤ 1-2).
6) Ранжирлеу: сигналдар мен формула
Сигналдар (мысал):- Freshness (шығарылым уақыты).
- Popularity (іске қосу/сағат, бірегей ойыншылар).
- Quality (CTR каталогтан ойынға, ұстап тұру 1/7 күн).
- Business (маркетингтік бустар, мәмілелер, промо-слоттар).
- Compliance (қажет болса, сезімтал мазмұн үшін жұмсақ төмендетулер).
- Player-fit (профайлдың/артықшылықтардың үйлесімділігі).
score = w1freshness + w2popularity + w3ctr + w4player_fit + w5boost
Салмақтар конфигурациямен/эксперименттермен басқарылады; барлық сигналдар қалыпқа келтірілген [0; 1].
7) Дербестендіру
Қысқа жады: соңғы іске қосулар мен жанрлар, RYW - пайдаланушы бірден жаңа әрекеттерді көреді.
Ұзақ есте сақтау: ойын эмбеддингі және ойыншы бейіні (ойын жанрлары/құбылмалылық/сессиялар).
Қауіпсіздік: дербестендіру юрисдикциялық/жас ережелерін ешқашан бұзбайды.
Fallback: сигналдар аз болса - бейтарап сұрыптау + редакторлық коллекциялар.
8) Коллекциялар және промо-плейсменттер
Жиындар:- Авто: ереже/сұрау (мысалы, 'capabilities contains' jackpot 'AND release_date> = NOW () -30d').
- Редакторлық: ретімен және мерзімімен қол тізімі.
- Плейсменттер: беттердегі бекітілген позициялар (hero, row-1-slot-3), A/B, сегменттер/юрисдикциялар бойынша таргетинг.
- Мерзімдері мен басымдықтары: 'starts _ at/ends _ at', коллизиялардың басымдығы, жариялау алдындағы басымдығы.
9) Комплаенс және қолжетімділік саясаты
Гео/юрисдикция: елдердің/өңірлердің ақ/қара тізімдері, лицензияларды/сертификаттарды тексеру.
Жас рейтингі: ең төменгі жас, ескертулер, үйлеспейтін нарықтар үшін жасыру.
Тақырыбы/рәміздері: елдер бойынша сезімтал контенттің жалаулары (дін, алкоголь және т.б.).
Жауапты ойын: лимиттері/тайм-ауты бар ойыншылар үшін жасыру/төмендету.
Аудит: себептермен қол жетімділіктің өзгеруінің өзгермейтін журналы.
10) Мульти-тенант және мульти-өңір
Барлық деректер 'tenant _ id' және 'region' деп белгіленген.
Оқшаулау: өңірлер бойынша кворумдар/қоймалар; кросс-өңірлік проекциялар - тек агрегаттар.
Fairness: «шулы» бренд басқаларды кідіртпеуі үшін ingest/per tenant жарияланымдарының квоталары.
11) Сәулет сұлбасы
Write каталогының өзегі (CP): қалыпты + транзакциялық оқиғалар outbox.
Проекциялар/Read Models (EC): іздеу индекстері, материалданған коллекциялар, танымал есептеуіштер.
- «Суық» беттер/суреттер үшін Edge/CDN.
- In-memory кэштері (key = сүзгілер + бет + tenant + region).
- Фичефлагтар: ретке келтіру ережелерін/коллекцияларды релизсіз прокаттау.
12) API (REST/GraphQL, мысалдар)
REST
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 (үзік)
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
}
}
Келісімшарттар:
- Әрқашан 'as _ of/freshnessMs', пэйджинг, фасеттерді қайтарыңыз.
- Дербестендіру үшін - PII-сыз сессияның маркерлері (RYW).
13) Сигналдар және деректер ағыны
Танымалдылық: ойындарды бастаудағы инкременттер → минуттық бакеттер → проекциядағы агрегаттар.
CTR/конверсия: плейсмент/коллекциялардағы басу/жегу есептегіштері.
Операциялық мәртебелері: провайдерлердің health (RGS), джекпоттар/лимиттер (оқиғалар ағымы).
Маркетинг-бустар: ойындарға/санаттарға/жеткізушілерге арналған уақытша коэффициенттер.
14) Бақылау және SLO
Каталог өлшемдері:- `catalog_p95_ms`, `catalog_p99_ms`, `error_rate`.
- 'index _ freshness _ ms' (жобалық кідіріс), 'ingest _ lag _ ms'.
- 'ctr', 'click-to-launch', 'collection _ coverage' (коллекциядан шығару%).
- `lift_ctr`, `lift_conversion`, «explore vs exploit» доля.
- % дұрыс қолданылған гео/жас ережелері, блоктар саны/сағ.
Алерттар: 'ingest _ lag _ ms' өсуі, негізгі коллекцияларда CTR құлдырауы, провайдердің құлдырауы (беру белгілері).
15) Өнімділік және кэштеу
Стратегия: ыстық сұраулар - сүзгі кілті бар 30-120 кэш; дербес блоктар - қысқа TTL (10-30 с) немесе кэшсіз.
Мүгедектігі: оқиғалар бойынша 'GameUpserted/AvailabilityChanged/PlacementUpdated'.
Пагинация: сигналдарды жаңарту кезінде карточкалар «секіріп» кетпеуі үшін тұрақты курсорлар.
16) Медиамен жұмыс істеу
Рендер-профильдер: web/mobile/TV үшін өлшемдер/тығыздықтар.
Оңтайландыру: WebP/AVIF, lazy-load, плиткалар үшін sprite/atlas.
Мазмұн қауіпсіздігі: сканерлеу, су белгілері, inline-PII тыйым салу.
17) Тестілеу
Адаптер және API үшін Contract/Schema tests.
Relevancy tests: алтын сұраулар жиынтығы → күтілетін нәтижелер/тәртібі.
Дербестендіру: offline AUC/NDCG + online A/B guardrail-метриктерімен (ойындағы уақыт, депозиттер, RG-сигналдар).
Chaos: провайдерлердің құлдырауы, ingest жарылыстары, индекстеудің кідіруі.
18) Плейбуктар (runbooks)
1. Индекс артықшылығы> SLO: екінші топтамаларды тоқтату, ingest басымдығын арттыру, саралауды уақытша жеңілдету.
2. Провайдер «қызыл»: оның ойындарын төмендету/жасыру, баламалы коллекцияларды көтеру.
3. API қатесі: кэшті/бэкендті тексеру, қорғаныс таймауттарын қосу, беттердің өлшемін кішірейту.
4. Қате қолжетімділік: соңғы ережені алып тастау, сындарлы нарықтардың «ақ тізімін» қосу, өзгерістер аудитін жүргізу.
5. Ранжирлеу релизі: канареялық rollout (5% → 25% → 50% → 100%), CTR/конверсия бойынша кері қайту.
19) Типтік қателер
Сигналдарды ыдыраусыз және A/B ранжирлеудің жалғыз «сиқырлы» формуласы
Провайдерлердің сыртқы схемаларын ішкі модельмен араластыру (ACL болмауы).
Жоқ 'as _ of/freshness' → «ескірген» каталог туралы даулар.
Юрисдикциялық ережелерді бұзатын дербестендіру.
Кэшсіз және меңзерсіз үлкен беттер → p99 «атылады».
Оқиғалар + проекциялардың орнына индекске және OLTP-ке Dual-write.
20) Азық-түлік алдындағы чек-парағы
- Барлық провайдерлер үшін өрістер мен ACL қалыпқа келтірілген сөздігі.
- Idempotent ingest, outbox/inbox, DLQ және редрайв.
- Жаңалық SLO каталогының проекциялары мен іздеу индекстері.
- Басқарылатын таразылармен ранжирлеу, сигналдардың ыдырауы және A/B
- Комплаенс-ережелер (гео/жасы/тақырыбы) және өзгерістер аудиті.
- Мультитенант/өңір: деректерді оқшаулау, fairness, residency.
- API 'as _ of', фасеттер, курсорлар; кэш және оқиғалар бойынша мүгедектік.
- p95/p99, ingest/индекстеу, CTR/конверсия; алерта.
- Инциденттердің ойнатқыштары; канареялық релиздер мен фичефлагтар.
- Релеванттылық, келісімшарттар, хаос және дербестендіру тестілері.
Қорытынды
Каталог қозғалтқышы - бұл ойын контентінің үстіндегі «іздеу жүйесі + ереже жүйесі + витрина». Күшті ACL, қалыпқа келтірілген деректер, жылдам оқуға арналған проекциялар, ранжирлеудің мөлдір сигналдары, guardrail-метриктермен дербестендіру және қатаң комплаенс каталогты тұрақты және өлшенетін азық-түлік өсу тетігіне айналдырады - өнімде тосын саты жоқ және реттеуіштермен ымыраға келмейді.