トランザクション処理システム
複数の分散ノードを備えるシステムにおけるトランザクション処理の方法である。この方法は、第1のノードにおいてメッセージを受け取るステップを備える。このメッセージは、あるエンティティに関連するデータについて実行されるべき操作を規定している。さらに、この方法は、前記ノード上で動くメッセージ・ハンドラによる処理のために前記メッセージをキューイングするステップを備える。さらにこの方法は、他のメッセージ・ハンドラが前記データについて操作をしていない場合に、前記メッセージ・ハンドラに、前記メッセージの処理を許可するステップと、前記メッセージを、その後の処理のために第2のノードに送るステップとを備える。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、トランザクション処理(transaction processing)に関しており、特に、しかし制限的ではなく、賭け取引を処理するための方法及び装置に関連するものである。
【背景技術】
【0002】
トランザクション処理システムは様々な環境中で使用されており、それは、株式取引システム、旅行予約システム、及び、オンライン賭け取引所(online betting exchanges)のような賭けシステムを含む。高速なトランザクション処理システムへの要求が高まるにつれて、従来のシステムは、要求される処理速度を提供しようと努力することになる。
【発明の概要】
【0003】
本発明によれば、分散された複数のノードを備えるシステムにおけるトランザクション処理の方法が提供される。ここでは、データは、複数のデータ・パーティションの中に保持される。それぞれのパーティション中のデータは、それぞれの単一のノードに関連付けられる。このシステムは、データ・パーティションのグループを制御するための複数のコントローラを含む。それぞれのコントローラは、データ・パーティション中のデータについての処理を実行するための、複数の書き込み段階(write stage)と、実行のスレッド(threads of execution)を書き込み段階に割り当てるためのスレッド・マネージャとを備える。ここで、スレッド・マネージャは、所定のデータ・パーティション中におけるデータ操作のために、最大でも、単一のスレッドを割り当てるように構成されている。この方法は、複数のコントローラ中の第1のものにおけるメッセージを受け取るステップを含む。このメッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定する。さらに、この方法では、複数の書き込み処理の一つによる処理のためにメッセージをキューイング(queuing)し、そして、書き込み段階に、メッセージの処理を許可するが、これは、処理のスレッドが所定のデータ・パーティションのために利用可能な場合においてである。
【0004】
本発明によれば、複数の分散されたノードを備えるシステムにおけるトランザクション処理のための装置がさらに提供される。ここでは、データは、複数のデータ・パーティション内に保持される。それぞれのパーティション内のデータは、ノードのうちのそれぞれ一つに関連付けられる。このシステムは、データ・パーティションのグループを制御するための複数のコントローラを備える。それぞれのコントローラは、データ・パーティション中のデータについての処理を実行するための、複数の書き込み段階と、処理のスレッドを書き込み段階に割り当てるためのスレッド・マネージャとを備える。ここでは、スレッド・マネージャは、所定のデータ・パーティション中におけるデータについての操作のために、最大で単一のスレッドを割り当てるように構成されている。この装置は、複数のコントローラのうちの第1のものにおいてメッセージを受け取るためのレシーバを備える。メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作と複数の書き込み段階とを、メッセージを処理するために規定する。ここでは、所定のデータ・パーティションのために処理のスレッドが利用可能な場合は、書き込みステージは、一つ又はそれ以上のメッセージを処理するように構成されており、そして、処理のスレッドが利用可能でない場合には、この装置は、メッセージをキュー(queue)に配置するように構成されている。
【0005】
本発明の他の態様によると、複数の分散されたノードを備えるシステムにおけるトランザクション処理の方法が提供される。この方法は、第1のノードにおけるメッセージを受け取るステップを備える。メッセージは、エンティティに関連するデータについて実行されるべき操作を規定する。さらに、この方法は、ノード上で動いているメッセージ・ハンドラによって処理するためにメッセージをキューイングすること、他のメッセージ・ハンドラがそのデータについて操作を行っていない場合は、メッセージ・ハンドラがメッセージを処理することを許可すること、そして、その後の処理のために、メッセージを第2のノードに送ることを含む。
【0006】
メッセージ・ハンドラは、読み取りのみ要求(read only requests)を扱う複数の第1メッセージ・ハンドラと、読み取り−書き込み要求(read-write requests)を扱う複数の第2メッセージ・ハンドラとを備える。ここで、複数の読み取りのみ要求は、並列的に動作できる(runnable in parallel)ようになっている。
【0007】
複数の読み取りのみ要求は、エンティティに関連するデータについての操作のために実行可能としうるが、これは、読み取り−書き込み要求が前記データについて操作していない場合においてのみである。ただ一つの読み取り−書き込み要求が、ある所定の時間において、あるエンティティに関連するデータについて実行可能となることができる。
【0008】
この方法は、受け取ったメッセージを、受け取ったときにジャーナリング(journaling)することを含む。
【0009】
この方法は、受領した他の複数のメッセージと共に、メッセージをバッチング(batching)することを備えることができる。バッチングは、それが実行される処理ステージに依存しうる。バッチングは、ネットワーク待ち時間(network latency)、ディスク待ち時間(disk latency)、及び処理されるべきエンティティのうちの少なくとも一つに従って実行されうる。
【0010】
メッセージ・ハンドラは、複数のエンティティと関連することができる。そして、この方法は、メッセージが向けられたメッセージ・ハンドラに従って、メッセージをグループ化(grouping)することを、さらに含むことができる。
【0011】
メッセージ・ハンドラに関連付けられた複数のエンティティに関するデータは、いずれかの単一のノードにおいて格納されうる。単一のエンティティに関するデータは、いずれかの単一のノードにおいて格納されうる。
【0012】
エンティティは、ユーザに関連付けられたアカウントを備えることができ、あるいは、複数のユーザが賭けを行うマーケットを備えることができる。
【0013】
メッセージは、非同期で送信されうる。
【0014】
ノードは、サーバを含むことができる。
【0015】
本発明によれば、分散された複数のノードを備えるシステムでのトランザクション処理のための装置がさらに提供される。この装置は、第1のノードにおいてメッセージを受け取る手段を備える。メッセージは、エンティティに関するデータについて実行されるべき操作を規定している。さらに、この装置は、ノード上で動くメッセージ・ハンドラによる処理のためにメッセージをキューイングするための手段、他のメッセージ・ハンドラがメッセージを処理していない場合に、メッセージ・ハンドラがそのメッセージを処理することを許可するための手段、及び、その後の処理のために、第2のノードに向けてメッセージを送るための手段を備える。
【0016】
本装置は、単一のアカウントあるいは単一のマーケットについて動作するメッセージ・ハンドラに単一のスレッドを割り当てるために、スレッド・マネージャをさらに含むことができる。また、本装置は、複数のメッセージ・ハンドラに影響するメッセージを処理するためにプリプロセッサ(pre-processor)をさらに含むことができる。プリプロセッサは、多数のジャーナル・メッセージ・ストリームから、単一のメッセージ・ストリームを生成するように構成されうる。
【0017】
本装置は、メッセージが受け取られていないことの通知に対応して、第1のノードから第2のノードにメッセージを再送付(resending)する手段を、さらに含むことができる。
【0018】
本装置は、大量に要求されたデータを提供するために、データ・ディストリビュータのクラスタをさらに含むことができる。
【図面の簡単な説明】
【0019】
本発明の実施形態は、例示を用いて、以下において、添付の図面を参照しながら説明される。
【図1】一般的なトランザクション処理環境についての概略図である。
【図2】賭け交換システムとしてのトランザクション処理システムを図示する概略図である。
【図3】図2で示されたサーバのコンポーネントを図示する概略図である。
【図4】本発明によるトランザクション処理システム内での、アカウント及びマーケットに関するデータの区分け(partitioning)を示す図である。
【図5】トランザクション処理機能を提供するソフトウエア・モジュールの構成を図示する概略図である。
【図6a】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間における、メッセージについての通常の交換を示す図である。
【図6b】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間におけるメッセージ交換の間でのメッセージ損失を示す図である。
【図6c】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間におけるメッセージ交換の間での、メッセージの重複排除(de-duplication)を示す図である。
【図7】本発明によるトランザクション処理システムを通過するトランザクションの第1の流れを示す図である。
【図8】図2に示すサーバ上で動作して、図7に示すトランザクションの流れを許可するトランザクション処理モジュールについてのインスタンス(instances)を示す概略図である。
【図9】本発明によるトランザクション処理システムを通過するトランザクションの第2の流れと、第1及び第2の賭けを共にマッチングすることに関わるマッチング・プロセスとを示す図である。
【図10】本発明によるトランザクション処理システムを通過するトランザクションの第2の流れと、第1及び第2の賭けを共にマッチングすることに関わるマッチング・プロセスとを示す図である。
【図11】図2に示すサーバ上で動作し、図9及び10に示すトランザクションの流れを許可するトランザクション処理モジュールについてのインスタンスを示す概略図である。
【発明を実施するための形態】
【0020】
図1は、一般的なトランザクション処理環境1を表している。トランザクション処理システム2は、より大きな機能システム3の一部となっており、この機能システムは、他のシステム、アプリケーション、あるいはユーザと、クライアント・インタフェース4を介して通信する。クライアント・インタフェース・モジュール4は、異なるソースからトランザクション情報を受け取るために、そして、関連するトランザクション情報をトランザクション処理システム2に送り、若しくはそこから受け取るために、複数のサブシステム4a、4b、4cを持つことができる。トランザクション処理システム2は、特定の機能システム3の要求に従って、トランザクションを処理する。例えば、機能システムは、株式交換システム(stock exchange system)であり、ここでは、トランザクション処理システムは、付け値(bids)と申し込み(offers)との釣り合い(match)を取る。あるいは、機能システムは、銀行システム(banking system)であり、ここでは、トランザクション処理システムは、預金(credits)と負債(debits)を処理する。
【0021】
図2は、賭け交換システム(betting exchange system)3の環境でのトランザクション処理システム2を表している。この賭け交換システムは、例えば米国特許出願GB2356071Aに記載されているように、対向する賭け(opposing bets)の釣り合いを取るように構成されている。
【0022】
賭け交換システム3は、クライアント・インタフェース・モジュール4と、例えばファイアウオール5を通してリンクされたトランザクション処理システム2とを含む。クライアント・インタフェース・モジュール4は、ここにおいてクライアント・インタフェース・サーバと呼ばれる複数のサーバ400を備える。これらは、クライアントとの、到来する(incoming)又は出ていく(outgoing)通信を扱う。クライアントは、様々なシステムとのインタフェースを行うサーバ・アプリケーションでありうる。そして、この様々なシステムは、例えば、賭け交換をとりまとめ、そして、賭けトランザクション要求をトランザクション処理システムに供給するものである。クライアント・インタフェース・サーバ400は、ユーザから出された賭け及び/又は関連する賭け情報要求メッセージを受け取るように、そして、対応する要求メッセージをトランザクション処理システム2に導入するように構成されている。クライアント・インタフェース・サーバ400は、例えば、彼らの賭け可能なアカウントバランス(available-to-bet account balance)を見るために、ユーザからの要求メッセージを受け取り、あるいは、彼らの現在有効な全ての賭けを見るために、ユーザからの要求メッセージを受け取ることも可能である。クライアント・インタフェース・サーバ400は、トランザクション処理システム2からメッセージを受け取り、そして、対応するメッセージをユーザに返すようにも構成される。このクライアント・インタフェース・サーバは、サーバ400a・・・nとしてここで個別に言及もされている。
【0023】
トランザクション処理システム2は、複数のサーバ200にわたって、高度に分散されている。これらのサーバは、ここでは、トランザクション処理サーバとして言及されており、そして、それは、クライアント・インタフェース・サーバ400からのメッセージを受け取るようになっている。トランザクション処理システム2を複数のサーバ200にわたって配置することは、もし必要なときは、さらなるサーバの追加によって、容易にそして効率的なコストでシステムを拡大できることを意味する。
【0024】
図3を参照すると、それぞれのトランザクション処理サーバ200及びそれぞれのクライアント・インタフェース・サーバは、少なくとも一つのプロセッサ201/401と、例えばRAMであるメモリ202/402と、例えばハードディスクのような不揮発性メモリ203/403と、ネットワークインタフェースを含むI/Oシステム204/404とを備える。当業者には理解されることとして、各サーバは、その機能を発揮するために必要な全てのコンポーネントを備えている。トランザクション処理サーバは、ここでは、個別に、サーバ200a・・・nとして参照される。トランザクション・サーバ200a〜c、200d〜fのグループは、それぞれの共有ディスク(shared disks)6と関連付けられている。
【0025】
トランザクション処理システム2内のメッセージは、例えば、トランザクション処理システム2における特定の出来事を列挙する(detailing)イベントや特定の操作を実行するためのコマンドを含むことができる。例えば、コマンド・メッセージは、ユーザの賭け可能なアカウントバランス(available-to-bet account balance)を見るための要求でありうるし、イベント・メッセージは、ユーザに対して、彼らの賭けの提出が成功したことを報告するメッセージでありうる。
【0026】
高いトランザクション速度を達成するために、分散されたシステムにおける各サーバ200は、ある程度のデータ局所性(data locality)を有しており、リモートのシステムあるいはディスクへのネットワーク呼(network calls)に関連するオーバヘッドを防いでいる。これは、ユーザ・アカウントによる、そして賭けマーケット(betting market)による、トランザクション処理システム2の区分け(partitioning)により達成される。単一のユーザ・アカウントに関連する全ての情報は、単一のサーバに格納され、単一の賭けマーケットに関する全ての情報は、単一のサーバに格納される。このことは、ネットワーク中におけるハードディスクなどの不揮発ストレージやリモートのサーバへのネットワーク呼を個別のサーバが作る必要性を減少させる。このようにして、トランザクション処理システムにおける待ち時間(latencies)が減少し、そして、トランザクションのスループットは向上する。可能であれば、データは、ローカルのメモリあるいは、少なくとも、少ない待ち時間のメモリに格納され、このようにして、例えばネットワーク化されたハードディスクのように待ち時間が多いリソースにアクセスする必要を減らす。
【0027】
図4は、賭けトランザクションを処理するためのトランザクション処理システム2で使われるアカウント10の組とマーケット11の組とを表している。賭けは、ユーザに向けて表示された値付けスクリーン(pricing screens)を通して許可される。賭けの提起を望むユーザには、ユーザ・アカウント10が割り当てられる。このユーザ・アカウントには、彼らは、例えばインターネットに基づく安全な現金支払いシステムを介して、お金を提供(deposit)することができる。トランザクション処理システム2は、それぞれのユーザアカウント10に、それ自体に固有のIDを割り当てる。
【0028】
ユーザは、表示された掛け率(odds)に対して彼らが賭けを提起する複数の賭けマーケット(betting markets)11へのアクセスを持つ。賭けマーケット11は、例えば、フットボールの試合や競馬などのスポーツ・イベントの結果を含むことができる。前記したユーザ・アカウント10により、トランザクション処理システム2は、それぞれの賭け市場11に、それに固有のIDを割り当てる。
【0029】
ユーザ・アカウント10のグループ12は、それぞれのアカウント・コントローラ・アプリケーション13により制御される。ある特定グループのユーザ・アカウント12のためのアカウント・コントローラ13は、ユーザ・アカウントに関連する情報をメモリ202内のグループに格納するサーバ200上で動作する。単一のアカウントに関する、及び、あるアカウント・コントローラに関するアカウントのグループに関する全ての情報は、単一のサーバに格納され、あるいはこれにより所有される。それぞれのアカウント・コントローラ13は、割り当てられたユーザ・アカウント10ついての要求を提供することについて、及び、全てのアカウントの中枢的な機能(all account centric functions)について、責任を持つ。
【0030】
例えば、もしユーザが、彼らのアカウント10についての操作の実行、例えば、賭けを提起すること、彼らの賭け可能なバランスをロードすること、彼らの現在の賭けの概要を見ること、あるいは、彼らの現在の損失見込み(current exposure)すなわち最も悪い事件シナリオにおいて、彼らの賭けからどの程度損失を被るかの計算を望む場合、その操作は、割り当てられたアカウント・コントローラ13によって提供される。この操作は、ユーザのアカウント10が配置される単一のサーバ200にアクセスすることによって提供される。例えば、図2を参照して、アカウント・コントローラについての別々のインスタンスは、サーバ200a〜cのぞれぞれの上で動作し、それぞれのサーバ上で保存されたアカウントを処理する。
【0031】
同様に、賭けマーケット11は、多数のマーケット・コントローラ・アプリケーション14によって制御される。ここで、それぞれのマーケット・コントローラ14は、賭けマーケット11のグループ15について責任を持つ。特定の賭けマーケット11のためのマーケット・コントローラ14は、前記したとおり、メモリ202中の前記賭けマーケット11に関する情報を格納するサーバ200上で動作する。単一のマーケットに関する、そして、マーケット・コントローラに関連するマーケットのグループに関する全ての情報は、単一のサーバ上に保存され、あるいは、所有される。マーケット・コントローラ14は、全てのマーケットの中枢的な機能(all market centric functions)を提供することに責任を持つ。これらの機能は、以下で説明されるような賭けのマッチングを含みうる。例えば、図2を再び参照して、マーケット・コントローラについての別々のインスタンスは、サーバ200d〜fのそれぞれの上で動作し、それぞれのサーバで記録されたマーケット情報を処理する。
【0032】
各サーバ400、200の上で同時に動作するスレッドの数は、最小に保たれる。このことは、高いトランザクション・レートの維持に役立つ。なぜなら、各サーバ400、200のプロセッサ401、201は、多数のスレッドの間で処理時間(processing time)を共有することを必要としないからである。トランザクション処理システム2により使用されるスレッド数(thread count)は、主に非同期メッセージの形態(predominately asynchronous messaging style)を用いることによって、低く保たれる。したがって、メッセージがトランザクション処理システム2に持ち込まれるたびに、処理のためのスレッドを割り当てるのではなく、受領されたメッセージは、到来キューに保持され、そして、処理される前に、スレッドが他の操作の後に利用可能になることを待たなければならない。本発明におけるスレッド管理の態様は、以下においてさらに詳しく記述される。
【0033】
本発明によるトランザクション処理システム2は、次のようなアーキテクチャを用いる。すなわち、ここでは、このシステムは、メッセージのキューにより接続された処理ステージについてのパイプラインに分割される。一般的に、あるステージは、到来イベント(inbound events)のためのソース・キューと、イベントを処理するためのイベント・ハンドラと、ステージのコンポーネントを監視し、そして、ヒューリステックス(heuristics)の処理を、ステージをホスト(host)するスレッド・マネージャに提供するためのリソース・コントローラの組と、送出キューあるいはシンク(outbound queues or sinks)の組とを備える。この、ステージに基づくアーキテクチャは、図5〜10に関連して、以下においてさらに記述される。
【0034】
リソース・コントローラは、バッチング・リソース・コントローラ・モジュール(batching resource controller modules)を含む。このモジュールの機能は、待ち時間及びスループット・ターゲットを、あるものと他のものと引き替えることにより、満たすことである。待ち時間は、それぞれのステージの相互作用の間に処理されるメッセージのバッチ・サイズを低くすることにより、スループットに悪影響を与えるけれども、改善されうる。スループットは、メッセージのバッチ・サイズを大きくすることにより、改善されうる。バッチング・リソース・コントローラは、各ステージの相互作用に要する時間(待ち時間)と、毎秒に処理されるメッセージの数(スループット)とを監視し、そして、これに従って、到来メッセージ・キューのバッチ・サイズを調整する。
【0035】
バッチング・リソース・コントローラは、到来バッチ・サイズを制御するために、本システム中の全てのステージに適用される。
【0036】
バッチング・リソース・コントローラによって提供されるバッチング(batching)に加えて、メッセージは、操作されるデータに従ってバッチングされる。各ステージは、メッセージが一緒になるようにグループ化することによって、内部的にバッチングされる。例えば、後に詳述されるブッカ・ステージ(Booker stage)は、そのメッセージが関連するアカウントに従って、メッセージをバッチングする。同じアカウント上であるいは同じマーケットで動く多数のメッセージを処理することは、各メッセージを個別に処理することに比べて、速くなりうる。
【0037】
GB2356071Aに記載されているように、賭けの提出を望むユーザは、特定の結果が「バックする(back)」か、あるいは「レイする(lay)」、すなわち、結果が起きない方に賭けるかを選ぶことができる。特定の結果をバックする、及びレイすることへの賭けは、その後に、お互いにおけるマッチングが図られる。対向する賭けをこのようにマッチングすることにより、トランザクション処理システム2は、従来のブックメーカに対してではなく、ユーザがお互いに対して賭けることを可能にしている。このことは、賭ける人にとって、より柔軟なアプローチであり、これは、彼又は彼女が、賭けの対象にしたい的確な用語(例えば、掛け率、最大の金額)をセットできるからである。一旦提起されると、ユーザの賭けは、まだマッチしていない賭けのプールに配置される。このプールは、関連するマーケット・コントローラ14が配置されるサーバ200のメモリ201内に保存されうる。トランザクション処理システム2は、プールを探し、対向する組み合わせ(opposing match)を見つける。もし、マッチが得られなければ、すなわち、他のユーザが、ユーザによって提案された条件に対してマッチされうる賭けを提起していない場合は、その賭けは、アンマッチのプールに残される。トランザクション処理システム2における賭けマッチング(bet-matching)の手順は、以下においてさらに詳しく説明される。
【0038】
あるユーザが、賭けマーケット11についての特定の結果を「バックする」あるいは「レイする」ことを決定したときは、ユーザの賭けを記述するクライアント・インタフェース・サーバ400においてメッセージが受領される。このクライアント・インタフェース・サーバ400は、PlaceBetRequestメッセージとして参照されるメッセージを生成し、かつトランザクション処理システム2に送り込む。このメッセージは、ユーザが他の賭け者に提示したい条件の記述を与える。前記のPlaceBetRequestメッセージは、その賭けが提示されるマーケット、その賭けが特定の結果を「バックする」あるいは「レイする」ためのものかどうか、ユーザが賭けたい金額、及びユーザが賭けたい掛け率を特定する。トランザクション処理システム2は、PlaceBetRequestメッセージを処理するように、そして、好ましくは、それを、他のユーザにより提起された対向するPlaceBetRequestメッセージとマッチさせるように構成される。例えば特定の結果をバックすることを望む第1ユーザのPlaceBetRequestメッセージは、同じ結果がレイすることを望む第2ユーザのPlaceBetRequestメッセージとマッチされうる。
【0039】
このプロセスは、図5〜10に関連して、第1及び第2のユーザにより出された二つの対向するPlaceBetRequestメッセージの、トランザクション処理システム2を通過する流れを図示することにより、以下においてさらに詳しく説明される。
【0040】
このプロセスは、ディレクタ31、アカウント・コントローラ41、61及びマーケット・コントローラ51としてここで参照されるいくつかのソフトウエア・モジュールに関連して記述される。アカウント・コントローラ41、61及びマーケット・コントローラ51は、図4に示されるアカウント・コントローラ・モジュール13及びマーケット・コントローラ・モジュール14の特定のインスタンスである。
【0041】
図5は、アカウント及びマーケット・コントローラの両者のために適用される一般的な構成を表しており、これらは、基本的なトランザクション処理アプリケーションである。これらのアプリケーションは、異なるロジックを含み、そして、異なる責任をもつけれども、それらは、共通のアプローチを共有し、トランザクションを処理する。
【0042】
この構成は、レシーバ・スレッド・マネージャ・モジュール(レシーバ・スレッド・マネージャ)112の制御の下で動作するレシーバ・モジュール(レシーバ)110と、スケジュールド・スレッド・マネージャ117の制御の下で動作するアクノリッジャ・モジュール(アクノリッジャ)115と、ジャーナラ・モジュール(ジャーナラ)120と、単一のスレッド・マネージャ・モジュール(単一スレッド・マネージャ)122の制御の下で動作するプリプロセッサ・モジュール(プリプロセッサ)125と、データ・パーティション130と、パーティション・スレッド・マネージャ・モジュール(パーティション・スレッド・マネージャ)145の下で動作し、かつ、区分けされた読み取り段階140及び区分けされた書き込み段階150を備える区分けされたメッセージ・ハンドラ140、150と、スケジュールド・スレッド・マネージャ・モジュール(スケジュールド・スレッド・マネージャ)162の下で動作するリセンダ・モジュール(リセンダ)160と、単一スレッド・マネージャ122の下でやはり動作するディスパッチャ・モジュール(ディスパッチャ)170とを備えている。
【0043】
レシーバ110は、ネットワークからのメッセージを読み、そしてそれらをデシリアライズ(deserialize)するように構成されている。レシーバ・スレッド・マネージャ112は、到来するネットワーク・イベントを待ち、そして、既定のバッチを構成するために十分なネットワーク・データが到着したときにレシーバ110を呼ぶ。レシーバ110は、メッセージの重複排除(de-duplicating)に責任を持つ。換言すると、これは、既に見たことがあるメッセージは廃棄するということである。重複排除の必要性は、後述するように、リセンダ160の機能から生じる。結果としてデシリアライズされたメッセージは、ジャーナラ120に送られる。シリアライズ(serialise)された形態のメッセージは、保持され、そして、ジャーナラ120に送られる。
【0044】
ジャーナラ120は、サーバのハードディスク403又は共有ディスク6に格納されたログにメッセージを書き込むことに責任を持つ。メッセージのロギング(logging)は、失敗の場合に、ログが再生され、そして、失敗時のメモリの状態を復活できることを意味する。メッセージは、それらが処理されるのと同じ順序で再生される必要があり、これにより、確定的なリカバリを保証できる。これを達成するために、各メッセージは、ジャーナラ120によって一連の番号を割り当てられ、これにより、ディスパッチャに到着するメッセージは、それらがジャーナラに到着した順序に従って、再び整列(reordered)されうる。
【0045】
プリプロセッサ125は、処理を区分する前に、グローバル・メッセージを単一のスレッド上で処理することによって、リカバリ・プロセスを支援する。このことは以下においてさらに説明される。もし、一つより多いジャーナラ120が使用されているならば、プリプロセッサ125は、複数のジャーナル・メッセージ・ストリームが合体して単一のシリアル・ストリームに戻る単一のポイントを提供する。プリプロセッサは、さらに、区分された全てのステージに影響する「システム・オンライン」や「システム・オフライン」のようなシリアル・メッセージを処理する。
【0046】
ジャーナラ120は、プリプロセッサ125及びディスパッチャ170と同様に、単一スレッド・マネージャ122の下で動作する。このスレッド・マネージャは、到来キューに到着するための、バッチを形成する既定数のメッセージを待ち、その後、適切なステージを実施させる。ステージは、連続的にのみ実施され、そして、このスレッド・マネージャは、ある一時点において動作するステージについての単一のインスタンスが存在する時のみに適用される。
【0047】
ジャーナラ120は、プリプロセッサ125を介して、区分けされた書き込み段階150にメッセージを送る。
【0048】
区分けされた書き込み段階は、トランザクションのステージを扱い、そして、データ・パーティション130内のデータについて動作する。アカウント・コントローラの場合は、データ・パーティションは、アカウント10を代表する。マーケット・コントローラの場合には、データ・パーティションは、マーケット11を代表する。区分された書き込み段階は、読み取り/書き込みアプリケーション・ビジネス・ロジックを含む。例えば、図6に示されるエクスポーザ(Exposer)44あるいはブッカ(Booker)45は、アカウント・コントローラ・モジュールのために区分された書き込みステージであり、図6に示されるマッチャ(Matcher)54は、マーケット・コントローラ・モジュールのための区分された書き込みステージである。
【0049】
アカウント・コントローラ・モジュールのための他の区分された書き込みステージは、アカウント・クリエータ、アカウント・エディタ及びアカウント・デリータと、さらには賭けデリータとを含む。例えば、アカウント・クリエータは、「アカウントを作る」メッセージを受け付けて、そして、新しいアカウントを、アカウント・データ・ストラクチャの中に格納する。マーケット・コントローラに関連して、他の区分された書き込みステージは、マーケット・クリエータ、マーケット・エディタ、及びマーケット・デリータを含む。例えば、マーケット・クリエータは、「マーケットを作る」メッセージを受け付けて、そして、新しいマーケットを、マーケット・データ・ストラクチャ中に格納する。
【0050】
パーティション・スレッド・マネージャ145は、区分された書き込みステージへのスレッドの割り当てを管理して、一つのアカウントあるいはマーケットあたりに割り当てられた最大のスレッドが一つであることを保証する。それは、並行性に確実性を付与することができる。つまり、このシステムは、スレッドとプロセッサにわたって規模を変化させることができる。一方で、失敗の場合における確実な応答(deterministic reply)とは、このシステムが、常に、失敗の前の状態に戻ることを意味する。
【0051】
例えば、あるメッセージが、データAについての読み取り/書き込み操作を実行するためのステージ150a、b、cのうちの一つに到着すると、そのステージは、実行のためのスレッドをスレッド・プールから取得し、そして、当該データAを、そのスレッドにおいて処理する。書き込みステージがデータAについて操作していても、他のステージは、同じデータAについて操作することが可能であり、それにより、変更が互いに区別され、そして、分散されたロック(distributed locks)は存在しない。データAについての操作を実行するために到来したメッセージは、データAについてのスレッド操作が解除されるまで、待ち行列に入れられる(queued)。区分された書き込みステージ150a、b、cは、しかしながら、実行についての並行スレッドを用いて、他のデータについて動作することができる。これにより、同じ、あるいは異なる書き込みステージは、データA及びCを、データAと並行に操作することができる。
【0052】
区分された読み取りステージ140は、レシーバ110からのメッセージを受け取るものであり、そして、リード・オンリー・アプリケーション・ビジネス・ロジックを含む。この場合、データ区分は、それらが区分された書き込みステージによって操作されていない限り、複数の読み取りステージによって操作されうる。例えば、パーティション・スレッド・マネージャは、もし書き込みステージがデータAについて操作中であれば、データAのための読み取り又は書き込み要求を待ち行列に入れる。しかしながら、もし読み取りステージがデータAについて操作中であれば、さらなる読み取り要求は、データAについての操作のために、スレッドを割り当てられる。同様に、受け取った書き込み要求は、現在の読み取り要求が完了するまで、待ち行列に入れられる。
【0053】
区分された読み取りステージの例は、「ロード・アカウント(load account)」メッセージを受け付け、そして、「アカウント・ローデッド(account loaded)」メッセージを、アカウント・データ構造(account data structure)からロードされたアカウントと共に返すアカウント・ローダと、マーケットのための対応する機能を実行するマーケット・ローダとを含む。
【0054】
リセンダ160は、区分された書き込みステージ150からメッセージを受け取る。リセンダの目的は、停止が命ぜられるまで、繰り返してメッセージをネットワークに発信することであり、これにより、下記により詳しく説明するように、メッセージを確実に引き渡すことができる。これは、失敗の場合に利点を有する。なぜなら、例えばサーバの交換によってこの失敗が修正されるまで、メッセージは、失われずに、待ち行列の中で蓄積されるからである。このメッセージは、処理されるまで持続する。リセンダは、スケジュールド・スレッド・マネージャ162の制御の下で動作する。このスレッド・マネージャは、その到来キューからメッセージをデキュー(dequeuing)する前に、ある程度の時間の経過を待つ。
【0055】
ディスパッチャ170は、リセンダ160及び区分された読み取りステージ140からメッセージを受け取る。これは、アクノリッジャ115からのメッセージの場合と同じである。これらの機能については以下において説明する。それは、メッセージをシリアライズし、そして、ネットワークにそれらを書き込む。
【0056】
ジャーナラは、失敗のイベントにおける応答のために、イベントのリドゥー・ログ(redo log)を保持しているけれども、チェックポインティング(check-pointing)が、状態を不揮発性ストレージに送る(flushing)ことにより、追加的に実行される。チェック・ポインティングは、定期的な掃除(cleaned down)をジャーナルに許可し、そして、回復時間が過大にならないために要求されるものである。失敗の場合は、状態は、最後のチェックポイントから再生されうる。
【0057】
前記したモジュールのいずれかによって実行される操作は、並列に進行することができ、そして、レシーバから受け取ったメッセージをジャーナラが処理するのと同時に、そして、以前に受け取ったメッセージのシリアライジングをディスパッチャが行うと同時に、レシーバは、メッセージの読み取りとデシリアライジング(deserialising)とを行う。
【0058】
サーバ間における保証されたメッセージ引き渡し(guaranteed message delivery)を提供するために使われるプロセスが、図6a〜cに表示されている。例えば、図6aに示される正常な動作では、サーバAのディスパッチャ170は、送信カウンタに従って、メッセージ・シーケンス値を設定する。例えば、シーケンス値を「1」に設定する。そして、このディスパッチャは、メッセージをサーバBのレシーバ110に送り、(ステップs100)そして、メッセージが再送信される必要があれば、それをバッファに保存する(ステップs101)。受け取りに際して、サーバBのレシーバ110は、受け取りカウンタをインクリメントする(ステップs102)。サーバAは、第2のメッセージ2をサーバBに送り(ステップs103)、そして、メッセージを保存する(ステップs104)。受け取りに際して、サーバBは、その受け取りカウンタをインクリメントする(ステップs105)。サーバBにおけるアクノリッジャ115は、受け取り確認されないメッセージを定期的に取り出すことを実行し、そして、受け取り確認メッセージであるACKをメッセージのために生成する。そして、この例では、アクノリッジャ115は、第1のメッセージのために、サーバAに(ディスパッチャ170を介して)ACKメッセージを送る(ステップs106)。サーバAは、メッセージ1及び2を、そのバッファからクリアし、そして、送信カウンタを、2の値にインクリメントする。次の送信については、ディスパッチャは、次のシーケンス番号、このケースであれば値「3」を、メッセージに割り当てる。
【0059】
メッセージを失った場合が図6bに表されている。再び、サーバAのディスパッチャ170は、シーケンス番号1を有するメッセージを、サーバBのレシーバ110に送り(ステップs110)、そして、メッセージが再送信されるべきものであれば、そのメッセージをバッファに保存する(ステップs111)しかしながら、メッセージは、送信中に失われる。すると、サーバAは、メッセージ2をサーバBに送り(ステップs112)、そして、メッセージを保存する(ステップs113)。メッセージが受領された後、サーバBは、その受け取りカウンタが零に設定されていることに気づくが、その一方で、メッセージ番号は2である。したがって、レシーバは、「受け取っていない」NACKメッセージを生成する。このメッセージは、ディスパッチャによって、カウンタ「0」を含むサーバAに戻すように送信される(ステップs114)。サーバAのリセンダ160は、NACKメッセージに応答して、0より大きいカウンタを備える全てのメッセージを再送信する。このことは図6aに示されている(ステップs115)。
【0060】
図6cは、重複排除(de-duplication)のプロセスを表す。第1及び第2のメッセージは、図6aのステップs100〜s105に示されているように、成功のうちに送信されている(ステップs120〜s125)。その結果、サーバBの受け取りカウンタは、「2」に設定されている。そして、サーバBのアクノリッジャ115は、確認メッセージACKを生成し、それを(ディスパッチャ170を介して)サーバAに送る(ステップs126)。しかしながら、このメッセージは、移送中に失われた。タイムアウト期間内にACKメッセージを受け取らない場合は、サーバAは、メッセージ1を再送信する(ステップs127)。サーバBは、このメッセージを受け取る。しかしながら、その受け取りカウンタは2であり、それは、それがこのメッセージを既に受け取っていることを認識し、それを廃棄する(ステップs128)。同様のプロセスがメッセージ2について発生する(ステップs129、s130)。サーバBは、カウンタ2を含むACKメッセージを送り(ステップs132)、サーバAは、そのバッファをクリアし、そして、その送信カウンタを2に設定する(ステップs132)。それから、このプロセスは、図6aに示されるように続く。
【0061】
図7は、賭け要求メッセージ(bet request message)を処理するために相互作用する様々なモジュールの間の相互関係を表示する。以下に、より詳しく説明されるように、これらのモジュールは、異なるサーバ上で動作する。以下の説明から明らかなように、トランザクションは、クライアントとサーバとの間での接続が設定され、そして、通信が、それらの間において、あちこちで通過するようなクライアント−サーバ・モデルを使っては処理されていない。代わりに、クライアントは、第1のノードあるいはサーバにメッセージを渡す。もしさらなる処理が要求されていれば、第1のサーバは、そのメッセージを第2のサーバに取り次ぎ、そして、第3のサーバにと、順次取り次ぐ。これは、要求されたトランザクションに関係するメッセージがクライアントに戻されるまで行われる。
【0062】
例えば、アカウント・コントローラ・インスタンスを実行するサーバのようなモジュールが失敗する場合、メッセージは失われないが、しかし、この欠陥が、例えばサーバの交換により修正されるまで、メッセージはキューの中に蓄積される。
【0063】
図7及び8を参照して、第1のユーザが賭けの提起を望むときには、第1の「PlaceBetRequest」メッセージが、ここではイニシエータとして参照されるソフトウエア・モジュール21により生成される(ステップs1)。この「PlaceBetRequest」メッセージは、ユーザのユーザ・アカウントのID、賭けを提起したいマーケットのID、ユーザが賭けをし、「バック」または「レイ」のいずれを望むかについての結果のID、賭けをしたい金額、そして彼らが賭けをしたい掛け率のようなデータを含む。
【0064】
図8を参照して、イニシエータ21は、例えばJ2EEアプリケーション・サーバのようなアプリケーション・サーバ400aの上で動く。それは、クライアント・インタフェース・サーバとして動作するサーバ400のクラスタ内の一つであ。このクライアント・インタフェース・サーバ400のクラスタは、賭け要求をトランザクション処理システム2に投入することについて責任を持つ。クライアント・インタフェース・サーバ400のクラスタは、例えばユーザの賭け可能なバランスをロードする要求やユーザの現在有効な賭けを見る要求のような、賭けシステムに関連する他の要求及びメッセージを投入することにも責任を持つ。
【0065】
生成された「PlaceBetRequest」メッセージが、イニシエータ21により作られた他のメッセージあるいは要求と共に到来キューに置かれ、そして、ここでエグゼクティブ(Executive)として参照されるソフトウエア・モジュールに向けられる。ここで、このモジュールは、イニシエータ21と同じクライアント・インタフェース・サーバ400a上で動作する。これらのステージの第1は、エグゼキュータ23として参照される処理ステージであり、これは、「PlaceBetRequest」によって実施される。エグゼクティブ22は、レシーバ24として参照される処理ステージと、ディスパッチャ25として参照される処理ステージとをさらに備える。エグゼキュータ23は、バッチ中の到来メッセージ・キューからメッセージをデキュー(dequeue)し、そして、スレッド・マネージャ・アプリケーション(図示せず)によって割り当てられたスレッドについてのメッセージを処理するように構成されている。スレッド・マネージャは、トランザクション処理サーバ200の一つに配置されうる。スレッドが割り当てられる方法は、図5を参照しながら、上記において既に説明された。
【0066】
トランザクション処理システム2における、非同期要求の処理についての詳しい記述が以下において提供される。
【0067】
「PlaceBetRequest」メッセージは非同期要求である。非同期要求を使うことは、エグゼクティブ22のエグゼキュータ23からの確認メッセージを、計画された操作を再開する前に、イニシエータ21が待つ必要がないことを意味する。非同期メッセージングは、以下で説明されかつ、図7〜11に示されるトランザクション処理システム2の全てのステージで使用されうる。
【0068】
「PlaceBetRequest」メッセージを含むメッセージのバッチ中におけるメッセージの数は、前記で言及したバッチング・リソース・コントローラ(BRC)としてここで参照されるソフトウエア・モジュールにより制御される。
【0069】
図7を参照して、受け取られた「PlaceBetRequest」メッセージは、エグゼキュータ23によってディスパッチャ25に送られる(ステップs2)。エグゼキュータ23がこれを行うのは、ディスパッチャ25の到来キューの中の「PlaceBetRequest」メッセージを、ディスパッチャ25に向けられた他の要求あるいはメッセージと共にエンキューすること(enqueueing)によってである。これらの他の要求あるいはメッセージは、イニシエータ21から発することもできる。「PlaceBetRequest」メッセージが非同期要求であるために、エグゼキュータ23は、その動作を続けることができる。それは、ディスパッチャ25からの確認メッセージを待つ必要はない。
【0070】
ディスパッチャ25は、到来キューからのメッセージのバッチ中における「PlaceBetRequest」メッセージをデキューする。バッチのサイズは、ここでバッチング・リソース・コントローラ(Batching Resource Controller)25aとして参照されるコントローラ・モジュール25aにより決定され及び表示される。このモジュールは、ディスパッチャ25と関連付けられている。このコントローラ・モジュールは、ディスパッチャ25の動作を監視し、そして、それぞれのメッセージ・バッチ中で処理される要求及びメッセージの数を調整するように構成されている。このことは、バッチング・リソース・コントローラ(Batching Resource Controller)23aに関連して、上記において説明した。バッチ中のメッセージ及び要求のデキューイングは、ディスパッチャ25(及びトランザクション処理システム2における他の全てのステージ)がメッセージのスループットを最大化することを可能にする。なぜなら、バッチ中の多数の要求とメッセージの処理が、キャッシュの局在化(cache locality)とタスクの集中(task aggregation)を可能にするからである。しかしながら、上に述べたように、もしバッチング・ファクタ(batching factor)が大きすぎるならば、ユーザのための応答時間(ユーザは、彼らの賭け要求に対する応答を待っている)は、非常に長くなる。
【0071】
トランザクション処理システム2における全てのバッチング・リソース・コントローラは、同様に動作する。しかしながら、バッチングは、到着したステージに応じて、異なる基準に基づいて実行されることもできる。例えば、レシーバ・ステージでは、バッチングは、ネットワークの待ち時間に基づくことができる。また、ジャーナラにおいては、それは、ディスクの待ち時間に基づくことができる。一方、エクスポーザでは、それは、アカウント毎の要求の数に基づくことができる。この例では、個別のバッチング・リソース・コントローラが各ステージと関連付けられている。しかしながら、他の形態では、単一のバッチング・リソース・コントローラが各サーバについて存在し、このコントローラは、そのサーバについての全てのバッチング動作の制御に責任を持つ。バッチング・リソース・コントローラは、この実施形態における各ステージと関連するので、明瞭化のために示されていない。以下の説明では、用語「送信する」(forwarding)及び「受信する」(receiving)という用語を用いて動作が説明されるけれども、理解されるべきこととして、これらの動作は、キューイング及びバッチ・コントロールを含む。
【0072】
ディスパッチャ25によりデキューされたメッセージは、それらがバッチにおいて処理されるように、グループに分割される。「PlaceBetRequest」メッセージは、イニシエータ21に「PlaceBetRequest」メッセージを生成させたユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ41に向けられた他のメッセージと共に、バッチにまとめられる。バッチに割り当てられた他のメッセージは、他の「PlaceBetRequest」メッセージ、ユーザの賭け可能なバランスを見るためのリクエストなどを、既に説明したように、含みうる。
【0073】
このステージでは、エグゼクティブ22は、図4に示されるアカウント・コントローラ13のうちのどれがユーザのユーザ・アカウント10に割り当てられるかを知らず、そして、このため、「PlaceBetRequest」メッセージをどこに向けて発送すべきか知らない。ディスパッチャ25は、したがって、正しいアカウント・コントローラ41を確かめるために、「LocateInstanceRequest」メッセージを生成する(ステップs3)。その間、「PlaceBetRequest」メッセージは、その後の送信のために、エグゼクティブ22に保存される。例えば、「PlaceBetRequest」メッセージは、クライアント・インタフェース・サーバ400aに配置されたメモリ402内に保存されうる。上で述べたように、「PlaceBetRequest」メッセージを含むバッチ中の全てのメッセージは、同じアカウント・コントローラ41に向けられ、そして、したがって、ただ一つの「LocateInstanceRequest」メッセージが、そのバッチのために、生成される必要がある。この「LocateInstanceRequest」メッセージは、ディレクタ31に向けられた他のメッセージ(例えば、他のユーザ・アカウントに関連する「LocateInstanceRequest」メッセージ)と共にキューにエンキューされる。
【0074】
ディレクタ31は、レシーバ・ステージ32、ロケータ・ステージ33及びディスパッチャ・ステージ34とを備えている。それはさらに、他のモジュールの場合と同様にジャーナラ(図示せず)を備えているが、これは明瞭さのために省略されている。図8を参照して、ディレクタ31は、サーバ200g上で動くことができ、そのサーバは、トランザクション処理サーバ200のクラスタの一つである。レシーバ32は、メッセージのバッチ中の「LocateInstanceRequest」メッセージをデキューする。
【0075】
レシーバ32は、キューの中の「LocateInstanceRequest」メッセージを、ロケータ33に向けられた他のメッセージと共に、エンキューする(ステップs4)。それから、ロケータ33は、メッセージのバッチ中におけるこのキューからの「LocateInstanceRequest」メッセージを、例えば他の「LocateInstanceRequest」メッセージと共に、バッチング・リソース・コントローラ33aの制御の下で、デキューする。ロケータ33は、ディレクタ31が配置されたサーバ200gのメモリ202に記録されたリストからの「LocateInstanceRequest」メッセージにおいて特定されたユーザ・アカウントに割り当てられたアカウント・コントローラ41のアドレスをルックアップするように、構成される。そして、ロケータ33は、割り当てられたアカウント・コントローラ41のアドレス情報を含む「LocateInstanceReply」メッセージを作り出し(ステップs5)、そして、そのメッセージを、ディレクタ31のディスパッチャ・ステージ34に向けられた他のメッセージと共にエンキューする。
【0076】
「LocateInstanceReply」メッセージは、ディスパッチャ34によりデキューされ、そして、エグゼクティブ22のレシーバ24に向けられた他のメッセージと一緒に、キューにエンキューされる(ステップs6)。レシーバ24によって一旦デキューされると、「LocateInstanceReply」メッセージは、ディスパッチャ25の到来キューに送られる(ステップs7)。
【0077】
このステージでは、保留されている「LocateInstanceReply」メッセージの起因となった「PlaceBetRequest」メッセージは、クライアント・インタフェース・サーバ400aのメモリ401から引き出され、そして、「LocateInstanceReply」メッセージで特定されたアカウント・コントローラ41に送られる。アカウント・コントローラ41のアドレスは、さらなるルックアップを避けるために、エグゼクティブ22によりキャッシュされる。アカウント・コントローラは、トランザクション処理サーバ200の一つであるサーバ200a上で動作することができる。サーバ200aは、ユーザのユーザ・アカウントに関連する全てのデータが保存されるサーバである。
【0078】
エグゼクティブ22及びディレクタ31と同様に、アカウント・コントローラ41は、レシーバ・ステージ42及びディスパッチャ・ステージ46を備える。アカウント・コントローラ41は、さらに、ジャーナラ・ステージ43と、エクスポーザ・ステージ(Exposer stage)44と、そして、ブッカ・ステージ(Booker stage)45とを備える。「PlaceBetRequest」メッセージは、レシーバ42によって受け取られ(ステップs8)、そして、ジャーナラ43の到来キューに向けて送られる(ステップs9)。
【0079】
アカウント・コントローラ41の処理ステージは、エグゼクティブ22及びディレクタ31のステージに関連して上に記載したものと同様に動作する。メッセージは、メッセージの到来キューからデキューされる。到来キューにおけるメッセージは、先行する処理ステージによって、そこに配置されている。さらに、メッセージは、処理されて、そして、次のステージの到来キューに配置されるか、あるいは、次のステージの到来キューに配置される新しいメッセージを作り出すために使われる。これらのプロセスは、エンキューイングあるいはデキューイングとしてここで一般的に言及される。
【0080】
ジャーナラ43において、「PlaceBetRequest」メッセージは、例えば共有ハードディスク6において保存されうる不揮発ログに追記される。あるいは、それは、各サーバ200内のハードディスク203に保存されうる。これにより、各サーバ200におけるログに保存された情報を取り出す速度が向上する。もし必要なら、応答のために、「PlaceBetRequest」メッセージには、固有のシーケンス番号が、ログにおいて付与される。
【0081】
このようにして受領メッセージをジャーナリングすることは、次のことを意味する。すなわち、システム欠陥の場合には、トランザクション処理システム2は、確定的なポイント、すなわち、アカウント・コントローラ41のジャーナラ43によって受領メッセージが最後に記録されたステージに戻ることができる。「PlaceBetRequest」メッセージは、ジャーナラ43からエクスポーザ44に送信される(ステップs10)。
【0082】
エクスポーザ・ステージ44では、「PlaceBetRequest」は、賭け(bet)についての最大に可能な損失(exposure)を計算するために、処理される。これは、ユーザが特定の結果をバックあるいはレイしたときのユーザの最大の責任を決定する計算である。例えば、もし、賭けが、特定の結果を、2/1の掛け率(3のデジタル掛け率)で、5ポンドの掛け金において、「バックする」ことであれば、ユーザは、もし彼らが賭けに負ければ、5ポンドを失うことになる。しかしながら、もし、賭けが、特定の結果を、2/1の掛け率で、最大5ポンドの賭けで「レイする」ことであれば、ユーザは、もし賭けに負ければ、10ポンドを失うことになる。
【0083】
損失の計算は、エクスポーザ44によって実行され、そして、バッチにおいて処理される。したがって、もし、特定のユーザ・アカウントのために複数の「PlaceBetRequest」メッセージがあれば、全ての賭けの損失は、単一の操作で計算される。
【0084】
エクスポーザ・ステージ44は、ユーザのユーザ・アカウントにおける賭け可能なバランスに対して計算された損失をチェックする。もし、ユーザ・アカウントが、ユーザの有効な賭けについての損失をまかなうに十分な金額を含むのであれば、エクスポーザ44は、「MatchBetRequest」メッセージを作り出し、そして、この「MatchBetRequest」メッセージをディスパッチャ46に送り出す(ステップs11)。もし、ユーザ・アカウントが、賭けの損失をまかなうに十分な金額を含まないのであれば、メッセージは、エグゼクティブ22及びイニシエータ21を介してユーザに戻され、これによって、ユーザは、利用できる資金が不十分であることを知らされる。
【0085】
ディスパッチャ46におけるプロセスは、エグゼクティブ22のディスパッチャ24を参照して前記したそれに類似している。アカウント・コントローラ41は、どのマーケット・コントローラ14が、「MatchBetRequest」により特定された賭けマーケット11に割り当てられたかを知らない。ディスパッチャ46は、したがって、「LocateInstanceRequest」メッセージを生成し、そして、ディレクタ31にそれを送る(ステップs12)。これは、メッセージをロケータ33に送るものである(ステップs13)。ロケータ33は、割り当てられたマーケット・コントローラ51をリストからルックアップする。その方法は、アカウント・コントローラ41のルックアップに関連して前記したところと同様である。その間、「MatchBetRequest」メッセージは、アカウント・コントローラ41中に、その後の送信のために保存される。「MatchBetRequest」は、例えば、アカウント・コントローラ41が配置されるサーバ200に配置されたRAM202中に保存されうる。割り当てられたマーケット・コントローラ51は、ロケータ33により配置される。そしてそれは、「LocateInstanceReply」メッセージをディスパッチャ34に送る(ステップs14)。マーケット・コントローラ51のアドレスは、ディレクタ31のディスパッチャ34により生成された「LocateInstanceReply」メッセージ中のアカウント・コントローラ41のレシーバ42に送られる(ステップs15)。
【0086】
そして、「LocateInstanceReply」メッセージは、アカウント・コントローラ41のレシーバ42により、ディスパッチャ46に送られる(ステップs16)。このポイントでは、「LocateInstanceRequest」メッセージを誘起する、保留の「MatchBetRequest」は、サーバ200上のメモリ201から引き出され、そして、ディスパッチャ46により、正しいマーケット・コントローラ51に送付される(s17)。アカウント・コントローラ41の場合と同じように、マーケット・コントローラ51のアドレスは、エグゼクティブ22によりキャッシュされ、これにより、そのアドレスを再びルックアップする必要がないようにしている。
【0087】
図8に示されるように、マーケット・コントローラ51は、トランザクション処理サーバ200の一つであるサーバ200d上に配置され、そして、レシーバ・ステージ52、ジャーナラ・ステージ53、マッチャ・ステージ(Matcher stage)54、及びディスパッチャ・ステージ55を備える。マーケット・コントローラ51におけるこれらのステージは、メッセージのエンキュー及びデキューを行うものであり、これらは、エグゼクティブ22、ディレクタ31,及びアカウント・コントローラ41に関連して説明したところと同様である。「MatchBetRequest」メッセージは、レシーバ52により受け取られ、そして、ジャーナラ53に送られる(ステップs18)。ジャーナラ53においては、「MatchBetRequest」メッセージは、例えばハードディスクに保存された不揮発性ログに追記される。このことは、アカウント・コントローラ41のジャーナラ43における「PlaceBetRequest」メッセージのロギングに関連して説明したところと同様である。既に説明したように、不揮発性ログは、例えば、マーケット・コントローラ51が配置されるサーバ200d上や、あるいは、共有ディスク6や、あるいは、マーケット・コントローラ51にネットワーク接続経由で接続された他のディスクに保存されてもよい。「MatchBetRequest」メッセージは、それから、マッチャ54に送られる(ステップs19)。
【0088】
マッチャ54においては、「MatchBetRequest」メッセージは、マッチャ54を、賭けマーケット3に既に提起されていたマッチしていない賭け(unmatched bets)のプールを通しての調査へのきっかけとさせる。マッチしていない賭けは、例えば、サーバ200dの一部であるメモリ202中に保存されうる。調査の目的は、「MatchBetRequest」メッセージにより提供された条件の賭けに対向する条件を提供する賭けを見つけることである。この例では、賭けプールは空であり、そのため、マッチできる賭けはみつからない。ユーザの賭けは、したがって、マッチしていない、未修整の(unmodified)賭けのプールに追加される。それから、マッチャ54は、その賭けのためのマッチング・プロセスに関する情報を記述する「MatchBetReply」メッセージを生成する。このケースでは、プールが空なので、「MatchBetReply」メッセージは、その賭けのために適用可能な一致(match)はないということを記述する。
【0089】
賭けのマッチングは、バッチにおいて実行される。もし、複数の「MatchBetRequests」が特定の賭けマーケット11について存在するときは、全ての「MatchBetRequests」のためのマッチング・プロセスは、単一の操作で実行される。
【0090】
「MatchBetReply」メッセージは、マッチャ54によりディスパッチャ55に送られ(ステップs20)、それは、今度は、そのメッセージを、アカウント・コントローラ41のレシーバ42に送る(ステップs21)。レシーバ42は、「MatchBetReply」メッセージをジャーナラ43に送り(ステップs22)、そこでは、「MatchBetReply」メッセージは、ブッカ45に送られる前に、不揮発性ログに付記される(ステップs23)。
【0091】
ブッカ45においては、「MatchBetReply」メッセージに含まれる情報は、例えば、ユーザの賭けの状態を、「未処理」(unprocessed)から「処理済み」(processed)にアップデートするために使われる。さらに、ブッカ45は、様々な一致情報を保存するように構成される。しかしながら、「MatchBetReply」メッセージの場合には、適切な「MatchBetRequests」が賭けプール内にないので、一致情報がない。ユーザの賭けの状態は、例えば、アカウント・コントローラ41を実行させるサーバ200aにおけるRAMのようなメモリ202内に保存されうる。ブッカ45は、「PlaceBetReply」メッセージを生成し、そして、それを、ディスパッチャ46に送る(ステップs24)。ディスパッチャ46からは、この「PlaceBetReply」が、エグゼクティブ22のエグゼキュータ23に、レシーバ24を介して送られる(ステップs25、s26)。
【0092】
このポイントでは、「PlaceBetReply」メッセージが、イニシエータ21の到来キューに置かれ、デキューを待つ(ステップs27)。そして、賭けを提起した結果は、イニシエータ21を介して、ユーザに返されうる。
【0093】
図9及び10を参照して、第2のユーザは、第1のユーザにより提起された賭けに対向して、ユーザ・ウエブサイトを介して、賭けを提起する。これは、第2の「PlaceBetRequest」メッセージを、エグゼクティブ22のエグゼキュータ23内に送り込ませる(ステップs1)。第2の「PlaceBetRequest」メッセージは、トランザクション処理システム2を通る経路を辿る。このことは、第1のユーザの賭けに関連する「PlaceBetRequest」メッセージの経路に関して説明したところと同様である。ステップs1〜s19は、前記したところと同様である。
【0094】
マーケット・コントローラ51内のマッチャ54に到達すると、第2のユーザの賭けに関連する「MatchBetRequest」メッセージは、マッチャ54が、RAM202中における一致しない賭けのプール中の「MatchBetRequest」メッセージに対する可能な一致を見つけるための調査の契機となる。これは、第1のユーザの賭けに関連する「MatchBetRequest」メッセージに関して既に説明したとおりである。ここでは、前記した調査が成功し、そして、第2のユーザの賭けに関連する「MatchBetRequest」が、第1のユーザの賭けに関連する第1の「MatchBetRequest」に一致している。
【0095】
その後、マッチャ54は、その一致に関係する情報を記述する「MatchBetReply」メッセージを生成し、そして、この「MatchBetReply」メッセージをディスパッチャ55に(ステップs20a)、そして、第2のユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ61のレシーバ62に送る(ステップs21a)。図11を参照して、アカウント・コントローラ61は、サーバ200b上に配置される。このサーバは、トランザクション処理システムを形成するサーバ200のネットワークの一つである。このサーバ200bは、第2のユーザのユーザ・アカウントに関連する全ての情報が、例えばRAM202内に保存されるサーバである。
【0096】
それから、「MatchBetReply」メッセージは、トランザクション処理システム2を、図9に示すようにして流れる。このことは、第1のユーザの賭けに関連する「MatchBetReply」メッセージの流れに関して説明したところに類似している。特に、「MatchBetReply」メッセージは、ジャーナラ63により不揮発性メモリ203内に保存され、そして、ブッカ65に送られる。これは、アカウント・コントローラ61内の第2の賭けの状態を「未処理」から「処理済み」にアップデートするものである。ブッカ65は、さらに、「MatchBetReply」メッセージに含まれる位置情報を保存し、そして、「PlaceBetReply」メッセージを構築する。このメッセージは、ディスパッチャ66並びにエグゼクティブ21のレシーバ23及びエグゼキュータ22を介して、イニシエータ21に送られる(ステップs24〜s27)。
【0097】
それから、「PlaceBetReply」は、クライアント・インタフェース・サーバ400a上のイニシエータ21を介して中継されて、ユーザのウエブページに戻される。これは、第1及び第2のユーザに、彼らの賭けを対向する賭けに一致させることに成功したという確認を提供する。
【0098】
前記した「MatchBetReply」メッセージを生成することに加えて、マッチャ54は、マーケット・コントローラ51のディスパッチャ55に送られる「MatchedBetEvent」メッセージを追加的に生成する(ステップs20b)。「MatchedBetEvent」メッセージは、第1のユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ41に送られるべきものであり、これによって、それに対して、第1のユーザの賭けに関連する「PlaceBetRequest」メッセージが一致に成功したことを知らせることができる。しかしながら、このステージでは、マーケット・コントローラ51は、第1のユーザのユーザ・アカウントに関連するアカウント・コントローラ41のアドレスを知らない。「MatchedBetEvent」メッセージは、したがって、マーケット・コントローラ51において、例えば、サーバ200bのメモリ202内に保存され、そして、ディスパッチャ55は、ディレクタ31によりアクセスされるリストからアカウント・コントローラ41のアドレスをルックアップするために、「LocateInstanceRequest」メッセージを生成する(s21b)。このリストは、ディレクタ31が配置されたサーバ200gの一部として備えられたRAM202に保存されうる。
【0099】
「LocateInstanceRequest」メッセージは、レシーバ32により受け取られ、そして、アカウント・コントローラ41のアドレスをルックアップするために、ロケータ33に送られる(s22b)。ロケータ33は、アカウント・コントローラ41のアドレスを含む「LocateInstanceReply」メッセージを生成し、そして、それを、ディスパッチャ34を介して、レシーバ52に送る(ステップs23b、s24b)。マーケット・コントローラ51のレシーバ52は、それから、「LocateInstanceReply」メッセージをディスパッチャ55に送る(ステップs25b)。この段階では、保留中の「MatchedBetEvent」メッセージが、メモリ201から取り出され、アカウント・コントローラ41のレシーバ42に送られる(ステップs26b)。アカウント・コントローラ41のアドレスは、将来において再びそれをルックアップする必要を避けるために、マーケット・コントローラ51によりキャッシュされる。
【0100】
受け取られた「MatchedBetEvent」メッセージは、ジャーナラ43に送られ(ステップs27b)、そして、それは、前記したような方法で、固有の参照番号と共に不揮発性ストレージに付記される。「MatchedBetEvent」メッセージは、それから、ブッカ45に送られ(ステップs28b)そして、アカウント・コントローラ41についての賭けの状態をアップデートするために使われる。このデータは、アカウント・コントローラ41を実行するサーバ200aのRAM202内に保存されうる。
【0101】
この方法では、第1および第2のユーザにより提起された賭けは共に一致に成功している。
【0102】
トランザクションが処理されると、トランザクション処理システム内において保持されているデータは、速やかに変化する。新しいデータは、依頼者に通知される必要がある。例えば、マーケットの見込み(market view)は、ユーザのためにアップデートされる必要がある。これらの変更は、情報を必要とする依頼者に伝えられる。これは、依頼者の要求に応答することによってでなく、デルタ(deltas)として参照される現在のデータへの変更を依頼者にプッシュすることによる。
【0103】
前記した実施形態及びその変形例は、トランザクション処理システムによって提供される効果を達成するために、単独で、あるいは組み合わせて使用されうる。
【0104】
本発明に基づく前記したシステムは、トランザクション処理システムのACID原則に従う。これらは、トランザクションが以下の特性を持つ必要があるということである:
【0105】
原子性(Atomicity)。最小単位(atomic)のトランザクションは、全ての操作が成功するか又はしないかという、一連の操作である。もし、このような一連の操作が、完成の前に、あるポイントで失敗すると、その失敗の前に終了しているあらゆる操作は、ロールバックされる必要がある。本発明に基づくトランザクション処理システムでは、トランザクションは前もって知られており、そして、全ては不揮発性メモリに保存されている。従来のシステムと異なり、ロギングは、操作レベルというよりもむしろ、トランザクション・レベルで発生する。そのため、全ての完了した操作がログされるUNDOロギングの必要がない。そして、UNDOログは、不揮発性ストレージから、トランザクションが完了する前に書き込まれた変更を除去するために検査される。
【0106】
一例として、「賭けを提起する」(bet placement)トランザクションがログされる一方、その下にある一連の操作、例えば「古いエクスポージャを書き込む」、「新しいエクスポージャを書き込む」、「新しい賭けを書き込む」などはログされていない。
【0107】
トランザクションが補足され、実行が開始され、そして、トランザクションにおける全ての操作が完了する前に失敗がある場合は、その状態は捨てられ、そして、REDOログとしても知られるジャーナルは、状態を復元するために再生される。
【0108】
ログの再生による状態の復元を確実に成功させるために、これらのステージは、確定的(deterministic)とされる。例えば、賭けは、特定の注文において到着し、そしてログされる。以下を仮定する:
1.賭け1(10ポンド)
2.賭け2(15ポンド)
3.賭け3(20ポンド)
【0109】
確定的な手法で処理した後、単一の可能な状態は以下の通りである:
1.賭け1(10ポンドが賭け2とマッチ)
2.賭け2(10ポンドは賭け1とマッチ、5ポンドは掛け3とマッチ)
3.賭け3(5ポンドは掛け2とマッチ、15ポンドはマッチしない)
【0110】
明確なこととして、賭けマッチング・ステージは、非確定的であり、多数の状態が可能であり得る。例えば、賭け1と2とが処理される前に賭け3が処理されていたとすれば、可能な状態は以下の通りである:
1.賭け1(10ポンドが賭け3とマッチ)
2.賭け2(10ポンドは賭け3とマッチ、5ポンドはマッチしない)
3.賭け3(10ポンドは掛け1とマッチ、10ポンドは賭け2とマッチ)
【0111】
ログ応答は時間を消費するプロセスでありうるので、本発明におけるいくつかの形態は、例えばログ・テイリング(log tailing)のような利用性の高い機構を含む。
【0112】
一貫性(Consistency)。これは、アプリケーションが規定する完全性の制約について違反があってはならないことを意味する。あるトランザクションが実行される前に、あるシステムが一貫する状態(consistent state)にあるとすると、それは、その後においても、一貫した状態にある必要がある。
【0113】
例えば、もし、あるユーザが10ポンドのための賭けを持つとすれば、マッチした部分とマッチしない部分の合計は10ポンドでなければならない。
【0114】
本発明に基づくシステムの実施形態では、弱い一貫性が適用される。このシステムは、結局のところは一貫することになるけれども、時間的なある一瞬においては、それは不一致となりうる。例えば、あるアカウント・コントローラは、不一致である10ポンドの賭けの記録を持ちうるし、あるマーケット・コントローラは、その掛けのうち5ポンドがマッチしたとの記録を持ちうる。このアカウント・コントローラは、5ポンドの一致あるいは不一致の記録を持たないけれども、マーケット・コントローラから移動中の、このマッチを記述するメッセージは、アカウント・コントローラが結果的に、マッチされ及びマッチしない5ポンドの価額を記録することを意味する。このことは、既に説明したように、状態及びメッセージングの保証によって保証されている。
【0115】
独立性(Isolation)。この特性は、複数の実行中の動作が重ならないことに言及するものであり、これにより、それらが同時に実行されたとしても、それらは順次実行されるように見える。トランザクション処理システムにおける多くの機能は、アカウント及びイベントへの排他的なアクセスを要求する。独立性を達成するためには、実行ユニットが個別のエンティティに割り当てられる。それにより、アクセスは固有的にシリアライズされ、そして、トランザクションは他のそれとは独立とされる。例えば、単一の実行ユニットは、特定データの一部への独占を取得しそして解放するクライアントのセッションに対向して、特定のアカウントあるいは特定のマーケットを持つことができる。
【0116】
耐久性(Durability)。トランザクションが成功して、一旦完了すると、それは、例えシステムがシャットダウンしても、失われてはならない。変更は、したがって、ディスクに書き込まれ、あるいはジャーナルされる。上において説明したように、フル・トランザクションのみがこの手法でログされるのであり、このトランザクションを構成する個別の動作はそうされない。
【0117】
メッセージ・カウンタは、やはりログされ、メッセージの紛失、不調あるいは重複のために提供される。
【0118】
前記した実施形態への変更及び変化は熟練者には明白であるが、それらは、請求の範囲の中に入る。
【技術分野】
【0001】
本発明は、トランザクション処理(transaction processing)に関しており、特に、しかし制限的ではなく、賭け取引を処理するための方法及び装置に関連するものである。
【背景技術】
【0002】
トランザクション処理システムは様々な環境中で使用されており、それは、株式取引システム、旅行予約システム、及び、オンライン賭け取引所(online betting exchanges)のような賭けシステムを含む。高速なトランザクション処理システムへの要求が高まるにつれて、従来のシステムは、要求される処理速度を提供しようと努力することになる。
【発明の概要】
【0003】
本発明によれば、分散された複数のノードを備えるシステムにおけるトランザクション処理の方法が提供される。ここでは、データは、複数のデータ・パーティションの中に保持される。それぞれのパーティション中のデータは、それぞれの単一のノードに関連付けられる。このシステムは、データ・パーティションのグループを制御するための複数のコントローラを含む。それぞれのコントローラは、データ・パーティション中のデータについての処理を実行するための、複数の書き込み段階(write stage)と、実行のスレッド(threads of execution)を書き込み段階に割り当てるためのスレッド・マネージャとを備える。ここで、スレッド・マネージャは、所定のデータ・パーティション中におけるデータ操作のために、最大でも、単一のスレッドを割り当てるように構成されている。この方法は、複数のコントローラ中の第1のものにおけるメッセージを受け取るステップを含む。このメッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定する。さらに、この方法では、複数の書き込み処理の一つによる処理のためにメッセージをキューイング(queuing)し、そして、書き込み段階に、メッセージの処理を許可するが、これは、処理のスレッドが所定のデータ・パーティションのために利用可能な場合においてである。
【0004】
本発明によれば、複数の分散されたノードを備えるシステムにおけるトランザクション処理のための装置がさらに提供される。ここでは、データは、複数のデータ・パーティション内に保持される。それぞれのパーティション内のデータは、ノードのうちのそれぞれ一つに関連付けられる。このシステムは、データ・パーティションのグループを制御するための複数のコントローラを備える。それぞれのコントローラは、データ・パーティション中のデータについての処理を実行するための、複数の書き込み段階と、処理のスレッドを書き込み段階に割り当てるためのスレッド・マネージャとを備える。ここでは、スレッド・マネージャは、所定のデータ・パーティション中におけるデータについての操作のために、最大で単一のスレッドを割り当てるように構成されている。この装置は、複数のコントローラのうちの第1のものにおいてメッセージを受け取るためのレシーバを備える。メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作と複数の書き込み段階とを、メッセージを処理するために規定する。ここでは、所定のデータ・パーティションのために処理のスレッドが利用可能な場合は、書き込みステージは、一つ又はそれ以上のメッセージを処理するように構成されており、そして、処理のスレッドが利用可能でない場合には、この装置は、メッセージをキュー(queue)に配置するように構成されている。
【0005】
本発明の他の態様によると、複数の分散されたノードを備えるシステムにおけるトランザクション処理の方法が提供される。この方法は、第1のノードにおけるメッセージを受け取るステップを備える。メッセージは、エンティティに関連するデータについて実行されるべき操作を規定する。さらに、この方法は、ノード上で動いているメッセージ・ハンドラによって処理するためにメッセージをキューイングすること、他のメッセージ・ハンドラがそのデータについて操作を行っていない場合は、メッセージ・ハンドラがメッセージを処理することを許可すること、そして、その後の処理のために、メッセージを第2のノードに送ることを含む。
【0006】
メッセージ・ハンドラは、読み取りのみ要求(read only requests)を扱う複数の第1メッセージ・ハンドラと、読み取り−書き込み要求(read-write requests)を扱う複数の第2メッセージ・ハンドラとを備える。ここで、複数の読み取りのみ要求は、並列的に動作できる(runnable in parallel)ようになっている。
【0007】
複数の読み取りのみ要求は、エンティティに関連するデータについての操作のために実行可能としうるが、これは、読み取り−書き込み要求が前記データについて操作していない場合においてのみである。ただ一つの読み取り−書き込み要求が、ある所定の時間において、あるエンティティに関連するデータについて実行可能となることができる。
【0008】
この方法は、受け取ったメッセージを、受け取ったときにジャーナリング(journaling)することを含む。
【0009】
この方法は、受領した他の複数のメッセージと共に、メッセージをバッチング(batching)することを備えることができる。バッチングは、それが実行される処理ステージに依存しうる。バッチングは、ネットワーク待ち時間(network latency)、ディスク待ち時間(disk latency)、及び処理されるべきエンティティのうちの少なくとも一つに従って実行されうる。
【0010】
メッセージ・ハンドラは、複数のエンティティと関連することができる。そして、この方法は、メッセージが向けられたメッセージ・ハンドラに従って、メッセージをグループ化(grouping)することを、さらに含むことができる。
【0011】
メッセージ・ハンドラに関連付けられた複数のエンティティに関するデータは、いずれかの単一のノードにおいて格納されうる。単一のエンティティに関するデータは、いずれかの単一のノードにおいて格納されうる。
【0012】
エンティティは、ユーザに関連付けられたアカウントを備えることができ、あるいは、複数のユーザが賭けを行うマーケットを備えることができる。
【0013】
メッセージは、非同期で送信されうる。
【0014】
ノードは、サーバを含むことができる。
【0015】
本発明によれば、分散された複数のノードを備えるシステムでのトランザクション処理のための装置がさらに提供される。この装置は、第1のノードにおいてメッセージを受け取る手段を備える。メッセージは、エンティティに関するデータについて実行されるべき操作を規定している。さらに、この装置は、ノード上で動くメッセージ・ハンドラによる処理のためにメッセージをキューイングするための手段、他のメッセージ・ハンドラがメッセージを処理していない場合に、メッセージ・ハンドラがそのメッセージを処理することを許可するための手段、及び、その後の処理のために、第2のノードに向けてメッセージを送るための手段を備える。
【0016】
本装置は、単一のアカウントあるいは単一のマーケットについて動作するメッセージ・ハンドラに単一のスレッドを割り当てるために、スレッド・マネージャをさらに含むことができる。また、本装置は、複数のメッセージ・ハンドラに影響するメッセージを処理するためにプリプロセッサ(pre-processor)をさらに含むことができる。プリプロセッサは、多数のジャーナル・メッセージ・ストリームから、単一のメッセージ・ストリームを生成するように構成されうる。
【0017】
本装置は、メッセージが受け取られていないことの通知に対応して、第1のノードから第2のノードにメッセージを再送付(resending)する手段を、さらに含むことができる。
【0018】
本装置は、大量に要求されたデータを提供するために、データ・ディストリビュータのクラスタをさらに含むことができる。
【図面の簡単な説明】
【0019】
本発明の実施形態は、例示を用いて、以下において、添付の図面を参照しながら説明される。
【図1】一般的なトランザクション処理環境についての概略図である。
【図2】賭け交換システムとしてのトランザクション処理システムを図示する概略図である。
【図3】図2で示されたサーバのコンポーネントを図示する概略図である。
【図4】本発明によるトランザクション処理システム内での、アカウント及びマーケットに関するデータの区分け(partitioning)を示す図である。
【図5】トランザクション処理機能を提供するソフトウエア・モジュールの構成を図示する概略図である。
【図6a】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間における、メッセージについての通常の交換を示す図である。
【図6b】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間におけるメッセージ交換の間でのメッセージ損失を示す図である。
【図6c】本発明によるトランザクション処理システムの一部を構成する二つのサーバ間におけるメッセージ交換の間での、メッセージの重複排除(de-duplication)を示す図である。
【図7】本発明によるトランザクション処理システムを通過するトランザクションの第1の流れを示す図である。
【図8】図2に示すサーバ上で動作して、図7に示すトランザクションの流れを許可するトランザクション処理モジュールについてのインスタンス(instances)を示す概略図である。
【図9】本発明によるトランザクション処理システムを通過するトランザクションの第2の流れと、第1及び第2の賭けを共にマッチングすることに関わるマッチング・プロセスとを示す図である。
【図10】本発明によるトランザクション処理システムを通過するトランザクションの第2の流れと、第1及び第2の賭けを共にマッチングすることに関わるマッチング・プロセスとを示す図である。
【図11】図2に示すサーバ上で動作し、図9及び10に示すトランザクションの流れを許可するトランザクション処理モジュールについてのインスタンスを示す概略図である。
【発明を実施するための形態】
【0020】
図1は、一般的なトランザクション処理環境1を表している。トランザクション処理システム2は、より大きな機能システム3の一部となっており、この機能システムは、他のシステム、アプリケーション、あるいはユーザと、クライアント・インタフェース4を介して通信する。クライアント・インタフェース・モジュール4は、異なるソースからトランザクション情報を受け取るために、そして、関連するトランザクション情報をトランザクション処理システム2に送り、若しくはそこから受け取るために、複数のサブシステム4a、4b、4cを持つことができる。トランザクション処理システム2は、特定の機能システム3の要求に従って、トランザクションを処理する。例えば、機能システムは、株式交換システム(stock exchange system)であり、ここでは、トランザクション処理システムは、付け値(bids)と申し込み(offers)との釣り合い(match)を取る。あるいは、機能システムは、銀行システム(banking system)であり、ここでは、トランザクション処理システムは、預金(credits)と負債(debits)を処理する。
【0021】
図2は、賭け交換システム(betting exchange system)3の環境でのトランザクション処理システム2を表している。この賭け交換システムは、例えば米国特許出願GB2356071Aに記載されているように、対向する賭け(opposing bets)の釣り合いを取るように構成されている。
【0022】
賭け交換システム3は、クライアント・インタフェース・モジュール4と、例えばファイアウオール5を通してリンクされたトランザクション処理システム2とを含む。クライアント・インタフェース・モジュール4は、ここにおいてクライアント・インタフェース・サーバと呼ばれる複数のサーバ400を備える。これらは、クライアントとの、到来する(incoming)又は出ていく(outgoing)通信を扱う。クライアントは、様々なシステムとのインタフェースを行うサーバ・アプリケーションでありうる。そして、この様々なシステムは、例えば、賭け交換をとりまとめ、そして、賭けトランザクション要求をトランザクション処理システムに供給するものである。クライアント・インタフェース・サーバ400は、ユーザから出された賭け及び/又は関連する賭け情報要求メッセージを受け取るように、そして、対応する要求メッセージをトランザクション処理システム2に導入するように構成されている。クライアント・インタフェース・サーバ400は、例えば、彼らの賭け可能なアカウントバランス(available-to-bet account balance)を見るために、ユーザからの要求メッセージを受け取り、あるいは、彼らの現在有効な全ての賭けを見るために、ユーザからの要求メッセージを受け取ることも可能である。クライアント・インタフェース・サーバ400は、トランザクション処理システム2からメッセージを受け取り、そして、対応するメッセージをユーザに返すようにも構成される。このクライアント・インタフェース・サーバは、サーバ400a・・・nとしてここで個別に言及もされている。
【0023】
トランザクション処理システム2は、複数のサーバ200にわたって、高度に分散されている。これらのサーバは、ここでは、トランザクション処理サーバとして言及されており、そして、それは、クライアント・インタフェース・サーバ400からのメッセージを受け取るようになっている。トランザクション処理システム2を複数のサーバ200にわたって配置することは、もし必要なときは、さらなるサーバの追加によって、容易にそして効率的なコストでシステムを拡大できることを意味する。
【0024】
図3を参照すると、それぞれのトランザクション処理サーバ200及びそれぞれのクライアント・インタフェース・サーバは、少なくとも一つのプロセッサ201/401と、例えばRAMであるメモリ202/402と、例えばハードディスクのような不揮発性メモリ203/403と、ネットワークインタフェースを含むI/Oシステム204/404とを備える。当業者には理解されることとして、各サーバは、その機能を発揮するために必要な全てのコンポーネントを備えている。トランザクション処理サーバは、ここでは、個別に、サーバ200a・・・nとして参照される。トランザクション・サーバ200a〜c、200d〜fのグループは、それぞれの共有ディスク(shared disks)6と関連付けられている。
【0025】
トランザクション処理システム2内のメッセージは、例えば、トランザクション処理システム2における特定の出来事を列挙する(detailing)イベントや特定の操作を実行するためのコマンドを含むことができる。例えば、コマンド・メッセージは、ユーザの賭け可能なアカウントバランス(available-to-bet account balance)を見るための要求でありうるし、イベント・メッセージは、ユーザに対して、彼らの賭けの提出が成功したことを報告するメッセージでありうる。
【0026】
高いトランザクション速度を達成するために、分散されたシステムにおける各サーバ200は、ある程度のデータ局所性(data locality)を有しており、リモートのシステムあるいはディスクへのネットワーク呼(network calls)に関連するオーバヘッドを防いでいる。これは、ユーザ・アカウントによる、そして賭けマーケット(betting market)による、トランザクション処理システム2の区分け(partitioning)により達成される。単一のユーザ・アカウントに関連する全ての情報は、単一のサーバに格納され、単一の賭けマーケットに関する全ての情報は、単一のサーバに格納される。このことは、ネットワーク中におけるハードディスクなどの不揮発ストレージやリモートのサーバへのネットワーク呼を個別のサーバが作る必要性を減少させる。このようにして、トランザクション処理システムにおける待ち時間(latencies)が減少し、そして、トランザクションのスループットは向上する。可能であれば、データは、ローカルのメモリあるいは、少なくとも、少ない待ち時間のメモリに格納され、このようにして、例えばネットワーク化されたハードディスクのように待ち時間が多いリソースにアクセスする必要を減らす。
【0027】
図4は、賭けトランザクションを処理するためのトランザクション処理システム2で使われるアカウント10の組とマーケット11の組とを表している。賭けは、ユーザに向けて表示された値付けスクリーン(pricing screens)を通して許可される。賭けの提起を望むユーザには、ユーザ・アカウント10が割り当てられる。このユーザ・アカウントには、彼らは、例えばインターネットに基づく安全な現金支払いシステムを介して、お金を提供(deposit)することができる。トランザクション処理システム2は、それぞれのユーザアカウント10に、それ自体に固有のIDを割り当てる。
【0028】
ユーザは、表示された掛け率(odds)に対して彼らが賭けを提起する複数の賭けマーケット(betting markets)11へのアクセスを持つ。賭けマーケット11は、例えば、フットボールの試合や競馬などのスポーツ・イベントの結果を含むことができる。前記したユーザ・アカウント10により、トランザクション処理システム2は、それぞれの賭け市場11に、それに固有のIDを割り当てる。
【0029】
ユーザ・アカウント10のグループ12は、それぞれのアカウント・コントローラ・アプリケーション13により制御される。ある特定グループのユーザ・アカウント12のためのアカウント・コントローラ13は、ユーザ・アカウントに関連する情報をメモリ202内のグループに格納するサーバ200上で動作する。単一のアカウントに関する、及び、あるアカウント・コントローラに関するアカウントのグループに関する全ての情報は、単一のサーバに格納され、あるいはこれにより所有される。それぞれのアカウント・コントローラ13は、割り当てられたユーザ・アカウント10ついての要求を提供することについて、及び、全てのアカウントの中枢的な機能(all account centric functions)について、責任を持つ。
【0030】
例えば、もしユーザが、彼らのアカウント10についての操作の実行、例えば、賭けを提起すること、彼らの賭け可能なバランスをロードすること、彼らの現在の賭けの概要を見ること、あるいは、彼らの現在の損失見込み(current exposure)すなわち最も悪い事件シナリオにおいて、彼らの賭けからどの程度損失を被るかの計算を望む場合、その操作は、割り当てられたアカウント・コントローラ13によって提供される。この操作は、ユーザのアカウント10が配置される単一のサーバ200にアクセスすることによって提供される。例えば、図2を参照して、アカウント・コントローラについての別々のインスタンスは、サーバ200a〜cのぞれぞれの上で動作し、それぞれのサーバ上で保存されたアカウントを処理する。
【0031】
同様に、賭けマーケット11は、多数のマーケット・コントローラ・アプリケーション14によって制御される。ここで、それぞれのマーケット・コントローラ14は、賭けマーケット11のグループ15について責任を持つ。特定の賭けマーケット11のためのマーケット・コントローラ14は、前記したとおり、メモリ202中の前記賭けマーケット11に関する情報を格納するサーバ200上で動作する。単一のマーケットに関する、そして、マーケット・コントローラに関連するマーケットのグループに関する全ての情報は、単一のサーバ上に保存され、あるいは、所有される。マーケット・コントローラ14は、全てのマーケットの中枢的な機能(all market centric functions)を提供することに責任を持つ。これらの機能は、以下で説明されるような賭けのマッチングを含みうる。例えば、図2を再び参照して、マーケット・コントローラについての別々のインスタンスは、サーバ200d〜fのそれぞれの上で動作し、それぞれのサーバで記録されたマーケット情報を処理する。
【0032】
各サーバ400、200の上で同時に動作するスレッドの数は、最小に保たれる。このことは、高いトランザクション・レートの維持に役立つ。なぜなら、各サーバ400、200のプロセッサ401、201は、多数のスレッドの間で処理時間(processing time)を共有することを必要としないからである。トランザクション処理システム2により使用されるスレッド数(thread count)は、主に非同期メッセージの形態(predominately asynchronous messaging style)を用いることによって、低く保たれる。したがって、メッセージがトランザクション処理システム2に持ち込まれるたびに、処理のためのスレッドを割り当てるのではなく、受領されたメッセージは、到来キューに保持され、そして、処理される前に、スレッドが他の操作の後に利用可能になることを待たなければならない。本発明におけるスレッド管理の態様は、以下においてさらに詳しく記述される。
【0033】
本発明によるトランザクション処理システム2は、次のようなアーキテクチャを用いる。すなわち、ここでは、このシステムは、メッセージのキューにより接続された処理ステージについてのパイプラインに分割される。一般的に、あるステージは、到来イベント(inbound events)のためのソース・キューと、イベントを処理するためのイベント・ハンドラと、ステージのコンポーネントを監視し、そして、ヒューリステックス(heuristics)の処理を、ステージをホスト(host)するスレッド・マネージャに提供するためのリソース・コントローラの組と、送出キューあるいはシンク(outbound queues or sinks)の組とを備える。この、ステージに基づくアーキテクチャは、図5〜10に関連して、以下においてさらに記述される。
【0034】
リソース・コントローラは、バッチング・リソース・コントローラ・モジュール(batching resource controller modules)を含む。このモジュールの機能は、待ち時間及びスループット・ターゲットを、あるものと他のものと引き替えることにより、満たすことである。待ち時間は、それぞれのステージの相互作用の間に処理されるメッセージのバッチ・サイズを低くすることにより、スループットに悪影響を与えるけれども、改善されうる。スループットは、メッセージのバッチ・サイズを大きくすることにより、改善されうる。バッチング・リソース・コントローラは、各ステージの相互作用に要する時間(待ち時間)と、毎秒に処理されるメッセージの数(スループット)とを監視し、そして、これに従って、到来メッセージ・キューのバッチ・サイズを調整する。
【0035】
バッチング・リソース・コントローラは、到来バッチ・サイズを制御するために、本システム中の全てのステージに適用される。
【0036】
バッチング・リソース・コントローラによって提供されるバッチング(batching)に加えて、メッセージは、操作されるデータに従ってバッチングされる。各ステージは、メッセージが一緒になるようにグループ化することによって、内部的にバッチングされる。例えば、後に詳述されるブッカ・ステージ(Booker stage)は、そのメッセージが関連するアカウントに従って、メッセージをバッチングする。同じアカウント上であるいは同じマーケットで動く多数のメッセージを処理することは、各メッセージを個別に処理することに比べて、速くなりうる。
【0037】
GB2356071Aに記載されているように、賭けの提出を望むユーザは、特定の結果が「バックする(back)」か、あるいは「レイする(lay)」、すなわち、結果が起きない方に賭けるかを選ぶことができる。特定の結果をバックする、及びレイすることへの賭けは、その後に、お互いにおけるマッチングが図られる。対向する賭けをこのようにマッチングすることにより、トランザクション処理システム2は、従来のブックメーカに対してではなく、ユーザがお互いに対して賭けることを可能にしている。このことは、賭ける人にとって、より柔軟なアプローチであり、これは、彼又は彼女が、賭けの対象にしたい的確な用語(例えば、掛け率、最大の金額)をセットできるからである。一旦提起されると、ユーザの賭けは、まだマッチしていない賭けのプールに配置される。このプールは、関連するマーケット・コントローラ14が配置されるサーバ200のメモリ201内に保存されうる。トランザクション処理システム2は、プールを探し、対向する組み合わせ(opposing match)を見つける。もし、マッチが得られなければ、すなわち、他のユーザが、ユーザによって提案された条件に対してマッチされうる賭けを提起していない場合は、その賭けは、アンマッチのプールに残される。トランザクション処理システム2における賭けマッチング(bet-matching)の手順は、以下においてさらに詳しく説明される。
【0038】
あるユーザが、賭けマーケット11についての特定の結果を「バックする」あるいは「レイする」ことを決定したときは、ユーザの賭けを記述するクライアント・インタフェース・サーバ400においてメッセージが受領される。このクライアント・インタフェース・サーバ400は、PlaceBetRequestメッセージとして参照されるメッセージを生成し、かつトランザクション処理システム2に送り込む。このメッセージは、ユーザが他の賭け者に提示したい条件の記述を与える。前記のPlaceBetRequestメッセージは、その賭けが提示されるマーケット、その賭けが特定の結果を「バックする」あるいは「レイする」ためのものかどうか、ユーザが賭けたい金額、及びユーザが賭けたい掛け率を特定する。トランザクション処理システム2は、PlaceBetRequestメッセージを処理するように、そして、好ましくは、それを、他のユーザにより提起された対向するPlaceBetRequestメッセージとマッチさせるように構成される。例えば特定の結果をバックすることを望む第1ユーザのPlaceBetRequestメッセージは、同じ結果がレイすることを望む第2ユーザのPlaceBetRequestメッセージとマッチされうる。
【0039】
このプロセスは、図5〜10に関連して、第1及び第2のユーザにより出された二つの対向するPlaceBetRequestメッセージの、トランザクション処理システム2を通過する流れを図示することにより、以下においてさらに詳しく説明される。
【0040】
このプロセスは、ディレクタ31、アカウント・コントローラ41、61及びマーケット・コントローラ51としてここで参照されるいくつかのソフトウエア・モジュールに関連して記述される。アカウント・コントローラ41、61及びマーケット・コントローラ51は、図4に示されるアカウント・コントローラ・モジュール13及びマーケット・コントローラ・モジュール14の特定のインスタンスである。
【0041】
図5は、アカウント及びマーケット・コントローラの両者のために適用される一般的な構成を表しており、これらは、基本的なトランザクション処理アプリケーションである。これらのアプリケーションは、異なるロジックを含み、そして、異なる責任をもつけれども、それらは、共通のアプローチを共有し、トランザクションを処理する。
【0042】
この構成は、レシーバ・スレッド・マネージャ・モジュール(レシーバ・スレッド・マネージャ)112の制御の下で動作するレシーバ・モジュール(レシーバ)110と、スケジュールド・スレッド・マネージャ117の制御の下で動作するアクノリッジャ・モジュール(アクノリッジャ)115と、ジャーナラ・モジュール(ジャーナラ)120と、単一のスレッド・マネージャ・モジュール(単一スレッド・マネージャ)122の制御の下で動作するプリプロセッサ・モジュール(プリプロセッサ)125と、データ・パーティション130と、パーティション・スレッド・マネージャ・モジュール(パーティション・スレッド・マネージャ)145の下で動作し、かつ、区分けされた読み取り段階140及び区分けされた書き込み段階150を備える区分けされたメッセージ・ハンドラ140、150と、スケジュールド・スレッド・マネージャ・モジュール(スケジュールド・スレッド・マネージャ)162の下で動作するリセンダ・モジュール(リセンダ)160と、単一スレッド・マネージャ122の下でやはり動作するディスパッチャ・モジュール(ディスパッチャ)170とを備えている。
【0043】
レシーバ110は、ネットワークからのメッセージを読み、そしてそれらをデシリアライズ(deserialize)するように構成されている。レシーバ・スレッド・マネージャ112は、到来するネットワーク・イベントを待ち、そして、既定のバッチを構成するために十分なネットワーク・データが到着したときにレシーバ110を呼ぶ。レシーバ110は、メッセージの重複排除(de-duplicating)に責任を持つ。換言すると、これは、既に見たことがあるメッセージは廃棄するということである。重複排除の必要性は、後述するように、リセンダ160の機能から生じる。結果としてデシリアライズされたメッセージは、ジャーナラ120に送られる。シリアライズ(serialise)された形態のメッセージは、保持され、そして、ジャーナラ120に送られる。
【0044】
ジャーナラ120は、サーバのハードディスク403又は共有ディスク6に格納されたログにメッセージを書き込むことに責任を持つ。メッセージのロギング(logging)は、失敗の場合に、ログが再生され、そして、失敗時のメモリの状態を復活できることを意味する。メッセージは、それらが処理されるのと同じ順序で再生される必要があり、これにより、確定的なリカバリを保証できる。これを達成するために、各メッセージは、ジャーナラ120によって一連の番号を割り当てられ、これにより、ディスパッチャに到着するメッセージは、それらがジャーナラに到着した順序に従って、再び整列(reordered)されうる。
【0045】
プリプロセッサ125は、処理を区分する前に、グローバル・メッセージを単一のスレッド上で処理することによって、リカバリ・プロセスを支援する。このことは以下においてさらに説明される。もし、一つより多いジャーナラ120が使用されているならば、プリプロセッサ125は、複数のジャーナル・メッセージ・ストリームが合体して単一のシリアル・ストリームに戻る単一のポイントを提供する。プリプロセッサは、さらに、区分された全てのステージに影響する「システム・オンライン」や「システム・オフライン」のようなシリアル・メッセージを処理する。
【0046】
ジャーナラ120は、プリプロセッサ125及びディスパッチャ170と同様に、単一スレッド・マネージャ122の下で動作する。このスレッド・マネージャは、到来キューに到着するための、バッチを形成する既定数のメッセージを待ち、その後、適切なステージを実施させる。ステージは、連続的にのみ実施され、そして、このスレッド・マネージャは、ある一時点において動作するステージについての単一のインスタンスが存在する時のみに適用される。
【0047】
ジャーナラ120は、プリプロセッサ125を介して、区分けされた書き込み段階150にメッセージを送る。
【0048】
区分けされた書き込み段階は、トランザクションのステージを扱い、そして、データ・パーティション130内のデータについて動作する。アカウント・コントローラの場合は、データ・パーティションは、アカウント10を代表する。マーケット・コントローラの場合には、データ・パーティションは、マーケット11を代表する。区分された書き込み段階は、読み取り/書き込みアプリケーション・ビジネス・ロジックを含む。例えば、図6に示されるエクスポーザ(Exposer)44あるいはブッカ(Booker)45は、アカウント・コントローラ・モジュールのために区分された書き込みステージであり、図6に示されるマッチャ(Matcher)54は、マーケット・コントローラ・モジュールのための区分された書き込みステージである。
【0049】
アカウント・コントローラ・モジュールのための他の区分された書き込みステージは、アカウント・クリエータ、アカウント・エディタ及びアカウント・デリータと、さらには賭けデリータとを含む。例えば、アカウント・クリエータは、「アカウントを作る」メッセージを受け付けて、そして、新しいアカウントを、アカウント・データ・ストラクチャの中に格納する。マーケット・コントローラに関連して、他の区分された書き込みステージは、マーケット・クリエータ、マーケット・エディタ、及びマーケット・デリータを含む。例えば、マーケット・クリエータは、「マーケットを作る」メッセージを受け付けて、そして、新しいマーケットを、マーケット・データ・ストラクチャ中に格納する。
【0050】
パーティション・スレッド・マネージャ145は、区分された書き込みステージへのスレッドの割り当てを管理して、一つのアカウントあるいはマーケットあたりに割り当てられた最大のスレッドが一つであることを保証する。それは、並行性に確実性を付与することができる。つまり、このシステムは、スレッドとプロセッサにわたって規模を変化させることができる。一方で、失敗の場合における確実な応答(deterministic reply)とは、このシステムが、常に、失敗の前の状態に戻ることを意味する。
【0051】
例えば、あるメッセージが、データAについての読み取り/書き込み操作を実行するためのステージ150a、b、cのうちの一つに到着すると、そのステージは、実行のためのスレッドをスレッド・プールから取得し、そして、当該データAを、そのスレッドにおいて処理する。書き込みステージがデータAについて操作していても、他のステージは、同じデータAについて操作することが可能であり、それにより、変更が互いに区別され、そして、分散されたロック(distributed locks)は存在しない。データAについての操作を実行するために到来したメッセージは、データAについてのスレッド操作が解除されるまで、待ち行列に入れられる(queued)。区分された書き込みステージ150a、b、cは、しかしながら、実行についての並行スレッドを用いて、他のデータについて動作することができる。これにより、同じ、あるいは異なる書き込みステージは、データA及びCを、データAと並行に操作することができる。
【0052】
区分された読み取りステージ140は、レシーバ110からのメッセージを受け取るものであり、そして、リード・オンリー・アプリケーション・ビジネス・ロジックを含む。この場合、データ区分は、それらが区分された書き込みステージによって操作されていない限り、複数の読み取りステージによって操作されうる。例えば、パーティション・スレッド・マネージャは、もし書き込みステージがデータAについて操作中であれば、データAのための読み取り又は書き込み要求を待ち行列に入れる。しかしながら、もし読み取りステージがデータAについて操作中であれば、さらなる読み取り要求は、データAについての操作のために、スレッドを割り当てられる。同様に、受け取った書き込み要求は、現在の読み取り要求が完了するまで、待ち行列に入れられる。
【0053】
区分された読み取りステージの例は、「ロード・アカウント(load account)」メッセージを受け付け、そして、「アカウント・ローデッド(account loaded)」メッセージを、アカウント・データ構造(account data structure)からロードされたアカウントと共に返すアカウント・ローダと、マーケットのための対応する機能を実行するマーケット・ローダとを含む。
【0054】
リセンダ160は、区分された書き込みステージ150からメッセージを受け取る。リセンダの目的は、停止が命ぜられるまで、繰り返してメッセージをネットワークに発信することであり、これにより、下記により詳しく説明するように、メッセージを確実に引き渡すことができる。これは、失敗の場合に利点を有する。なぜなら、例えばサーバの交換によってこの失敗が修正されるまで、メッセージは、失われずに、待ち行列の中で蓄積されるからである。このメッセージは、処理されるまで持続する。リセンダは、スケジュールド・スレッド・マネージャ162の制御の下で動作する。このスレッド・マネージャは、その到来キューからメッセージをデキュー(dequeuing)する前に、ある程度の時間の経過を待つ。
【0055】
ディスパッチャ170は、リセンダ160及び区分された読み取りステージ140からメッセージを受け取る。これは、アクノリッジャ115からのメッセージの場合と同じである。これらの機能については以下において説明する。それは、メッセージをシリアライズし、そして、ネットワークにそれらを書き込む。
【0056】
ジャーナラは、失敗のイベントにおける応答のために、イベントのリドゥー・ログ(redo log)を保持しているけれども、チェックポインティング(check-pointing)が、状態を不揮発性ストレージに送る(flushing)ことにより、追加的に実行される。チェック・ポインティングは、定期的な掃除(cleaned down)をジャーナルに許可し、そして、回復時間が過大にならないために要求されるものである。失敗の場合は、状態は、最後のチェックポイントから再生されうる。
【0057】
前記したモジュールのいずれかによって実行される操作は、並列に進行することができ、そして、レシーバから受け取ったメッセージをジャーナラが処理するのと同時に、そして、以前に受け取ったメッセージのシリアライジングをディスパッチャが行うと同時に、レシーバは、メッセージの読み取りとデシリアライジング(deserialising)とを行う。
【0058】
サーバ間における保証されたメッセージ引き渡し(guaranteed message delivery)を提供するために使われるプロセスが、図6a〜cに表示されている。例えば、図6aに示される正常な動作では、サーバAのディスパッチャ170は、送信カウンタに従って、メッセージ・シーケンス値を設定する。例えば、シーケンス値を「1」に設定する。そして、このディスパッチャは、メッセージをサーバBのレシーバ110に送り、(ステップs100)そして、メッセージが再送信される必要があれば、それをバッファに保存する(ステップs101)。受け取りに際して、サーバBのレシーバ110は、受け取りカウンタをインクリメントする(ステップs102)。サーバAは、第2のメッセージ2をサーバBに送り(ステップs103)、そして、メッセージを保存する(ステップs104)。受け取りに際して、サーバBは、その受け取りカウンタをインクリメントする(ステップs105)。サーバBにおけるアクノリッジャ115は、受け取り確認されないメッセージを定期的に取り出すことを実行し、そして、受け取り確認メッセージであるACKをメッセージのために生成する。そして、この例では、アクノリッジャ115は、第1のメッセージのために、サーバAに(ディスパッチャ170を介して)ACKメッセージを送る(ステップs106)。サーバAは、メッセージ1及び2を、そのバッファからクリアし、そして、送信カウンタを、2の値にインクリメントする。次の送信については、ディスパッチャは、次のシーケンス番号、このケースであれば値「3」を、メッセージに割り当てる。
【0059】
メッセージを失った場合が図6bに表されている。再び、サーバAのディスパッチャ170は、シーケンス番号1を有するメッセージを、サーバBのレシーバ110に送り(ステップs110)、そして、メッセージが再送信されるべきものであれば、そのメッセージをバッファに保存する(ステップs111)しかしながら、メッセージは、送信中に失われる。すると、サーバAは、メッセージ2をサーバBに送り(ステップs112)、そして、メッセージを保存する(ステップs113)。メッセージが受領された後、サーバBは、その受け取りカウンタが零に設定されていることに気づくが、その一方で、メッセージ番号は2である。したがって、レシーバは、「受け取っていない」NACKメッセージを生成する。このメッセージは、ディスパッチャによって、カウンタ「0」を含むサーバAに戻すように送信される(ステップs114)。サーバAのリセンダ160は、NACKメッセージに応答して、0より大きいカウンタを備える全てのメッセージを再送信する。このことは図6aに示されている(ステップs115)。
【0060】
図6cは、重複排除(de-duplication)のプロセスを表す。第1及び第2のメッセージは、図6aのステップs100〜s105に示されているように、成功のうちに送信されている(ステップs120〜s125)。その結果、サーバBの受け取りカウンタは、「2」に設定されている。そして、サーバBのアクノリッジャ115は、確認メッセージACKを生成し、それを(ディスパッチャ170を介して)サーバAに送る(ステップs126)。しかしながら、このメッセージは、移送中に失われた。タイムアウト期間内にACKメッセージを受け取らない場合は、サーバAは、メッセージ1を再送信する(ステップs127)。サーバBは、このメッセージを受け取る。しかしながら、その受け取りカウンタは2であり、それは、それがこのメッセージを既に受け取っていることを認識し、それを廃棄する(ステップs128)。同様のプロセスがメッセージ2について発生する(ステップs129、s130)。サーバBは、カウンタ2を含むACKメッセージを送り(ステップs132)、サーバAは、そのバッファをクリアし、そして、その送信カウンタを2に設定する(ステップs132)。それから、このプロセスは、図6aに示されるように続く。
【0061】
図7は、賭け要求メッセージ(bet request message)を処理するために相互作用する様々なモジュールの間の相互関係を表示する。以下に、より詳しく説明されるように、これらのモジュールは、異なるサーバ上で動作する。以下の説明から明らかなように、トランザクションは、クライアントとサーバとの間での接続が設定され、そして、通信が、それらの間において、あちこちで通過するようなクライアント−サーバ・モデルを使っては処理されていない。代わりに、クライアントは、第1のノードあるいはサーバにメッセージを渡す。もしさらなる処理が要求されていれば、第1のサーバは、そのメッセージを第2のサーバに取り次ぎ、そして、第3のサーバにと、順次取り次ぐ。これは、要求されたトランザクションに関係するメッセージがクライアントに戻されるまで行われる。
【0062】
例えば、アカウント・コントローラ・インスタンスを実行するサーバのようなモジュールが失敗する場合、メッセージは失われないが、しかし、この欠陥が、例えばサーバの交換により修正されるまで、メッセージはキューの中に蓄積される。
【0063】
図7及び8を参照して、第1のユーザが賭けの提起を望むときには、第1の「PlaceBetRequest」メッセージが、ここではイニシエータとして参照されるソフトウエア・モジュール21により生成される(ステップs1)。この「PlaceBetRequest」メッセージは、ユーザのユーザ・アカウントのID、賭けを提起したいマーケットのID、ユーザが賭けをし、「バック」または「レイ」のいずれを望むかについての結果のID、賭けをしたい金額、そして彼らが賭けをしたい掛け率のようなデータを含む。
【0064】
図8を参照して、イニシエータ21は、例えばJ2EEアプリケーション・サーバのようなアプリケーション・サーバ400aの上で動く。それは、クライアント・インタフェース・サーバとして動作するサーバ400のクラスタ内の一つであ。このクライアント・インタフェース・サーバ400のクラスタは、賭け要求をトランザクション処理システム2に投入することについて責任を持つ。クライアント・インタフェース・サーバ400のクラスタは、例えばユーザの賭け可能なバランスをロードする要求やユーザの現在有効な賭けを見る要求のような、賭けシステムに関連する他の要求及びメッセージを投入することにも責任を持つ。
【0065】
生成された「PlaceBetRequest」メッセージが、イニシエータ21により作られた他のメッセージあるいは要求と共に到来キューに置かれ、そして、ここでエグゼクティブ(Executive)として参照されるソフトウエア・モジュールに向けられる。ここで、このモジュールは、イニシエータ21と同じクライアント・インタフェース・サーバ400a上で動作する。これらのステージの第1は、エグゼキュータ23として参照される処理ステージであり、これは、「PlaceBetRequest」によって実施される。エグゼクティブ22は、レシーバ24として参照される処理ステージと、ディスパッチャ25として参照される処理ステージとをさらに備える。エグゼキュータ23は、バッチ中の到来メッセージ・キューからメッセージをデキュー(dequeue)し、そして、スレッド・マネージャ・アプリケーション(図示せず)によって割り当てられたスレッドについてのメッセージを処理するように構成されている。スレッド・マネージャは、トランザクション処理サーバ200の一つに配置されうる。スレッドが割り当てられる方法は、図5を参照しながら、上記において既に説明された。
【0066】
トランザクション処理システム2における、非同期要求の処理についての詳しい記述が以下において提供される。
【0067】
「PlaceBetRequest」メッセージは非同期要求である。非同期要求を使うことは、エグゼクティブ22のエグゼキュータ23からの確認メッセージを、計画された操作を再開する前に、イニシエータ21が待つ必要がないことを意味する。非同期メッセージングは、以下で説明されかつ、図7〜11に示されるトランザクション処理システム2の全てのステージで使用されうる。
【0068】
「PlaceBetRequest」メッセージを含むメッセージのバッチ中におけるメッセージの数は、前記で言及したバッチング・リソース・コントローラ(BRC)としてここで参照されるソフトウエア・モジュールにより制御される。
【0069】
図7を参照して、受け取られた「PlaceBetRequest」メッセージは、エグゼキュータ23によってディスパッチャ25に送られる(ステップs2)。エグゼキュータ23がこれを行うのは、ディスパッチャ25の到来キューの中の「PlaceBetRequest」メッセージを、ディスパッチャ25に向けられた他の要求あるいはメッセージと共にエンキューすること(enqueueing)によってである。これらの他の要求あるいはメッセージは、イニシエータ21から発することもできる。「PlaceBetRequest」メッセージが非同期要求であるために、エグゼキュータ23は、その動作を続けることができる。それは、ディスパッチャ25からの確認メッセージを待つ必要はない。
【0070】
ディスパッチャ25は、到来キューからのメッセージのバッチ中における「PlaceBetRequest」メッセージをデキューする。バッチのサイズは、ここでバッチング・リソース・コントローラ(Batching Resource Controller)25aとして参照されるコントローラ・モジュール25aにより決定され及び表示される。このモジュールは、ディスパッチャ25と関連付けられている。このコントローラ・モジュールは、ディスパッチャ25の動作を監視し、そして、それぞれのメッセージ・バッチ中で処理される要求及びメッセージの数を調整するように構成されている。このことは、バッチング・リソース・コントローラ(Batching Resource Controller)23aに関連して、上記において説明した。バッチ中のメッセージ及び要求のデキューイングは、ディスパッチャ25(及びトランザクション処理システム2における他の全てのステージ)がメッセージのスループットを最大化することを可能にする。なぜなら、バッチ中の多数の要求とメッセージの処理が、キャッシュの局在化(cache locality)とタスクの集中(task aggregation)を可能にするからである。しかしながら、上に述べたように、もしバッチング・ファクタ(batching factor)が大きすぎるならば、ユーザのための応答時間(ユーザは、彼らの賭け要求に対する応答を待っている)は、非常に長くなる。
【0071】
トランザクション処理システム2における全てのバッチング・リソース・コントローラは、同様に動作する。しかしながら、バッチングは、到着したステージに応じて、異なる基準に基づいて実行されることもできる。例えば、レシーバ・ステージでは、バッチングは、ネットワークの待ち時間に基づくことができる。また、ジャーナラにおいては、それは、ディスクの待ち時間に基づくことができる。一方、エクスポーザでは、それは、アカウント毎の要求の数に基づくことができる。この例では、個別のバッチング・リソース・コントローラが各ステージと関連付けられている。しかしながら、他の形態では、単一のバッチング・リソース・コントローラが各サーバについて存在し、このコントローラは、そのサーバについての全てのバッチング動作の制御に責任を持つ。バッチング・リソース・コントローラは、この実施形態における各ステージと関連するので、明瞭化のために示されていない。以下の説明では、用語「送信する」(forwarding)及び「受信する」(receiving)という用語を用いて動作が説明されるけれども、理解されるべきこととして、これらの動作は、キューイング及びバッチ・コントロールを含む。
【0072】
ディスパッチャ25によりデキューされたメッセージは、それらがバッチにおいて処理されるように、グループに分割される。「PlaceBetRequest」メッセージは、イニシエータ21に「PlaceBetRequest」メッセージを生成させたユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ41に向けられた他のメッセージと共に、バッチにまとめられる。バッチに割り当てられた他のメッセージは、他の「PlaceBetRequest」メッセージ、ユーザの賭け可能なバランスを見るためのリクエストなどを、既に説明したように、含みうる。
【0073】
このステージでは、エグゼクティブ22は、図4に示されるアカウント・コントローラ13のうちのどれがユーザのユーザ・アカウント10に割り当てられるかを知らず、そして、このため、「PlaceBetRequest」メッセージをどこに向けて発送すべきか知らない。ディスパッチャ25は、したがって、正しいアカウント・コントローラ41を確かめるために、「LocateInstanceRequest」メッセージを生成する(ステップs3)。その間、「PlaceBetRequest」メッセージは、その後の送信のために、エグゼクティブ22に保存される。例えば、「PlaceBetRequest」メッセージは、クライアント・インタフェース・サーバ400aに配置されたメモリ402内に保存されうる。上で述べたように、「PlaceBetRequest」メッセージを含むバッチ中の全てのメッセージは、同じアカウント・コントローラ41に向けられ、そして、したがって、ただ一つの「LocateInstanceRequest」メッセージが、そのバッチのために、生成される必要がある。この「LocateInstanceRequest」メッセージは、ディレクタ31に向けられた他のメッセージ(例えば、他のユーザ・アカウントに関連する「LocateInstanceRequest」メッセージ)と共にキューにエンキューされる。
【0074】
ディレクタ31は、レシーバ・ステージ32、ロケータ・ステージ33及びディスパッチャ・ステージ34とを備えている。それはさらに、他のモジュールの場合と同様にジャーナラ(図示せず)を備えているが、これは明瞭さのために省略されている。図8を参照して、ディレクタ31は、サーバ200g上で動くことができ、そのサーバは、トランザクション処理サーバ200のクラスタの一つである。レシーバ32は、メッセージのバッチ中の「LocateInstanceRequest」メッセージをデキューする。
【0075】
レシーバ32は、キューの中の「LocateInstanceRequest」メッセージを、ロケータ33に向けられた他のメッセージと共に、エンキューする(ステップs4)。それから、ロケータ33は、メッセージのバッチ中におけるこのキューからの「LocateInstanceRequest」メッセージを、例えば他の「LocateInstanceRequest」メッセージと共に、バッチング・リソース・コントローラ33aの制御の下で、デキューする。ロケータ33は、ディレクタ31が配置されたサーバ200gのメモリ202に記録されたリストからの「LocateInstanceRequest」メッセージにおいて特定されたユーザ・アカウントに割り当てられたアカウント・コントローラ41のアドレスをルックアップするように、構成される。そして、ロケータ33は、割り当てられたアカウント・コントローラ41のアドレス情報を含む「LocateInstanceReply」メッセージを作り出し(ステップs5)、そして、そのメッセージを、ディレクタ31のディスパッチャ・ステージ34に向けられた他のメッセージと共にエンキューする。
【0076】
「LocateInstanceReply」メッセージは、ディスパッチャ34によりデキューされ、そして、エグゼクティブ22のレシーバ24に向けられた他のメッセージと一緒に、キューにエンキューされる(ステップs6)。レシーバ24によって一旦デキューされると、「LocateInstanceReply」メッセージは、ディスパッチャ25の到来キューに送られる(ステップs7)。
【0077】
このステージでは、保留されている「LocateInstanceReply」メッセージの起因となった「PlaceBetRequest」メッセージは、クライアント・インタフェース・サーバ400aのメモリ401から引き出され、そして、「LocateInstanceReply」メッセージで特定されたアカウント・コントローラ41に送られる。アカウント・コントローラ41のアドレスは、さらなるルックアップを避けるために、エグゼクティブ22によりキャッシュされる。アカウント・コントローラは、トランザクション処理サーバ200の一つであるサーバ200a上で動作することができる。サーバ200aは、ユーザのユーザ・アカウントに関連する全てのデータが保存されるサーバである。
【0078】
エグゼクティブ22及びディレクタ31と同様に、アカウント・コントローラ41は、レシーバ・ステージ42及びディスパッチャ・ステージ46を備える。アカウント・コントローラ41は、さらに、ジャーナラ・ステージ43と、エクスポーザ・ステージ(Exposer stage)44と、そして、ブッカ・ステージ(Booker stage)45とを備える。「PlaceBetRequest」メッセージは、レシーバ42によって受け取られ(ステップs8)、そして、ジャーナラ43の到来キューに向けて送られる(ステップs9)。
【0079】
アカウント・コントローラ41の処理ステージは、エグゼクティブ22及びディレクタ31のステージに関連して上に記載したものと同様に動作する。メッセージは、メッセージの到来キューからデキューされる。到来キューにおけるメッセージは、先行する処理ステージによって、そこに配置されている。さらに、メッセージは、処理されて、そして、次のステージの到来キューに配置されるか、あるいは、次のステージの到来キューに配置される新しいメッセージを作り出すために使われる。これらのプロセスは、エンキューイングあるいはデキューイングとしてここで一般的に言及される。
【0080】
ジャーナラ43において、「PlaceBetRequest」メッセージは、例えば共有ハードディスク6において保存されうる不揮発ログに追記される。あるいは、それは、各サーバ200内のハードディスク203に保存されうる。これにより、各サーバ200におけるログに保存された情報を取り出す速度が向上する。もし必要なら、応答のために、「PlaceBetRequest」メッセージには、固有のシーケンス番号が、ログにおいて付与される。
【0081】
このようにして受領メッセージをジャーナリングすることは、次のことを意味する。すなわち、システム欠陥の場合には、トランザクション処理システム2は、確定的なポイント、すなわち、アカウント・コントローラ41のジャーナラ43によって受領メッセージが最後に記録されたステージに戻ることができる。「PlaceBetRequest」メッセージは、ジャーナラ43からエクスポーザ44に送信される(ステップs10)。
【0082】
エクスポーザ・ステージ44では、「PlaceBetRequest」は、賭け(bet)についての最大に可能な損失(exposure)を計算するために、処理される。これは、ユーザが特定の結果をバックあるいはレイしたときのユーザの最大の責任を決定する計算である。例えば、もし、賭けが、特定の結果を、2/1の掛け率(3のデジタル掛け率)で、5ポンドの掛け金において、「バックする」ことであれば、ユーザは、もし彼らが賭けに負ければ、5ポンドを失うことになる。しかしながら、もし、賭けが、特定の結果を、2/1の掛け率で、最大5ポンドの賭けで「レイする」ことであれば、ユーザは、もし賭けに負ければ、10ポンドを失うことになる。
【0083】
損失の計算は、エクスポーザ44によって実行され、そして、バッチにおいて処理される。したがって、もし、特定のユーザ・アカウントのために複数の「PlaceBetRequest」メッセージがあれば、全ての賭けの損失は、単一の操作で計算される。
【0084】
エクスポーザ・ステージ44は、ユーザのユーザ・アカウントにおける賭け可能なバランスに対して計算された損失をチェックする。もし、ユーザ・アカウントが、ユーザの有効な賭けについての損失をまかなうに十分な金額を含むのであれば、エクスポーザ44は、「MatchBetRequest」メッセージを作り出し、そして、この「MatchBetRequest」メッセージをディスパッチャ46に送り出す(ステップs11)。もし、ユーザ・アカウントが、賭けの損失をまかなうに十分な金額を含まないのであれば、メッセージは、エグゼクティブ22及びイニシエータ21を介してユーザに戻され、これによって、ユーザは、利用できる資金が不十分であることを知らされる。
【0085】
ディスパッチャ46におけるプロセスは、エグゼクティブ22のディスパッチャ24を参照して前記したそれに類似している。アカウント・コントローラ41は、どのマーケット・コントローラ14が、「MatchBetRequest」により特定された賭けマーケット11に割り当てられたかを知らない。ディスパッチャ46は、したがって、「LocateInstanceRequest」メッセージを生成し、そして、ディレクタ31にそれを送る(ステップs12)。これは、メッセージをロケータ33に送るものである(ステップs13)。ロケータ33は、割り当てられたマーケット・コントローラ51をリストからルックアップする。その方法は、アカウント・コントローラ41のルックアップに関連して前記したところと同様である。その間、「MatchBetRequest」メッセージは、アカウント・コントローラ41中に、その後の送信のために保存される。「MatchBetRequest」は、例えば、アカウント・コントローラ41が配置されるサーバ200に配置されたRAM202中に保存されうる。割り当てられたマーケット・コントローラ51は、ロケータ33により配置される。そしてそれは、「LocateInstanceReply」メッセージをディスパッチャ34に送る(ステップs14)。マーケット・コントローラ51のアドレスは、ディレクタ31のディスパッチャ34により生成された「LocateInstanceReply」メッセージ中のアカウント・コントローラ41のレシーバ42に送られる(ステップs15)。
【0086】
そして、「LocateInstanceReply」メッセージは、アカウント・コントローラ41のレシーバ42により、ディスパッチャ46に送られる(ステップs16)。このポイントでは、「LocateInstanceRequest」メッセージを誘起する、保留の「MatchBetRequest」は、サーバ200上のメモリ201から引き出され、そして、ディスパッチャ46により、正しいマーケット・コントローラ51に送付される(s17)。アカウント・コントローラ41の場合と同じように、マーケット・コントローラ51のアドレスは、エグゼクティブ22によりキャッシュされ、これにより、そのアドレスを再びルックアップする必要がないようにしている。
【0087】
図8に示されるように、マーケット・コントローラ51は、トランザクション処理サーバ200の一つであるサーバ200d上に配置され、そして、レシーバ・ステージ52、ジャーナラ・ステージ53、マッチャ・ステージ(Matcher stage)54、及びディスパッチャ・ステージ55を備える。マーケット・コントローラ51におけるこれらのステージは、メッセージのエンキュー及びデキューを行うものであり、これらは、エグゼクティブ22、ディレクタ31,及びアカウント・コントローラ41に関連して説明したところと同様である。「MatchBetRequest」メッセージは、レシーバ52により受け取られ、そして、ジャーナラ53に送られる(ステップs18)。ジャーナラ53においては、「MatchBetRequest」メッセージは、例えばハードディスクに保存された不揮発性ログに追記される。このことは、アカウント・コントローラ41のジャーナラ43における「PlaceBetRequest」メッセージのロギングに関連して説明したところと同様である。既に説明したように、不揮発性ログは、例えば、マーケット・コントローラ51が配置されるサーバ200d上や、あるいは、共有ディスク6や、あるいは、マーケット・コントローラ51にネットワーク接続経由で接続された他のディスクに保存されてもよい。「MatchBetRequest」メッセージは、それから、マッチャ54に送られる(ステップs19)。
【0088】
マッチャ54においては、「MatchBetRequest」メッセージは、マッチャ54を、賭けマーケット3に既に提起されていたマッチしていない賭け(unmatched bets)のプールを通しての調査へのきっかけとさせる。マッチしていない賭けは、例えば、サーバ200dの一部であるメモリ202中に保存されうる。調査の目的は、「MatchBetRequest」メッセージにより提供された条件の賭けに対向する条件を提供する賭けを見つけることである。この例では、賭けプールは空であり、そのため、マッチできる賭けはみつからない。ユーザの賭けは、したがって、マッチしていない、未修整の(unmodified)賭けのプールに追加される。それから、マッチャ54は、その賭けのためのマッチング・プロセスに関する情報を記述する「MatchBetReply」メッセージを生成する。このケースでは、プールが空なので、「MatchBetReply」メッセージは、その賭けのために適用可能な一致(match)はないということを記述する。
【0089】
賭けのマッチングは、バッチにおいて実行される。もし、複数の「MatchBetRequests」が特定の賭けマーケット11について存在するときは、全ての「MatchBetRequests」のためのマッチング・プロセスは、単一の操作で実行される。
【0090】
「MatchBetReply」メッセージは、マッチャ54によりディスパッチャ55に送られ(ステップs20)、それは、今度は、そのメッセージを、アカウント・コントローラ41のレシーバ42に送る(ステップs21)。レシーバ42は、「MatchBetReply」メッセージをジャーナラ43に送り(ステップs22)、そこでは、「MatchBetReply」メッセージは、ブッカ45に送られる前に、不揮発性ログに付記される(ステップs23)。
【0091】
ブッカ45においては、「MatchBetReply」メッセージに含まれる情報は、例えば、ユーザの賭けの状態を、「未処理」(unprocessed)から「処理済み」(processed)にアップデートするために使われる。さらに、ブッカ45は、様々な一致情報を保存するように構成される。しかしながら、「MatchBetReply」メッセージの場合には、適切な「MatchBetRequests」が賭けプール内にないので、一致情報がない。ユーザの賭けの状態は、例えば、アカウント・コントローラ41を実行させるサーバ200aにおけるRAMのようなメモリ202内に保存されうる。ブッカ45は、「PlaceBetReply」メッセージを生成し、そして、それを、ディスパッチャ46に送る(ステップs24)。ディスパッチャ46からは、この「PlaceBetReply」が、エグゼクティブ22のエグゼキュータ23に、レシーバ24を介して送られる(ステップs25、s26)。
【0092】
このポイントでは、「PlaceBetReply」メッセージが、イニシエータ21の到来キューに置かれ、デキューを待つ(ステップs27)。そして、賭けを提起した結果は、イニシエータ21を介して、ユーザに返されうる。
【0093】
図9及び10を参照して、第2のユーザは、第1のユーザにより提起された賭けに対向して、ユーザ・ウエブサイトを介して、賭けを提起する。これは、第2の「PlaceBetRequest」メッセージを、エグゼクティブ22のエグゼキュータ23内に送り込ませる(ステップs1)。第2の「PlaceBetRequest」メッセージは、トランザクション処理システム2を通る経路を辿る。このことは、第1のユーザの賭けに関連する「PlaceBetRequest」メッセージの経路に関して説明したところと同様である。ステップs1〜s19は、前記したところと同様である。
【0094】
マーケット・コントローラ51内のマッチャ54に到達すると、第2のユーザの賭けに関連する「MatchBetRequest」メッセージは、マッチャ54が、RAM202中における一致しない賭けのプール中の「MatchBetRequest」メッセージに対する可能な一致を見つけるための調査の契機となる。これは、第1のユーザの賭けに関連する「MatchBetRequest」メッセージに関して既に説明したとおりである。ここでは、前記した調査が成功し、そして、第2のユーザの賭けに関連する「MatchBetRequest」が、第1のユーザの賭けに関連する第1の「MatchBetRequest」に一致している。
【0095】
その後、マッチャ54は、その一致に関係する情報を記述する「MatchBetReply」メッセージを生成し、そして、この「MatchBetReply」メッセージをディスパッチャ55に(ステップs20a)、そして、第2のユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ61のレシーバ62に送る(ステップs21a)。図11を参照して、アカウント・コントローラ61は、サーバ200b上に配置される。このサーバは、トランザクション処理システムを形成するサーバ200のネットワークの一つである。このサーバ200bは、第2のユーザのユーザ・アカウントに関連する全ての情報が、例えばRAM202内に保存されるサーバである。
【0096】
それから、「MatchBetReply」メッセージは、トランザクション処理システム2を、図9に示すようにして流れる。このことは、第1のユーザの賭けに関連する「MatchBetReply」メッセージの流れに関して説明したところに類似している。特に、「MatchBetReply」メッセージは、ジャーナラ63により不揮発性メモリ203内に保存され、そして、ブッカ65に送られる。これは、アカウント・コントローラ61内の第2の賭けの状態を「未処理」から「処理済み」にアップデートするものである。ブッカ65は、さらに、「MatchBetReply」メッセージに含まれる位置情報を保存し、そして、「PlaceBetReply」メッセージを構築する。このメッセージは、ディスパッチャ66並びにエグゼクティブ21のレシーバ23及びエグゼキュータ22を介して、イニシエータ21に送られる(ステップs24〜s27)。
【0097】
それから、「PlaceBetReply」は、クライアント・インタフェース・サーバ400a上のイニシエータ21を介して中継されて、ユーザのウエブページに戻される。これは、第1及び第2のユーザに、彼らの賭けを対向する賭けに一致させることに成功したという確認を提供する。
【0098】
前記した「MatchBetReply」メッセージを生成することに加えて、マッチャ54は、マーケット・コントローラ51のディスパッチャ55に送られる「MatchedBetEvent」メッセージを追加的に生成する(ステップs20b)。「MatchedBetEvent」メッセージは、第1のユーザのユーザ・アカウントに割り当てられたアカウント・コントローラ41に送られるべきものであり、これによって、それに対して、第1のユーザの賭けに関連する「PlaceBetRequest」メッセージが一致に成功したことを知らせることができる。しかしながら、このステージでは、マーケット・コントローラ51は、第1のユーザのユーザ・アカウントに関連するアカウント・コントローラ41のアドレスを知らない。「MatchedBetEvent」メッセージは、したがって、マーケット・コントローラ51において、例えば、サーバ200bのメモリ202内に保存され、そして、ディスパッチャ55は、ディレクタ31によりアクセスされるリストからアカウント・コントローラ41のアドレスをルックアップするために、「LocateInstanceRequest」メッセージを生成する(s21b)。このリストは、ディレクタ31が配置されたサーバ200gの一部として備えられたRAM202に保存されうる。
【0099】
「LocateInstanceRequest」メッセージは、レシーバ32により受け取られ、そして、アカウント・コントローラ41のアドレスをルックアップするために、ロケータ33に送られる(s22b)。ロケータ33は、アカウント・コントローラ41のアドレスを含む「LocateInstanceReply」メッセージを生成し、そして、それを、ディスパッチャ34を介して、レシーバ52に送る(ステップs23b、s24b)。マーケット・コントローラ51のレシーバ52は、それから、「LocateInstanceReply」メッセージをディスパッチャ55に送る(ステップs25b)。この段階では、保留中の「MatchedBetEvent」メッセージが、メモリ201から取り出され、アカウント・コントローラ41のレシーバ42に送られる(ステップs26b)。アカウント・コントローラ41のアドレスは、将来において再びそれをルックアップする必要を避けるために、マーケット・コントローラ51によりキャッシュされる。
【0100】
受け取られた「MatchedBetEvent」メッセージは、ジャーナラ43に送られ(ステップs27b)、そして、それは、前記したような方法で、固有の参照番号と共に不揮発性ストレージに付記される。「MatchedBetEvent」メッセージは、それから、ブッカ45に送られ(ステップs28b)そして、アカウント・コントローラ41についての賭けの状態をアップデートするために使われる。このデータは、アカウント・コントローラ41を実行するサーバ200aのRAM202内に保存されうる。
【0101】
この方法では、第1および第2のユーザにより提起された賭けは共に一致に成功している。
【0102】
トランザクションが処理されると、トランザクション処理システム内において保持されているデータは、速やかに変化する。新しいデータは、依頼者に通知される必要がある。例えば、マーケットの見込み(market view)は、ユーザのためにアップデートされる必要がある。これらの変更は、情報を必要とする依頼者に伝えられる。これは、依頼者の要求に応答することによってでなく、デルタ(deltas)として参照される現在のデータへの変更を依頼者にプッシュすることによる。
【0103】
前記した実施形態及びその変形例は、トランザクション処理システムによって提供される効果を達成するために、単独で、あるいは組み合わせて使用されうる。
【0104】
本発明に基づく前記したシステムは、トランザクション処理システムのACID原則に従う。これらは、トランザクションが以下の特性を持つ必要があるということである:
【0105】
原子性(Atomicity)。最小単位(atomic)のトランザクションは、全ての操作が成功するか又はしないかという、一連の操作である。もし、このような一連の操作が、完成の前に、あるポイントで失敗すると、その失敗の前に終了しているあらゆる操作は、ロールバックされる必要がある。本発明に基づくトランザクション処理システムでは、トランザクションは前もって知られており、そして、全ては不揮発性メモリに保存されている。従来のシステムと異なり、ロギングは、操作レベルというよりもむしろ、トランザクション・レベルで発生する。そのため、全ての完了した操作がログされるUNDOロギングの必要がない。そして、UNDOログは、不揮発性ストレージから、トランザクションが完了する前に書き込まれた変更を除去するために検査される。
【0106】
一例として、「賭けを提起する」(bet placement)トランザクションがログされる一方、その下にある一連の操作、例えば「古いエクスポージャを書き込む」、「新しいエクスポージャを書き込む」、「新しい賭けを書き込む」などはログされていない。
【0107】
トランザクションが補足され、実行が開始され、そして、トランザクションにおける全ての操作が完了する前に失敗がある場合は、その状態は捨てられ、そして、REDOログとしても知られるジャーナルは、状態を復元するために再生される。
【0108】
ログの再生による状態の復元を確実に成功させるために、これらのステージは、確定的(deterministic)とされる。例えば、賭けは、特定の注文において到着し、そしてログされる。以下を仮定する:
1.賭け1(10ポンド)
2.賭け2(15ポンド)
3.賭け3(20ポンド)
【0109】
確定的な手法で処理した後、単一の可能な状態は以下の通りである:
1.賭け1(10ポンドが賭け2とマッチ)
2.賭け2(10ポンドは賭け1とマッチ、5ポンドは掛け3とマッチ)
3.賭け3(5ポンドは掛け2とマッチ、15ポンドはマッチしない)
【0110】
明確なこととして、賭けマッチング・ステージは、非確定的であり、多数の状態が可能であり得る。例えば、賭け1と2とが処理される前に賭け3が処理されていたとすれば、可能な状態は以下の通りである:
1.賭け1(10ポンドが賭け3とマッチ)
2.賭け2(10ポンドは賭け3とマッチ、5ポンドはマッチしない)
3.賭け3(10ポンドは掛け1とマッチ、10ポンドは賭け2とマッチ)
【0111】
ログ応答は時間を消費するプロセスでありうるので、本発明におけるいくつかの形態は、例えばログ・テイリング(log tailing)のような利用性の高い機構を含む。
【0112】
一貫性(Consistency)。これは、アプリケーションが規定する完全性の制約について違反があってはならないことを意味する。あるトランザクションが実行される前に、あるシステムが一貫する状態(consistent state)にあるとすると、それは、その後においても、一貫した状態にある必要がある。
【0113】
例えば、もし、あるユーザが10ポンドのための賭けを持つとすれば、マッチした部分とマッチしない部分の合計は10ポンドでなければならない。
【0114】
本発明に基づくシステムの実施形態では、弱い一貫性が適用される。このシステムは、結局のところは一貫することになるけれども、時間的なある一瞬においては、それは不一致となりうる。例えば、あるアカウント・コントローラは、不一致である10ポンドの賭けの記録を持ちうるし、あるマーケット・コントローラは、その掛けのうち5ポンドがマッチしたとの記録を持ちうる。このアカウント・コントローラは、5ポンドの一致あるいは不一致の記録を持たないけれども、マーケット・コントローラから移動中の、このマッチを記述するメッセージは、アカウント・コントローラが結果的に、マッチされ及びマッチしない5ポンドの価額を記録することを意味する。このことは、既に説明したように、状態及びメッセージングの保証によって保証されている。
【0115】
独立性(Isolation)。この特性は、複数の実行中の動作が重ならないことに言及するものであり、これにより、それらが同時に実行されたとしても、それらは順次実行されるように見える。トランザクション処理システムにおける多くの機能は、アカウント及びイベントへの排他的なアクセスを要求する。独立性を達成するためには、実行ユニットが個別のエンティティに割り当てられる。それにより、アクセスは固有的にシリアライズされ、そして、トランザクションは他のそれとは独立とされる。例えば、単一の実行ユニットは、特定データの一部への独占を取得しそして解放するクライアントのセッションに対向して、特定のアカウントあるいは特定のマーケットを持つことができる。
【0116】
耐久性(Durability)。トランザクションが成功して、一旦完了すると、それは、例えシステムがシャットダウンしても、失われてはならない。変更は、したがって、ディスクに書き込まれ、あるいはジャーナルされる。上において説明したように、フル・トランザクションのみがこの手法でログされるのであり、このトランザクションを構成する個別の動作はそうされない。
【0117】
メッセージ・カウンタは、やはりログされ、メッセージの紛失、不調あるいは重複のために提供される。
【0118】
前記した実施形態への変更及び変化は熟練者には明白であるが、それらは、請求の範囲の中に入る。
【特許請求の範囲】
【請求項1】
複数の分散されたノードを備えるシステムにおけるトランザクション処理方法であって、前記ノード中では、データが、複数のデータ・バーティション中に保持されており、各パーティション中のデータは、ノードのそれぞれ一つと関連付けられており、このシステムは、以下を備える:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中の前記データについての操作を実行するための複数の書き込みステージを備える;そして
実行のスレッドを前記書き込み段階に割り当てるためのスレッド・マネージャ、ここで、前記スレッド・マネージャは、所定のデータ・パーティション中のデータについて操作するために、最大で一つのスレッドを割り当てるようになっている、
さらに、前記方法は、以下のステップを備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取ること、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定している;
前記複数の書き込みステージの一つによる処理のためにメッセージをキューイングすること;そして
実行のスレッドが前記所定のデータ・パーティションのために利用可能な場合には、前記書き込み段階による前記メッセージの処理を許可すること。
【請求項2】
請求項1に記載の方法であって、さらに以下を備える:
前記複数のコントローラのうちの第2のものに向けて、その後の処理のために、前記メッセージを送ること。
【請求項3】
請求項1又は2に記載の方法であって、前記第1又は第2のコントローラに前記メッセージを送る前に、前記メッセージが向けられた前記所定のデータ・パーティションに割り当てられた前記コントローラのアドレスを決定することを備える。
【請求項4】
先行するいずれかの請求項に記載の方法であって、複数の読み取りステージが所定のパーティション中の前記データについて並行して操作することを許可することをさらに備える。
【請求項5】
請求項4に記載の方法であって、ここでは、もし書き込みステージが前記所定のパーティション中の前記データについて操作していないときにおいてのみ、複数の読み取りステージが前記所定のパーティション中の前記データについて操作することを許可されている。
【請求項6】
先行するいずれかの請求項に記載の方法であって、受け取ったメッセージを、その受領に際してジャーナリングすることを備える。
【請求項7】
請求項6に記載の方法であって、受け取ったメッセージに連続番号を割り当てることを備える。
【請求項8】
先行するいずれかの請求項に記載の方法であって、受け取ったメッセージを、他の複数の受け取りメッセージと共にバッチングすることを含む。
【請求項9】
請求項8に記載の方法であって、ここでは、前記バッチングは、バッチングが実行されている処理ステージに依存する基準に基づいて実行される。
【請求項10】
請求項8又は9に記載の方法であって、ここでは、前記バッチングは、ネットワーク待ち時間、ディスク待ち時間、及び処理されるべき前記データのうちの少なくとも一つに従って実行される。
【請求項11】
請求項8〜10のいずれか1項に記載の方法であって、さらに、前記メッセージが向けられた前記データ・パーティションに関連する前記コントローラに従ってメッセージをグループ化することを備える。
【請求項12】
先行するいずれかの請求項に記載の方法であって、ここでは、単一のコントローラに関連する複数のデータ・パーティション中の前記データは、前記ノードのうちの一つに格納されている。
【請求項13】
先行するいずれかの請求項に記載の方法であって、ここでは、第1のデータ・パーティション中の前記データは、あるユーザに関連するアカウントを規定している。
【請求項14】
請求項13に記載の方法であって、ここでは、第1のコントローラは、複数のアカウントに関連する操作を制御するためのアカウント・コントローラを備える。
【請求項15】
請求項13又は14に記載の方法であって、ここでは、第2のデータ・パーティション中の前記データは、複数のユーザが賭けを提起できるマーケットを備える。
【請求項16】
請求項15に記載の方法であって、ここでは、第2のコントローラは、複数のマーケットに関連する操作を制御するためのマーケット・コントローラを備える。
【請求項17】
先行するいずれかの請求項に記載の方法であって、ここでは、前記メッセージは、非同期で送信される。
【請求項18】
先行するいずれかの請求項に記載の方法であって、ここでは、前記ノードがサーバを含む。
【請求項19】
複数の分散されたノードを備えるシステムにおいてトランザクション処理方法を実行するためのコンピュータ可読命令を備えるコンピュータ可読媒体であって、前記ノードにおいては、複数のデータ・パーティション中にデータが保持されており、それぞれのパーティション中のデータは、対応する単一の前記ノードに関連付けられており、
前記システムは以下を含む:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中における前記データについての操作を実行するための複数の書き込みステージを備えており;そして、
実行スレッドを前記書き込みステージに割り当てるためのスレッド・マネージャ、ここで、前記スレッド・マネージャは、所定のデータ・パーティション中のデータについて操作するために、最大でも一つのスレッドを割り当てるようになっており、
前記コンピュータ可読命令は、以下を備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取るための第1の命令、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定する;
前記複数の書き込みステージの一つによって処理するために前記メッセージをキューイングするための第2の命令;そして、
前記所定のデータ・パーティションのために実行スレッドが利用可能な場合において、前記書き込みステージが前記メッセージを処理することを許可するための第3の命令。
【請求項20】
請求項19に記載のコンピュータ可読媒体であって、以下をさらに備える:
その後の処理のために、前記複数のコントローラのうちの第2のものに前記メッセージを送付するための第4の命令。
【請求項21】
複数の分散されたノードを備えるシステムにおけるトランザクション処理のための装置であって、前記ノードにおいては、データは、複数のデータ・パーティション内に保持されており、対応するパーティション内のデータは、対応する単一の前記ノードに関連付けられており、
前記システムは、以下を備える:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中の前記データについての操作を実行するための複数の書き込みステージを備えており;そして、
実行のスレッドを前記書き込みステージに割り当てるためのスレッド・マネージャ、ここでは、前記スレッド・マネージャは、所定のデータ・パーティション中のデータの操作のために、最大で一つのスレッドを割り当てるようになっており、
前記装置は、以下を備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取るレシーバ、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定しており;そして、
前記メッセージを処理するための複数の書き込みステージ、ここでは、実行スレッドが前記所定のデータ・パーティションのために利用可能な場合には、書き込みステージは、一つ又は複数のメッセージを処理し、実行スレッドが利用できない場合には、前記装置は、前記メッセージをキューに配置するようになっている。
【請求項22】
請求項21に記載の装置であって、その後の処理のために、前記複数のコントローラのうちの第2のものに前記メッセージを送るためのディスパッチャを備える。
【請求項23】
請求項21又は22に記載の装置であって、ここでは、あるアカウントに関係するデータは、単一のサーバ内に保存されている。
【請求項24】
請求項23に記載の装置であって、ここでは、アカウントのグループを制御するためのアカウント・コントローラをさらに備えている。
【請求項25】
請求項12〜24のいずれか1項に記載の装置であって、ここでは、あるマーケットに関係するデータは、単一のサーバ内に保存されている。
【請求項26】
請求項25に記載の装置であって、ここでは、マーケットのグループを制御するためのマーケット・コントローラをさらに備えている。
【請求項27】
請求項23〜26のいずれか1項に記載の装置であって、ここでは、単一のスレッドを、ある単一のアカウントあるいは単一のマーケットについて操作している第1の書き込みステージに割り付けるためのスレッド・マネージャをさらに備えている。
【請求項28】
請求項27に記載の装置であって、ここでは、前記単一のアカウントあるいは前記単一のマーケットへのアクセスを要求する第2の書き込みステージは、前記単一のスレッドが解放されるまで、アクセスを拒否される。
【請求項29】
請求項27又は28に記載の装置であって、ここでは、前記第1の及び/又は前記第2の書き込みステージは、ある単一のアカウントあるいはマーケットに関係するメッセージのバッチを、単一の操作において処理するように構成されている。
【請求項30】
請求項21〜29のいずれか1項に記載の装置であって、ここでは、複数の書き込みステージに影響するメッセージを処理するためのプリプロセッサをさらに備えている。
【請求項31】
請求項30に記載の装置であって、ここでは、前記プリプロセッサは、単一のメッセージ・ストリームを、複数のジャーナルされたメッセージ・ストリームから生成するようになっている。
【請求項32】
請求項21〜31のいずれか1項に記載の装置であって、ここでは、メッセージが受け取られていないという通知に対応して、第1のノードから第2のノードにメッセージを再送信する手段をさらに備える。
【請求項33】
請求項21〜32のいずれか1項に記載の装置であって、ここでは、大量に要求されたデータを提供するためのデータ・ディレクタのクラスタをさらに備える。
【請求項34】
請求項21〜33のいずれか1項に記載の装置であって、ここでは、トランザクションを不揮発性メモリにジャーナルし、そして、トランザクションを作る操作を揮発性メモリにジャーナルする構成となっている。
【請求項1】
複数の分散されたノードを備えるシステムにおけるトランザクション処理方法であって、前記ノード中では、データが、複数のデータ・バーティション中に保持されており、各パーティション中のデータは、ノードのそれぞれ一つと関連付けられており、このシステムは、以下を備える:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中の前記データについての操作を実行するための複数の書き込みステージを備える;そして
実行のスレッドを前記書き込み段階に割り当てるためのスレッド・マネージャ、ここで、前記スレッド・マネージャは、所定のデータ・パーティション中のデータについて操作するために、最大で一つのスレッドを割り当てるようになっている、
さらに、前記方法は、以下のステップを備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取ること、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定している;
前記複数の書き込みステージの一つによる処理のためにメッセージをキューイングすること;そして
実行のスレッドが前記所定のデータ・パーティションのために利用可能な場合には、前記書き込み段階による前記メッセージの処理を許可すること。
【請求項2】
請求項1に記載の方法であって、さらに以下を備える:
前記複数のコントローラのうちの第2のものに向けて、その後の処理のために、前記メッセージを送ること。
【請求項3】
請求項1又は2に記載の方法であって、前記第1又は第2のコントローラに前記メッセージを送る前に、前記メッセージが向けられた前記所定のデータ・パーティションに割り当てられた前記コントローラのアドレスを決定することを備える。
【請求項4】
先行するいずれかの請求項に記載の方法であって、複数の読み取りステージが所定のパーティション中の前記データについて並行して操作することを許可することをさらに備える。
【請求項5】
請求項4に記載の方法であって、ここでは、もし書き込みステージが前記所定のパーティション中の前記データについて操作していないときにおいてのみ、複数の読み取りステージが前記所定のパーティション中の前記データについて操作することを許可されている。
【請求項6】
先行するいずれかの請求項に記載の方法であって、受け取ったメッセージを、その受領に際してジャーナリングすることを備える。
【請求項7】
請求項6に記載の方法であって、受け取ったメッセージに連続番号を割り当てることを備える。
【請求項8】
先行するいずれかの請求項に記載の方法であって、受け取ったメッセージを、他の複数の受け取りメッセージと共にバッチングすることを含む。
【請求項9】
請求項8に記載の方法であって、ここでは、前記バッチングは、バッチングが実行されている処理ステージに依存する基準に基づいて実行される。
【請求項10】
請求項8又は9に記載の方法であって、ここでは、前記バッチングは、ネットワーク待ち時間、ディスク待ち時間、及び処理されるべき前記データのうちの少なくとも一つに従って実行される。
【請求項11】
請求項8〜10のいずれか1項に記載の方法であって、さらに、前記メッセージが向けられた前記データ・パーティションに関連する前記コントローラに従ってメッセージをグループ化することを備える。
【請求項12】
先行するいずれかの請求項に記載の方法であって、ここでは、単一のコントローラに関連する複数のデータ・パーティション中の前記データは、前記ノードのうちの一つに格納されている。
【請求項13】
先行するいずれかの請求項に記載の方法であって、ここでは、第1のデータ・パーティション中の前記データは、あるユーザに関連するアカウントを規定している。
【請求項14】
請求項13に記載の方法であって、ここでは、第1のコントローラは、複数のアカウントに関連する操作を制御するためのアカウント・コントローラを備える。
【請求項15】
請求項13又は14に記載の方法であって、ここでは、第2のデータ・パーティション中の前記データは、複数のユーザが賭けを提起できるマーケットを備える。
【請求項16】
請求項15に記載の方法であって、ここでは、第2のコントローラは、複数のマーケットに関連する操作を制御するためのマーケット・コントローラを備える。
【請求項17】
先行するいずれかの請求項に記載の方法であって、ここでは、前記メッセージは、非同期で送信される。
【請求項18】
先行するいずれかの請求項に記載の方法であって、ここでは、前記ノードがサーバを含む。
【請求項19】
複数の分散されたノードを備えるシステムにおいてトランザクション処理方法を実行するためのコンピュータ可読命令を備えるコンピュータ可読媒体であって、前記ノードにおいては、複数のデータ・パーティション中にデータが保持されており、それぞれのパーティション中のデータは、対応する単一の前記ノードに関連付けられており、
前記システムは以下を含む:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中における前記データについての操作を実行するための複数の書き込みステージを備えており;そして、
実行スレッドを前記書き込みステージに割り当てるためのスレッド・マネージャ、ここで、前記スレッド・マネージャは、所定のデータ・パーティション中のデータについて操作するために、最大でも一つのスレッドを割り当てるようになっており、
前記コンピュータ可読命令は、以下を備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取るための第1の命令、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定する;
前記複数の書き込みステージの一つによって処理するために前記メッセージをキューイングするための第2の命令;そして、
前記所定のデータ・パーティションのために実行スレッドが利用可能な場合において、前記書き込みステージが前記メッセージを処理することを許可するための第3の命令。
【請求項20】
請求項19に記載のコンピュータ可読媒体であって、以下をさらに備える:
その後の処理のために、前記複数のコントローラのうちの第2のものに前記メッセージを送付するための第4の命令。
【請求項21】
複数の分散されたノードを備えるシステムにおけるトランザクション処理のための装置であって、前記ノードにおいては、データは、複数のデータ・パーティション内に保持されており、対応するパーティション内のデータは、対応する単一の前記ノードに関連付けられており、
前記システムは、以下を備える:
データ・パーティションのグループを制御するための複数のコントローラ、ここで、各コントローラは、前記データ・パーティション中の前記データについての操作を実行するための複数の書き込みステージを備えており;そして、
実行のスレッドを前記書き込みステージに割り当てるためのスレッド・マネージャ、ここでは、前記スレッド・マネージャは、所定のデータ・パーティション中のデータの操作のために、最大で一つのスレッドを割り当てるようになっており、
前記装置は、以下を備える:
前記複数のコントローラのうちの第1のものにおいてメッセージを受け取るレシーバ、ここで、前記メッセージは、所定のデータ・パーティションに関連するデータについて実行されるべき操作を規定しており;そして、
前記メッセージを処理するための複数の書き込みステージ、ここでは、実行スレッドが前記所定のデータ・パーティションのために利用可能な場合には、書き込みステージは、一つ又は複数のメッセージを処理し、実行スレッドが利用できない場合には、前記装置は、前記メッセージをキューに配置するようになっている。
【請求項22】
請求項21に記載の装置であって、その後の処理のために、前記複数のコントローラのうちの第2のものに前記メッセージを送るためのディスパッチャを備える。
【請求項23】
請求項21又は22に記載の装置であって、ここでは、あるアカウントに関係するデータは、単一のサーバ内に保存されている。
【請求項24】
請求項23に記載の装置であって、ここでは、アカウントのグループを制御するためのアカウント・コントローラをさらに備えている。
【請求項25】
請求項12〜24のいずれか1項に記載の装置であって、ここでは、あるマーケットに関係するデータは、単一のサーバ内に保存されている。
【請求項26】
請求項25に記載の装置であって、ここでは、マーケットのグループを制御するためのマーケット・コントローラをさらに備えている。
【請求項27】
請求項23〜26のいずれか1項に記載の装置であって、ここでは、単一のスレッドを、ある単一のアカウントあるいは単一のマーケットについて操作している第1の書き込みステージに割り付けるためのスレッド・マネージャをさらに備えている。
【請求項28】
請求項27に記載の装置であって、ここでは、前記単一のアカウントあるいは前記単一のマーケットへのアクセスを要求する第2の書き込みステージは、前記単一のスレッドが解放されるまで、アクセスを拒否される。
【請求項29】
請求項27又は28に記載の装置であって、ここでは、前記第1の及び/又は前記第2の書き込みステージは、ある単一のアカウントあるいはマーケットに関係するメッセージのバッチを、単一の操作において処理するように構成されている。
【請求項30】
請求項21〜29のいずれか1項に記載の装置であって、ここでは、複数の書き込みステージに影響するメッセージを処理するためのプリプロセッサをさらに備えている。
【請求項31】
請求項30に記載の装置であって、ここでは、前記プリプロセッサは、単一のメッセージ・ストリームを、複数のジャーナルされたメッセージ・ストリームから生成するようになっている。
【請求項32】
請求項21〜31のいずれか1項に記載の装置であって、ここでは、メッセージが受け取られていないという通知に対応して、第1のノードから第2のノードにメッセージを再送信する手段をさらに備える。
【請求項33】
請求項21〜32のいずれか1項に記載の装置であって、ここでは、大量に要求されたデータを提供するためのデータ・ディレクタのクラスタをさらに備える。
【請求項34】
請求項21〜33のいずれか1項に記載の装置であって、ここでは、トランザクションを不揮発性メモリにジャーナルし、そして、トランザクションを作る操作を揮発性メモリにジャーナルする構成となっている。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6a】
【図6b】
【図6c】
【図7】
【図8】
【図9】
【図10】
【図11】
【図2】
【図3】
【図4】
【図5】
【図6a】
【図6b】
【図6c】
【図7】
【図8】
【図9】
【図10】
【図11】
【公表番号】特表2010−512591(P2010−512591A)
【公表日】平成22年4月22日(2010.4.22)
【国際特許分類】
【出願番号】特願2009−540768(P2009−540768)
【出願日】平成19年12月12日(2007.12.12)
【国際出願番号】PCT/EP2007/063842
【国際公開番号】WO2008/071748
【国際公開日】平成20年6月19日(2008.6.19)
【出願人】(502359976)ザ・スポーティング・エクスチェンジ・リミテッド (1)
【Fターム(参考)】
【公表日】平成22年4月22日(2010.4.22)
【国際特許分類】
【出願日】平成19年12月12日(2007.12.12)
【国際出願番号】PCT/EP2007/063842
【国際公開番号】WO2008/071748
【国際公開日】平成20年6月19日(2008.6.19)
【出願人】(502359976)ザ・スポーティング・エクスチェンジ・リミテッド (1)
【Fターム(参考)】
[ Back to top ]