通貨ディレクトリごと
通貨ごとのカタログは、表示される価格、制限、ボーナス、最小ベット、ジャックポット、プロモーションテキストがプレーヤー/テナント/地域通貨に合わせて調整されるコンテンツカタログと価格のバリアントです。目標は、ロジックをコピーせず、オンザフライ変換によるリスクなしに、適切な価格ポイントとルールを提供することです。
主な効果:- UX:自然なレートステップと「美しい」価格(₺9。99、 R $5、€0。20).
- 所得:コースのために「食べる」余白なしで正確な制限とブースト。
- コンプライアンス:ローカルルール(ライセンス、税金、年齢/地域)の遵守。
1)データモデル: 別々の「公称」と「表示」
基本価格(公称):決済のための単一の現地通貨'PLN'/'EUR'/'USD'。
表示価格-額面+FX+丸め+スプレッド/手数料から計算。
ポリシー:ルールの丸め、ベッティングステップ、最小/最大制限、ジャックポット、ボーナス金額と賭け-通貨ごとに設定されます。
yaml price_model:
base_currency: "EUR"
items:
game_spin_min:
base: 0. 10 policy: "stake_min"
game_spin_step:
base: 0. 10 policy: "stake_step"
jackpot_seed:
base: 10000 policy: "jackpot_amount"
policies:
stake_min:
per_currency:
EUR: {round: "ceil_to_step", step: 0. 10}
TRY: {round: "ceil_to_step", step: 1. 00}
BRL: {round: "ceil_to_step", step: 0. 50}
stake_step:
per_currency:
EUR: {step: 0. 10}
USD: {step: 0. 10}
CLP: {step: 50}
jackpot_amount:
per_currency:
EUR: {round: "nearest_100"}
MXN: {round: "nearest_1000"}
2)コースのソース(FX)と「新鮮さ」
FXサービスは変換のための真実の単一のポイントです:- コースプロバイダー:メインとリザーブ;リフレッシュレート(例えば、揮発性のための毎分、安定のための15分毎)。
- SLA 「Δ t以下のコース」(例えば、p95 ≤ 5分)。
- スプレッドと手数料:テナント/地域/通貨ごとに設定。
- 凍結ウィンドウ:価格が「ジャンプ」しないように、試合/トーナメント/プロモーションウィンドウの「凍結」コース。
- 監査:'valid_from/valid_to'でFXバージョンをログ化してチェックを再生します。
json
{
"as_of":"2025-10-31T12:00:00Z",
"base":"EUR",
"rates": { "TRY":34. 10, "BRL":5. 42, "MXN":19. 1, "UAH":43. 6, "USDT":1. 00 },
"spread_bps": { "TRY":120, "BRL":60 },
"fees_pct": { "default":0. 15 }
}
3)丸めと「美しい」価格ポイント
FX後のラウンドとスプレッド:- 価格/パッケージ:'99'、'9。99`, `4.90'(心理的なポイント)。
- レートとステップ:通貨ステップに「ceil_to_step」 (₺1、 CLP $50)。
- ボーナス:バウチャーステップ(R $1/ ₺5)に切り下げます。
- 操作順序:'raw=base fx (1+spread) (1+fee)'→'rounded=round_policy (raw)'→'min/max clamp'。
反例例レートの「銀行丸め」は「醜い」ステップを与えることができます-明示的なポリシーを使用します。
4)限界、分/最高および大当たり
通貨あたりの最小/最大-ローカルの法律とRGS制約を考慮してください。
ジャックポット:プロバイダが通貨でジャックポットを保持している場合(例:EUR)、ローカライズされた同等の(情報提供者)または通貨単位のプールを表示します。
通貨ステップ:コペックなしのCLP/JPY-すべての制限は整数です。
sql
CREATE TABLE currency_limits (
tenant_id text,
currency text,
feature text, -- spin_min, spin_max, deposit_min, payout_max, jackpot_min value numeric,
step numeric,
PRIMARY KEY (tenant_id, currency, feature)
);
5)通貨ごとのボーナスとバウチャー
ボーナス値:通貨ごとに設定されています(額の「再計算」ではありません)。
賭け:乗数(x30)または通貨量として保存します。混ぜることを避けて下さい。
ウィンキャップ/キャッシュアウト:また、通貨ごとに。
マーケティングテキスト:ハードコードなしのテンプレートでの番号のローカライズと通貨。
yaml bonus:
welcome_pack:
EUR: {amount: 100, wager_x: 35, cap: 500}
BRL: {amount: 500, wager_x: 40, cap: 2500}
TRY: {amount: 2500, wager_x: 40, cap: 12500}
6)提供者の制限(RGS/PSP)
RGS: 一部のゲームは'暗号'/ローカル通貨では利用できません。一部のプロバイダは固定最小値を要求します(例えば、€0。20).
PSP:支払方法は通貨(PIX ↔ BRL、 PayID ↔ AUD、 Papara ↔ TRY)に依存します。入金/出金制限も異なります。
ルール:カタログ/店頭では、表示前に通貨と管轄によってゲームや支払い方法をフィルタリングします。
7)建築の概要
通貨ポリシーストア(CP)-通貨ごとのルールテーブル(ステップ、制限、価格ポイント、丸め)。
FXサービス:コース、バージョン、SLAフレッシュのキャッシュ。
カタログビルダー:通貨ごとの読み取りモデル(予測)を生成します。
Reading Layer API:終了する投影を押し出します。UIホットトラックにオンザフライ変換はありません。
Outbox→Projections: FX/ポリシーの変更→'CurrencyPolicyUpdated/FXUpdated'イベント→増分ウィンドウの更新。
read_catalog_{tenant}_{region}_{currency}
通貨パーティショニングはリフレッシュとメトリックコレクションを高速化します。
8)通貨ごとの予測(例)
sql
CREATE TABLE read_catalog_currency (
tenant_id text,
region text,
currency text,
game_id text,
price_min numeric, -- displayed min-rate price_step numeric,
jackpot numeric,
bonus_badge text,
as_of timestamptz,
PRIMARY KEY (tenant_id, region, currency, game_id)
);
更新-ディレクトリイベント+FXイベント/ポリシーからのidempotent 'UPSERTS'。
9)フォーマットとロケール
シンボル/コード:'₺/TRY'、 'R $/BRL'、'€'、'USDT'(暗号の場合-コペックなし、またはUXポリシーに従って2文字)。
グループ化と小数区切り:'locale' (ru_RU、 tr_TR、 pt_BR)に依存します。
RTL/アラビア語のロケール:通貨記号の正確性を個別にチェックします。
10)キャッシュとパフォーマンス
30-120秒の通貨あたりのキャッシュカタログの応答。レスポンスにFXインジケータ'as_of'を与えます。
無効:'FXUpdated'/'PolicyUpdated'/'GameUpserted'イベント→ターゲットキャッシュキーフラッシュ。
カードの順序が小さな価格の更新で「ジャンプ」しないようにカーソルでページネーションします。
11)観察可能性およびSLO
メトリクス:- 'catalog_p95_ms' валютам、' fx_freshness_ms' (p50/p95/p99)、 'policy_refresh_latency_ms'。
- 「醜い」価格のシェア(ステップに横たわらない)、制限による拒否された取引のシェア。
- (実際のデビットが発生した場合)チェックアウト時の「ショーケースと計算」の不一致。
- SLAより古いFX、丸めエラーの増加、PSPのサージは失敗を制限します。
- RGS最小と表示の最小ミスマッチ。
12)コンプライアンス、税金、居住
国ごとの通貨≠: 'currency+geo+license'の組み合わせに従ってください。
税金ルール/手数料-通貨ポリシーと小切手で。
居住:現地通貨のデータと計算-対応する地域で。
13)テスト
プロパティベース:不変量「変換と丸めた後、価格はステップにあります」;「min ≤ value ≤ max」。
ゴールデンケース:回帰のための参照通貨/価格のセット。
Chaos FX:「ジャンプ」コース、フリーズウィンドウ、FXプロバイダの切り替え。
E2E:ショーケースの金額と書かれた総額の適合性。許容≤ 0。01通貨単位(または1ステップ)。
14)典型的なエラー
即座にread API→unstable UXとhigh p99に再計算します。
通貨の移動(CLP/JPY)を無視する→半分のペニーとRGS/PSPの失敗。
ポリシーごとに明確なルールではなく、習慣から切り離して(銀行を丸める)。
紛争を整理するためにチェックでFXバージョンを修正しないことは→不可能です。
FXを介した単一のボーナス宗派→ローカル市場のための「奇妙な」数字。
透明性のないFXで手数料を隠すことは、請求と罰金のリスクです。
15)クイックレシピ
TRY/BRLのベット:ステップ₺1/R $0。50、最小レートのステップまでラウンド、パッケージのための「美しい」価格ポイント。
暗号(USDT/USDC)ステップ$0。10、最寄りのステップに丸め、ショーの手数料はありません(しかし、チェックで表示されます)。
高ボラティリティFX:マッチ/プロモーションのために凍結します。基準価格の>X%にアラートが表示されます。
マルチテナント:ブランドの異なるスプレッド/ステップ。テナントごとの投影計算の公平性。
16)構成例(真実の単一のソース)
yaml catalog_currency:
base_currency: EUR fx_sla_ms: 300000 # 5 minutes rules:
- currency: "TRY"
stake_step: 1. 00 stake_min: 5. 00 display_round: "ceil_to_step"
psychological_points: [9, 19, 29, 49, 99]
psp_methods: ["Mefete","Papara","Crypto"]
- currency: "BRL"
stake_step: 0. 50 stake_min: 1. 00 display_round: "ceil_to_step"
psychological_points: [4. 90, 9. 90, 19. 90, 49. 90]
psp_methods: ["PIX","Boleto","Cards"]
- currency: "CLP"
stake_step: 50 stake_min: 200 display_round: "ceil_to_step"
psp_methods: ["WebPay","Cards"]
jackpot:
display_policy:
EUR: "nearest_100"
MXN: "nearest_1000"
bonuses:
welcome:
EUR: {amount: 100, wager_x: 35}
BRL: {amount: 500, wager_x: 40}
TRY: {amount: 2500, wager_x: 40}
17)売り上げ前のチェックリスト
- 各チェック/イベントにおけるシングルベース通貨とFXバージョン。
- ラウンド/ステップ/リミットポリシーは、通貨ごとに設定され、テストでカバーされます。
- 通貨ごとのディレクトリ予測は準備ができています。熱い方法は変換しません。
- ジャックポットとボーナスは、通貨ごとに正しく表示/滴下されます。
- PSPメソッドは通貨によってフィルタリングされます。限界はショーケースと一致します。
- FX フレッシュネスSLAとアラートが設定されています。不安定なでき事のための窓を凍結して下さい。
- 通貨番号と記号のローカライズ;非ハードコードプロモーションテンプレート。
- 監査ポリシーの変更/FX;再現性を確認してください。
- マルチテナント/リージョン:データ分離、異なるスプレッドと制限。
- インシデントプレイブック:FXジャンプ、RGS最小ミスマッチ、PSP制限障害。
結論
通貨カタログごとに「コースごとに掛ける」ではなく、エンジニアリングの分野です。"分派と表現を分離し、FXと丸めポリシーを集中化し、通貨ごとに予測を実現し、鮮度を測定します。その後、ショーケースは速く、予測可能で正直であり、ビジネスは地元市場の隠されたマージン損失と規制上の驚きから保護されます。