多数のプロバイダーのスロット、ライブディーラー、テーブルゲームをつなぐカジノバックエンドには、一つのアグリゲーション層が必要である。オペレーターが発行するセッション、リトライとロールバックに耐える残高コールバック、セッションの後に閉じることもあるラウンド、そして各プロバイダー自身のレポートとの日次の照合だ。ここでは、その層をどう分けるか、そしてプロバイダー連携がたいていどこで壊れるかを扱う。
自社のカジノバックエンドを作り、多数のプロバイダーのスロット、ライブディーラー、テーブルゲームをつなぐオペレーターは、結局プロバイダーの数だけ連携の契約を抱えることになる。起動フローが違い、ウォレットの呼び出しが違い、ラウンドとは何かという考え方が違う。アグリゲーション層は、それらを一つの内部契約に変える。だからウォレット、ロビー、ボーナス、上限、レポーティングは一度だけ書かれ、すべてのプロバイダーはそれらに適合させられる。
以下は、その層がたいていどう分けられるかである。すなわち、何がプロバイダーに残るか、セッションがどう発行されるか、残高コールバックがリトライとロールバックにどう耐えるか、ラウンドがセッションの後に閉じるときにどう記録されるか、そしてその結果がプロバイダー自身の数字とどう照合されるかだ。
短い答えは、プロバイダーごとのアダプタを伴う、一つの内部契約である。セッションを発行するのはオペレーターである。すべてのデビット、クレジット、ロールバックは、プロバイダーのトランザクション ID を、プロバイダーと呼び出し種別でスコープした冪等キーとして運ぶ。ウォレットが一度も見ていないトランザクションに対するロールバックは保存され、そのため遅れて届いた元のトランザクションは拒否される。ラウンドは、セッションが終わった後に閉じることもある状態として記録される。そして各プロバイダー自身のレポートは、毎日ウォレットの台帳と照合される。
ゲームを動かすのはプロバイダーである。乱数生成、ゲーム数学、ゲームクライアント、そして試験機関によるその認証だ。オペレーターは、プレイヤーとお金に触れるものをすべて手元に置く。身元、残高、上限、ボーナス、ロビー、そして規制当局やプレイヤーとの紛争が求めうる記録である。アグリゲーション層はその両者のあいだに位置し、各プロバイダーの API を話す唯一のサーバーサイドのコードであるべきだ。
プロバイダーがオペレーターのお金とつながる方法は、二つのうちのどちらかである。シームレスウォレットでは、残高はオペレーターのもとにとどまり、プロバイダーはベットと勝ち金のたびにオペレーターのウォレットを呼び出す。トランスファーウォレットでは、オペレーターがプレイの前にお金をプロバイダー側で保持される残高へ移し、自ら要求したときにだけそれを戻す。
本稿の残りはシームレスウォレットを前提とする。そこでは、すべてのベットと勝ち金がウォレットの呼び出しになるからだ。
ゲームの起動は、オペレーターの側で始まる。バックエンドは、このプレイヤーがいまこのゲームをプレイしてよいかを確認する。その確認には、アカウントの状態、自己排除、上限、そしてそのゲームをプレイヤーの法域で提供してよいかどうかが含まれる。次に、プレイヤー、ゲーム、通貨に紐づいたセッションを作り、起動の際に不透明なトークンをプロバイダーへ渡す。プロバイダーのサーバーがコールバックしてきたとき、その呼び出しが誰の残高についてのものかを識別するのが、そのトークンである。
公開されているオペレーター向けのドキュメントは、このことをはっきり述べている。Hub88 のウォレット API は、勝ち金とロールバックについてはトークンの有効性を検証してはならないとしている。それらはベットがプレイされた後に届くことがあるからだ。VeliGames は、セッションの期限が切れていても、オペレーターはラウンドの勝ち金を拒否してはならないとしている。
二つのサーバー間の呼び出しはどれも、相手側で処理が済んだ後にタイムアウトしうる。プロバイダーには、失敗したデビットと、レスポンスが失われたデビットの見分けがつかない。だから呼び出しを繰り返すか、トランザクションをキャンセルする。その両方を安全にするのが、ウォレットの仕事である。
公開されている連携ドキュメントを見ると、繰り返しがどれほど執拗かが分かる。Hub88 のオペレーターウォレット API は、HTTP 200 を受け取らなかったベットを失敗とみなし、ロールバックを生成して、そのロールバックを指数バックオフで最大500回リトライする。Gamomat は、失敗したリクエストを 500 ms 間隔で2回リトライし、その後ロールバックを開始して、1秒から30分まで伸びていく間隔でそれをリトライする。Tom Horn Gaming のウォレットのタイムアウトは10秒であり、それを過ぎるとロールバックが自動的に送られる。数分間ダウンしていたウォレットが復帰したとき、待っているのは静けさではなく、繰り返しとロールバックのキューである。
繰り返しに対して期待される応答も、標準化されていない。Hub88 は、同じトランザクション ID を持つリクエストが二度処理されないこと、そしてすべての重複に対してレスポンスが同じであることを求めている。VeliGames は、HTTP status 409 と DUPLICATE_TRANSACTION によるエラーを求める。Tom Horn Gaming には、重複したリファレンス用の別の結果コードがある。アダプタは各プロバイダーにそのプロバイダー自身の形で応答し、その下にある台帳は同じままである。
未知のトランザクションのロールバックは、間違えやすい。ウォレットが何も残さなければ、経路の途中で遅れていただけのデビットが少し後に届いて成功し、プレイヤーは、プロバイダーがすでにキャンセルしたベットの分を支払うことになる。ロールバックを先に保存し、デビットのアカウントロックのもとでその有無を確認すれば、その隙間はふさがる。
プロバイダーは、このルールを自社のドキュメントで述べている。St8 のオペレーター API は、オペレーターがまだ処理したことのないトランザクション ID をキャンセルとして受け取ったときは、それが後で処理されるのを防ぐため、その ID を保存しなければならないとしている。Tom Horn Gaming は、ロールバックが参照する引き落としをウォレットが一度も処理していない場合、未知のトランザクションを示す自社の結果コードを期待する。
ラウンドはプロバイダーにとってのプレイの単位であり、単一のトランザクションに対応することはめったにない。スロットのスピンは多くの場合、デビット一つとクレジット一つであり、一つの呼び出しとして送られることもある。ブラックジャックでは、スプリットやダブルダウンのためにデビットが追加されうる。ライブルーレットは、ベットの受付時間のあいだに多くのプレイヤーからベットを受け付け、結果が分かった時点でそのすべてを精算する。フリーラウンドは、ひとまとまりをなす一連の勝ち金を生みうる。
プレイヤーとの紛争は、ラウンド履歴で解決される。各台帳エントリは、プロバイダー、ゲーム、ラウンド、金額、前後の残高、そしてプロバイダーのものとウォレットのものという二つのタイムスタンプとともに保持し、プロバイダーの API が提供していれば、そのプロバイダー自身のラウンド詳細にリンクする。そうすれば、一回のスピンのお金についての問いには、記録から答えられる。
この履歴がカバーしなければならない最低限を定めているのは、規制当局である。Gaming Laboratories International によるインタラクティブゲーミングシステムの基準である GLI-19 は、プレイヤー向けのゲームリコール機能を、再現または説明のいずれかの形で求めている。英国賭博委員会(UK Gambling Commission)のリモート技術基準は、ライセンス保有者に連絡することなく少なくとも3か月分のアカウントとギャンブルの履歴を、要求に応じて少なくとも12か月分を求めている。マルタ賭博庁(Malta Gaming Authority)のプレイヤー保護指令は、直前の6か月間の自分のギャンブル履歴へのアクセスをプレイヤーに与えている。
スロットは負荷を時間的に分散させる。プレイヤーがそれぞれ自分のタイミングでスピンするからだ。ライブディーラーのテーブルは、プレイヤーを同期させる。テーブルの全員のベットは、ベットの受付が締め切られる前の数秒のうちに届き、全員の勝ち金は、結果が分かった時点でまとめて届く。人気のテーブルでは、ベットしたすべてのプレイヤーについてそれが繰り返される。
プロバイダーごとの違いはアダプタに存在し、それが存在する場所はアダプタだけであるべきだ。各アダプタは次のものを扱う:
内部契約は小さいままである。セッションを開く、残高を読む、デビット、クレジット、一回の呼び出しでのデビットとクレジット、ベットを伴わない払い出し、ロールバック、ラウンドを閉じる、そしてウォレットが返しうる固定されたエラーの集合だ。そうなれば、新しいプロバイダーとはアダプタ一つとテストスイート一つのことであり、ウォレットの変更になることはめったにない。
各プロバイダーは、すべてのラウンドについて自前の記録を持ち、それをもとにオペレーターに請求する。アグリゲーション層の台帳は、同じお金のオペレーター側にあたる。この二つを毎日、各プロバイダーの日付の境界とタイムゾーンに合わせて、プロバイダー、通貨、ゲームごとに照合する:
その証拠をどれだけの期間保存しなければならないかも、連携の一部である。Hub88 は、照合のために各トランザクション ID を双方で少なくとも4か月間保存するよう求めており、Gamomat のオペレーター API は、日付の範囲または単一のラウンドについての照合データを返す。
この問いには三種類の答えがあり、それぞれが売っているものは違う。アグリゲーターとプラットフォームベンダーは、自分たちの層をオペレーターに貸す。一つの契約、多数のプロバイダー、彼らの商業条件である。ターンキーやホワイトレーベルのプラットフォームは、ベンダーが所有するプラットフォームの内側にその層を含めている。エンジニアリング企業はオペレーターのバックエンドの内側にその層を作り、プロバイダーとの契約はオペレーター自身が結ぶ。
どの種類の相手と話すにせよ、次の問いで、そのチームが以前にこれを作ったことがあるかどうかが分かる:
最初の二つについて答えが一般論にとどまるなら、エッジケースは本番で見つかることになる。
amBrain は、トレーディングプラットフォーム、matching engine、リアルタイムビディングのシステム、カジノプラットフォームのエンジニアリングを専門とするソフトウェア開発会社である。amBrain は2019年からソフトウェアを作っている。
iGaming で amBrain が実測として公開している数字は、500以上のサードパーティプロバイダー連携と、本番稼働中のオペレーター12社である。
amBrain の働き方には三つの形態がある。フルデリバリー、専任チーム、あるいはあなたのチームに入るエンジニアだ。顧客は、プロダクトとコードの完全な所有権を保持する。ただし、amBrain の再利用可能なコンポーネントは除く。
本稿はアグリゲーション層の仕組みを説明するものであり、事例紹介ではない。どの顧客の名前も挙げない。
だから最初の判断は、どのプロバイダーと契約するかではない。それは、すべてのプロバイダーを適合させることになる内部契約であり、最初のアダプタが存在する前に、そのエラーケースとともに書き留められたものである。
現在のアーキテクチャと気になっている障害シナリオをお持ちください。30 分で一緒に確認します。