コンテンツカタログエンジン
カタログエンジンは、プロバイダ(RGS)からメタデータを収集および正規化し、検索/フィルタ/ランキングを提供し、管轄とブランドによるアクセシビリティルールを適用し、パーソナライゼーションとプロモーションの配置をミックスし、予測可能なSLOでAPIを介して迅速な応答を提供します。
1)目標と原則
高速読み取り:ディレクトリ/検索リクエストごとにp95 ≤ 100-150 ms。
真実と新鮮さ:重要な属性(可用性、ジャックポット、プロバイダのステータス)の関連性を保証します。
柔軟性:リリースなしのエディトリアルコレクションとプロモーションスロット。
コンプライアンス:地域/年齢/コンテンツルール、ライセンス、責任あるプレイ制限。
マルチテナント/リージョン:ブランドアイソレーションとデータ常駐コンプライアンス。
Observability: Outing Quality Metrics、 A/B、 Game Conversion/Bet。
2)ドメインモデル(最小)
エンティティ:- ゲームはプロバイダのゲーム/製品です。
- プロバイダ-RGS/studio。
- バリアント-1つのゲームのバリアント(ボラティリティ、ライン、制限、サーバー)。
- コレクション-編集/自動選択(例:「New Items'、」 Jackpots')。
- 配置-ページ上の固定位置/バナー/タイル/スロット内。
- 機能/機能-ゲームの属性(フリースピン、購入機能、ジャックポット)。
- 管轄規則-アクセシビリティ/制限規則。
- シグナル-行動/運用シグナル(人気、CTR、収益)。
- 資産-デバイス/密度のオプションを備えたメディア(アイコン、ポスター、デモビデオ)。
キー:'game_id' (stable internal、 provider_game_id)、 'tenant_id'、 'region'、 'locale'と等しくない。
3)摂取と正規化
コンベヤー:1.ソースアダプタ(プラー):RGS/スタジオ(ディレクトリ、機能、RTP、タグ)との統合。
2.Sanitize&Map-外部フィールドを単一の辞書(ACL)にマップし、検証し、重複除外します。
3.豊かな:ローカライズ、カテゴリ、セマンティックタグ、年齢制限評価。
4.中程度:市場別のコンテンツフラグ(NSFW/宗教シンボル/機密トピック)。
5.公開:「GameUpserted/ProviderStatusChanged」イベント→カタログ投影。
Idempotence: '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'。
フィルタ:管轄/地域/言語/デバイス/年齢、アクティブ/認定のみ。
同義語/ステミング:ユーザー用語(「books」、 「fruits'、」 balls')のマップ。
Typos:長さ制限付きの許容検索(距離≤ 1-2を編集)。
6)ランキング: 信号および方式
シグナル(例):- 新鮮さ(リリースからの時間)。
- 人口(開始/時間、ユニークなプレーヤー)。
- 品質(カタログからゲームまでCTR、 1/7日を保持)。
- ビジネス(マーケティングブースト、ディール、プロモーションスロット)。
- コンプライアンス(必要に応じて、機密コンテンツのソフトダウングレード)。
- プレーヤーフィット(プロファイル/好みの互換性)。
score = w1freshness + w2popularity + w3ctr + w4player_fit + w5boost
重量は構成/実験によって制御されます;[0;に正規化されたすべての信号;1].
7)パーソナライゼーション
短いメモリ:最近の発売とジャンル、RYW-ユーザーはすぐに新鮮なアクションを見ます。
長い記憶:ゲームおよびプレーヤーのプロフィールの埋め込み(ゲームのジャンル/ボラティリティ/セッション)。
セキュリティ:パーソナライゼーションは、管轄/年齢のルールに違反することはありません。
フォールバック:信号が少ない場合-ニュートラルランキング+編集コレクション。
8)コレクションとプロモーションの配置
コレクション:- Auto:ルール/クエリ(例:'capabilities'には'jackpot' AND release_date>=NOW()-30d')が含まれています。
- 編集:注文とタイミングの手動リスト。
- 配置:ページ上の固定位置(ヒーロー、行1スロット3)、 A/B、セグメント/管轄によるターゲティング。
- 日付と優先順位:'starts_at/ends_at'、衝突優先度、公開前のプレビュー。
9)コンプライアンスとアクセシビリティポリシー
地理/管轄:国/地域の白/黒のリスト、ライセンス/証明書の検証。
年齢評価:最低年齢、警告、互換性のない市場のための非表示。
主題/象徴:国(宗教、アルコールなど)による機密性の高いコンテンツの旗。
責任あるプレイ:制限/タイムアウトプレーヤーを非表示/降格します。
監査:理由のある可用性の変更の不変のログ。
10)複数のテナントおよび複数の地域
すべてのデータは'tenant_id'と'region'にマークされています。
分離:地域ごとのquorums/vaults;クロスリージョナルプロジェクション-集計のみ。
公平性:「騒々しい」ブランドが残りを遅らせないようにテナントごとのingest/publicationsのためのクォータ。
11)建築の概要
書き込みコアディレクトリ(CP):正規化+トランザクションアウトボックスイベント。
予測/読み取りモデル(EC):検索インデックス、実体化コレクション、人気カウンタ。
- コールドページ/画像のエッジ/CDN。
- ホットクエリのインメモリキャッシュ(key=filters+page+tenant+region)。
- Ficheflags:リリースなしのローリングランキング/コレクションのルール。
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/変換:配置/コレクションのカウンタをクリック/起動します。
稼働状況:ヘルスプロバイダー(RGS)、ジャックポット/リミット(イベントストリーム)。
マーケティングブースト:ゲーム/カテゴリ/サプライヤーの時間要因。
14)観察可能性およびSLO
ディレクトリメトリック:- 'catalog_p95_ms'、' catalog_p99_ms'、 'error_rate'。
- 'index_freshness_ms'(プロジェクト遅延)、'ingest_lag_ms'
- 'ctr'、 'click-to-launch'、 'collection_coverage'(%collectionsからチェックアウト)。
- 'lift_ctr'、 'lift_conversion'、 「explore vs exploit」
- %正しく適用されたgeo/ageルール、ブロック数/時間。
アラート:'ingest_lag_ms'の増加、主要なコレクションのCTRの低下、プロバイダの劣化(問題のタグ)。
15)パフォーマンスとキャッシュ
戦略:ホットクエリ-フィルターによってキーを持つ30-120秒のキャッシュ。パーソナルブロック-短いTTL (10-30秒)またはキャッシュなし。
Disability: 'GameUpserted/AvailabilityChanged/PlacementUpdated'イベント。
ページネーション:信号を更新するときにカードを「ジャンプ」しないように安定したカーソル。
16)メディアでの作業
プロファイルのレンダリング:Web/モバイル/TVのサイズ/密度。
最適化:WebP/AVIF、遅延負荷、タイル用のスプライト/アトラス。
コンテンツセキュリティ:スキャン、透かし、インラインPII禁止。
17)テスト
アダプターとAPIの契約/スキーマテスト。
関連テスト:クエリのゴールデンセット→予想される結果/順序。
パーソナライゼーション:オフラインAUC/NDCG+オンラインA/Bガードレールメトリック(ゲーム内の時間、預金、RG信号)。
カオス:プロバイダの劣化、スパイクの取り込み、インデックス作成の遅延。
18)プレイブック(ランブック)
1.インデックスラグ>SLO:セカンダリコレクションを停止し、インジェストの優先度を高め、一時的にランキングを簡素化します。
2.プロバイダー「赤」:自分のゲームを下げる/非表示、代替コレクションを上げます。
3.APIエラージャンプ:キャッシュ/バックエンドをチェックし、セキュリティタイムアウトを有効にし、ページサイズを縮小します。
4.誤った可用性:最後のルールをロールバックし、重要な市場の「ホワイトリスト」、監査の変更を含める。
5.ランキングリリース:カナリアロールアウト(5%→25%→50%→100%)、 CTR/コンバージョンロールバック。
19)典型的なエラー
外部プロバイダスキーマと内部モデル(ACLなし)をミックスします。
'as_of/freshness'→「outdated」ディレクトリに関する論争。
管轄規則に違反するパーソナライゼーション。
信号とA/Bの分解のない唯一の「魔法」ランキング式。
キャッシュとカーソルなしの大きなページ→p99「撮影」。
イベント+投影の代わりにインデックスとOLTPへの二重書き込み。
20)売り上げ前のチェックリスト
- すべてのプロバイダの正規化フィールド辞書とACL。
- Idempotent ingest、 outbox/inbox、 DLQ、 redrive。
- 新鮮さSLOのカタログ投影と検索インデックス。
- 重量管理されたランキング、信号の分解およびA/B。
- コンプライアンスルール(地理/年齢/トピック)と変更の監査。
- マルチテナント/リージョン:データ分離、公平性、居住。
- 'as_of'、ファセット、カーソルを持つAPI;イベントごとにキャッシュと障害。
- p95/p99メトリクス、ingest/indexing、 CTR/conversion;警告します。
- インシデントプレイブック;カナリアリリースとficheflags。
- 関連性、契約、混乱、パーソナライゼーションのテスト。
おわりに
カタログエンジンは、ゲームコンテンツ上の「検索エンジン+ルールシステム+ショーケース」です。強力なACL、正規化されたデータ、迅速な読み取りのための予測、透明なランキングシグナル、ガードレールメトリックによるパーソナライゼーション、および厳格なコンプライアンスにより、カタログは生産に驚くことなく、規制当局との妥協なしに、持続可能で測定可能な製品レバーに変わります。