以下の説明では、「インターフェース装置」は、一つ以上のインターフェースを含む。一つ以上のインターフェースは、一つ以上の同種の通信インターフェースデバイス(例えば一つ以上のNIC(Network Interface Card))であってもよいし二つ以上の異種の通信インターフェースデバイス(例えばNICとHBA(Host Bus Adapter))であってもよい。
また、以下の説明では、「記憶装置」は、一つ以上のメモリを含む。記憶装置に関して少なくとも一つのメモリは、揮発性メモリでよい。記憶装置は、主に、プロセッサによる処理の際に使用される。記憶装置は、メモリの他に、一つ以上の不揮発性の記憶デバイス(例えば、HDD(Hard Disk Drive)又はSSD(Solid State Drive))を含んでもよい。
また、以下の説明では、「プロセッサ」は、一つ以上のプロセッサを含む。少なくとも一つのプロセッサは、典型的には、CPU(Central Processing Unit)のようなマイクロプロセッサである。一つ以上のプロセッサの各々は、シングルコアでもよいしマルチコアでもよい。プロセッサは、処理の一部または全部を行うハードウェア回路を含んでもよい。
また、以下の説明では、「プログラム」を主語として処理を説明する場合があるが、プログラムは、プロセッサによって実行されることで、定められた処理を、適宜に記憶装置(例えばメモリ)及び/又はインターフェース装置(例えば通信ポート)等を用いながら行うため、処理の主語がプロセッサとされてもよい。プログラムを主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理としてもよい。また、プロセッサは、処理の一部又は全部を行うハードウェア回路(例えばFPGA(Field-Programmable Gate Array)又はASIC(Application Specific Integrated Circuit))を含んでもよい。プログラムは、プログラムソースから計算機のような装置にインストールされてもよい。プログラムソースは、例えば、プログラム配布サーバまたは計算機が読み取り可能な記録媒体(例えば非一時的な記録媒体)であってもよい。また、以下の説明において、二つ以上のプログラムが一つのプログラムとして実現されてもよいし、一つのプログラムが二つ以上のプログラムとして実現されてもよい。
また、以下の説明では、「yyy部」の表現にて機能を説明することがあるが、機能は、一つ以上のコンピュータプログラムがプロセッサによって実行されることで実現されてもよいし、一つ以上のハードウェア回路(例えばFPGA又はASIC)によって実現されてもよいし、それらの組合せによって実現されてもよい。プログラムがプロセッサによって実行されることで機能が実現される場合、定められた処理が、適宜に記憶装置及び/又はインターフェース装置等を用いながら行われるため、機能はプロセッサの少なくとも一部とされてもよい。機能を主語として説明された処理は、プロセッサあるいはそのプロセッサを有する装置が行う処理としてもよい。各機能の説明は一例であり、複数の機能が一つの機能にまとめられたり、一つの機能が複数の機能に分割されたりしてもよい。
また、以下の説明では、同種の要素を区別しないで説明する場合には、参照符号のうちの共通符号を使用し、同種の要素を区別する場合は、参照符号を使用することがある。
また、以下の説明では、「オブジェクト」とは、アプリケーションプログラムのようなプログラムから見た1つの論理的な電子データの塊であり、具体的には、対象の状態を表すデータである。オブジェクトとしてのデータは、例えば、レコード、キーバリューペア又はタプルである。以下、オブジェクトとして、レコードを例に取る。
また、以下の説明では、「対象」とは、任意の有体物又は無体物である。例えば、「対象」として、口座を採用し、対象の状態として、残高を採用することができる。
また、以下の説明では、「状態更新要求」とは、状態更新処理の要求である。「状態更新処理」とは、対象の状態を更新する処理である。
図1は、実施例1に係るシステム全体の構成の一例を示す。
複数のクライアントシステム13A、13B、…と、サーバシステム15が、通信ネットワーク19を介して通信可能に接続される。サーバシステム15が、複数のノードシステム1300A、1300B、…から構成される。複数のクライアントシステム13A、13B、…が、一つ又は複数の第1の計算機システムの一例である。サーバシステム15が、第2の計算機システムの一例である。ノードシステム1300毎に管理主体が異なっていてもよいし、二つ以上(例えば全て)のノードシステム1300の管理主体が同一でもよい。
クライアントシステム13は、クライアントプログラム134を実行する。クライアントプログラム134の他にユーザプログラム124を実行するクライアントシステム13があってもよいし(例えばクライアントシステム13A)、ユーザプログラム124を実行するユーザシステム12に通信ネットワーク14を介して接続されたクライアントシステム13(例えばクライアントシステム13B)があってもよい。ユーザシステム12は、ユーザの計算機(例えば、パーソナルコンピュータ)でよい。ユーザプログラム124は、Webブラウザでもよいしアプリケーションプログラムでもよい。通信ネットワーク14は通信ネットワーク19と一体でもよい。
データ管理システム10は、複数のクライアントシステム13A、13B、…で実行される複数のクライアントプログラム134と、ノードシステム1300で実行されるサーバプログラム154とを備える。
中間システム80が、通信ネットワーク19に接続される。中間システム80は、複数のクライアントシステム13A、13B、…と、複数のノードシステム1300A、1300B、…との間に介在する計算機システムである。中間システム80は、オーダリングシステムを有する。オーダリングシステムは、一つ又は複数のパーティションで構成され、パーティション毎に、トータルオーダ性を保証するシステムである。本実施例では、オーダリングシステムは、一つのパーティションで構成されている。
複数のクライアントシステム13A、13B、…からの複数の状態更新要求が中間システム80に入り中間システム80から出る。複数のクライアントシステム13A、13B、…と中間システム80間を接続する通信ネットワークと、中間システム80と複数のノードシステム1300A、1300B、…間を接続する通信ネットワークが、同じであっても異なっていてもよい。
図2は、クライアントシステム13、ノードシステム1300及び中間システム80の構成の一例を示す。
クライアントシステム13は、一つ又は複数のクライアント計算機130を含む。
クライアント計算機130は、インターフェース装置131、記憶装置132及びそれらに接続されたプロセッサ133を有する。
インターフェース装置131は、通信ネットワーク19に接続される。
記憶装置132は、クライアントプログラム134及びクライアント管理データ135を記憶する。クライアント管理データ135は、クライアント計算機130において管理されるデータである。
プロセッサ133は、クライアントプログラム134を実行する。クライアントプログラム134がプロセッサ133に実行されることで、要求発行部の一例としての機能が実現される。当該機能の一部は、FPGA又はASICのようなハードウェア回路により実現されてもよい。
ノードシステム1300は、一つ又は複数のサーバ計算機150(ノード計算機の一例)を含む。
サーバ計算機150は、インターフェース装置151、記憶装置152及びそれらに接続されたプロセッサ153を有する。
インターフェース装置151は、通信ネットワーク19に接続される。
記憶装置152は、サーバプログラム154及びサーバ管理データ155を記憶する。サーバ管理データ155は、サーバ計算機150において管理されるデータである。
プロセッサ153は、サーバプログラム154を実行する。サーバプログラム154がプロセッサ153に実行されることで、要求実行部の一例としての機能が実現される。当該機能の一部は、FPGA又はASICのようなハードウェア回路により実現されてもよい。
中間システム80は、一つ以上の中間計算機45(例えば冗長化された計算機)を備える。
中間計算機45は、インターフェース装置451、記憶装置452及びそれらに接続されたプロセッサ453を有する。
インターフェース装置451は、通信ネットワーク19に接続される。
記憶装置452は、オーダリングプログラム454及びオーダリング管理データ455を記憶する。オーダリング管理データ455は、中間計算機45において管理されるデータである。
プロセッサ453は、オーダリングプログラム454を実行する。オーダリングプログラム454がプロセッサ453に実行されることで、オーダリング管理部の一例としての機能が実現される。当該機能の一部は、FPGA又はASICのようなハードウェア回路により実現されてもよい。オーダリングプログラム454は、クライアントシステム13からの状態更新要求をオーダリングシステムに蓄積する。
中間システム80の管理主体は、いずれのノードシステム1300の管理主体とも別の管理主体であることが好ましいが、それに限定されないでもよい。例えば、いずれかのノードシステム1300におけるいずれかのサーバ計算機150が中間計算機45を兼ねてもよい。
図3は、サーバ管理データ155の一例を示す。
サーバ管理データ155は、実行管理テーブル33と、ロックテーブル44、アセットセット800である。
実行管理テーブル33は、実行された状態更新要求を表すテーブル(例えば、実行された状態更新要求が持つnonceのリスト)である。
ロックテーブル44は、ロックの取得の可否判定に使用されるテーブルであり、いずれの状態更新要求及びいずれの対象についてロックが取得済みであるかを表すテーブルである。
アセットセット800は、アセットの集合である。
図4は、アセットセット800の一例を示す。
アセットセット800は、対象毎にアセット810を持つ。対象のkeyから当該対象のアセット810が同定される。各対象について、アセット810は、台帳に相当してよい。
各対象について、アセット810は、レコードの時系列である。アセット810におけるレコードを「アセットレコード」と言うことができる。アセット810は、少なくとも末端アセットレコードを有する。アセットレコードは、key701、age702、input703、output704、BL705、Arg706、nonce707、Sig708、Prev-HV709及びHV710といった情報を持つ。以下、一つの対象及び一つのアセットレコードを例に取る(図4の説明において「注目対象」及び「注目アセットレコード」)。
key701は、注目対象のIDである。age702は、注目対象の状態の世代を表す。注目対象の状態が更新される都度に、インクリメントされたage702を持つ末端アセットレコードが追加される。本実施例では、世代が新しいとは、age702が大きいことである。
input703は、注目対象を含む一つ以上の対象の各々の直前状態(注目アセットレコード内のBL705を適用する前の状態)を表す。output704は、注目対象の直後状態(注目アセットレコード内のBL705を適用した後の状態)を表す。例えば、注目アセットレコードが追加されることになった状態更新処理が口座A(注目対象の一例)から口座Bへの振込である場合、input703は、口座Aと口座Bの各々の直前の残高を表す。output704は、口座Aの直後の残高を表す。
BL705は、状態更新処理の処理ロジック(例えば関数)を特定するためのロジック情報である。ロジック情報は、本実施例では処理ロジックそれ自体であるが、それに代えて、処理ロジックのIDでもよい。
Arg706は、当該処理ロジックにおいて使用される一つ以上の引数である引数情報である。
XXXiは、i番目のXXXとする。outputiを、outputi=BLi(inputi, Argi)と表現することができる。すなわち、outputiは、inputiとArgiとを用いてBLiが実行された結果としての状態である。なお、input703が、対象間(アセット810間)のレコード連鎖を実現する(図4の一点鎖線矢印を参照)。
nonce707は、注目対象の最新状態(output704)に対応したnonceである。具体的には、nonce707は、当該最新状態が得られた状態更新処理の状態更新要求に関連付けられているnonceである。
Sig708は、注目対象の最新状態(output704)が得られた状態更新要求を発行したユーザの秘密鍵を用いて生成された電子署名である。Sig708は、本実施例では、BL705、Arg706及びnonce707を基に生成される。なお、BL705を基に生成された電子署名と、Arg706を基に生成された電子署名と、nonce707を基に生成された電子署名は、別々に存在してもよい。
Prev-HV709は、注目対象の直前状態(直前世代)のアセットレコード(つまり親アセットレコード)のHV710と同じ値である。つまり、Prev-HV709と、親アセットレコード内のHV710とのリンク(図4の実線矢印を参照)が、対象に対応したアセット810内でのレコード連鎖を実現する。
HV710は、注目対象のアセットレコードのサマリ、例えばHV710以外の情報の少なくとも一部の情報(本実施例では全ての情報701〜709)のハッシュ値(暗号学的に衝突が困難なハッシュ値)である。
以上の通り、アセットセット800において、同一のアセット810のアセットレコードにおけるPrev-HV709とHV710間でレコード連鎖が実現されている(実線矢印参照)。異なるアセット810のアセットレコードにおけるinput703間でレコード連鎖が実現されることもある。このようにして、アセットセット800は、DAG(Directed Acyclic Graph)構造をなす。アセットセット800において、ノードは、アセットレコードであり、エッジは、一つ以上の状態更新処理におけるアセットレコード間の関係を表す。
各対象について、アセット810は、当該対象の状態の更新の履歴の一例である。アセットレコードのスキーマは限定されない。例えば、アセットレコードにおいて、一部の要素(例えば、BL705やSig708)は無くてもよい。
サーバプログラム154が、アセットセット800に加えて又は代えて、最新アセットレコードセット88を管理してもよい。最新アセットレコードセット88は、対象毎に、最新アセットレコード(末端アセットレコードのみ)を持つ。つまり、各対象について、最新の状態が管理されていればよく、過去の状態は管理されないでもよい。
図5は、状態更新要求の構成の概要を示す。
状態更新要求は、クライアントプログラム134から発行される。クライアントプログラム134は、例えば、ユーザプログラム124(例えばアプリケーションプログラム)から受けた情報(例えば、対象keyを含む一つ以上の引数を含んだ情報)を含む状態更新要求を生成し、生成した状態更新要求を発行する。
状態更新要求は、nonce61、引数群62及び処理内容63を含む。
引数群62は、一つ以上の引数を含む。引数群62における各引数には、引数key(例えば、“account.from”、“account.to”及び“money”)が関連付いている。図5の例によれば、引数keyは、引数のラベルであり、引数群62において、明示的に示されているが、引数keyは、暗黙的に示されていてもよい。例えば、引数keyは、引数群62の先頭からのオフセットでもよい。
処理内容63は、当該引数群62を用いた状態更新処理の内容を表す記述である処理記述(又は当該処理記述へのリンク)である。処理記述では、状態更新処理のうち引数が使用される処理について、当該引数の引数keyが定義されている。状態更新処理の実行において、引数keyに対応した引数が使用される。
引数群62には、指定された対象を表す引数が含まれている。本実施例では、実行前の状態更新要求で指定されている対象keyが実行中の状態更新要求で指定されている対象keyと競合すると、それらの状態更新要求は競合しているということになる。各ノードシステム1300において、競合する二つ以上の状態更新要求が並列に実行され、ノードシステム1300間において当該二つ以上の状態更新要求の実行順序が異なっていると、同一対象の最新アセットレコードがノードシステム1300間で同じにならない可能性がある。このため、競合する二つ以上の状態更新要求は、各ノードシステム1300において決定的な順序で実行されなければならない。そのための一つの方法として、状態更新要求で指定されている対象keyが実行中の状態更新要求で指定されている対象keyと競合するか否かを判定する方法がある。
しかし、引数群62には、いずれの引数keyが対象keyであるかは示されていない。このため、状態更新要求を実行してみないと、いずれの引数keyが対象keyであるかを特定することができない。
そこで、本実施例では、状態更新要求にコンテキスト70が付加される。コンテキスト70は、競合判定のための情報であり、一つ以上の対象keyを特定するための記述である。具体的には、例えば、コンテキスト70は、一つ以上の対象keyへの直接的又は間接的な参照である。図5が示す例によれば、コンテキスト70は、一つ以上の対象keyへの間接的な参照である。具体的には、コンテキスト70は、引数群62を通じて一つ以上の対象keyを特定するための記述、より具体的には、引数群62のうちのいずれの引数keyに対応した引数が対象keyであるかを表す情報である。図5が示すコンテキスト70から、“account.from”及び“account.to”が、対象keyに対応した引数keyであることがわかり、引数群62から、引数key“account.from”に対応した引数“k1”と引数key“account.to”に対応した引数“k2”がそれぞれ対象keyであることがわかる。状態更新要求からこのようにして特定された対象keyが実行中の状態更新要求で指定されている対象keyと競合するか否かを判定する競合判定を行うことが可能である。
なお、コンテキスト70は、上述したように、一つ以上の対象keyへの直接的な参照でもよい。例えば、コンテキスト70は、“k1”及び“k2”がそれぞれ対象keyであることを直接的に示す記述(例えば、“key =[k1, k2]”という記述)でもよい。このような記述によれば、コンテキスト70以外の記述(例えば、引数群62)を参照すること無しに、一つ以上の対象keyを特定することができる。
図6は、実施例1の概要を示す。なお、図6において、「Rx」(xは自然数)のうちの「R」は、状態更新要求を表し、「x」は、状態更新要求の番号(例えば、nonceに相当)を表す。また、図6において、「ky」(yは自然数)は、対象keyを基に決定される値がy(yは自然数)である対象keyを表す。
オーダリングプログラム454は、クライアントシステム13(クライアントプログラム134)から状態更新要求を受信し、受信した状態更新要求をオーダリングシステム4211に入れる。状態更新要求が受信される都度に、当該状態更新要求がオーダリングシステム4211に入れられてもよいし、一定時間が経過する都度に又は一定数の状態更新要求が受信される都度に、受信された一つ以上の状態更新要求が所定の規則に沿った順序でオーダリングシステム4211に入れられてもよい。
オーダリングシステム4211から出た状態更新要求を受ける機能である要求受信部と、要求受信部が受けた状態更新要求が実行中の状態更新要求と競合するか否かを判定する機能である競合判定部とがある。要求受信部も競合判定部も少なくとも一つの計算機システムに備えられる。本実施例では、要求受信部も競合判定部も、各ノードシステム1300に備えられるが、要求受信部及び競合判定部の少なくとも一つは、ノードシステム1300以外の計算機システムに備えられてもよい。例えば、中間システム80とサーバシステム15との間に介在する計算機システム(図示せず)に、一つ又は複数の要求受信部(例えば、ノードシステム1300毎の一つ以上の要求受信部)が備えられてもよいし、一つ又は複数の競合判定部(例えば、ノードシステム1300毎の一つ以上の競合判定部)が備えられてもよい。
各ノードシステム1300において、取得スレッド30が実行される。取得スレッド30は、状態更新要求をオーダリングシステム4211から取得し、当該状態更新要求について上述の競合判定を行う。本実施例では、取得スレッド30が、要求受信部及び競合判定部に相当する。本実施例では、各ノードシステム1300において、一つの取得スレッド30が予め用意されている。しかし、各ノードシステム1300において、二つ以上の取得スレッド30が予め用意されていてもよいし、動的に取得スレッド30が生成されてもよい。要求受信部と競合判定部が別々のスレッドで実現されてもよい。要求受信部及び競合判定部は、スレッドに代えて、プロセスでもよいし、ノードシステム1300内のサーバ計算機150でもよいし、ノードシステム1300以外のシステムにおける要素(例えば、スレッド、プロセス又は計算機)でもよい。
各ノードシステム1300において、取得スレッド30が、オーダリングシステム4211から出た状態更新要求を受ける。状態更新要求は、取得スレッド30によるプルとオーダリングプログラム454によるプッシュとのいずれかによりオーダリングシステム4211から取得スレッド30へ届く。本実施例では、プルが採用される。つまり、取得スレッド30が、オーダリングシステム4211から状態更新要求を取得する。なお、オーダリングシステム4211からノードシステム1300への状態更新要求の送信は、at-least-onceデリバリーの送信でよい。オーダリングシステムに入っている一つの状態更新要求について、「at-least-onceデリバリーの送信」とは、当該一つの状態更新要求が少なくとも一回取り出せることを言う。
各ノードシステム1300において、取得スレッド30は、取得された状態更新要求が当該ノードシステム1300において実行中の状態更新要求と競合するか否かを判定する。具体的には、取得スレッド30は、取得された状態更新要求のコンテキスト70から一つ以上の対象keyを特定し、特定された一つ以上の対象keyを決定的な順序でロックする。これにより、対象keyのデッドロックを避けることができる。なお、本実施例では、対象keyをロックするとは、状態更新要求の番号(例えばnonce)と、当該状態更新要求で指定されている対象keyとをロックテーブル44に登録することである(対象keyがキーである)。「決定的な順序」とは、全ノードシステム1300において共通の所定の順序であり、例えば、対象keyの先頭符号の若い順でよい。
少なくとも一つの対象keyがロックされなければ(例えば、ロックテーブル44に少なくとも一つの対象keyが登録済であれば)、実行中の状態更新要求との競合が有るということである。この場合、取得スレッド30は、ロックされている対象keyがアンロックされること(例えば、対象keyがロックテーブル44から削除されること)を待つ。
全ての対象keyがロックされれば、実行中の状態更新要求との競合が無いということである。この場合、取得スレッド30が、別のスレッド(以下、依頼スレッド)を生成する。取得スレッド30は、当該依頼スレッドの処理を待たずに次の状態更新要求を取得する。生成された依頼スレッドが、状態更新要求の実行をサーバプログラム154に依頼する。サーバプログラム154は、複数の状態更新要求を並列に実行することができるよう構成されている。サーバプログラム154は、状態更新要求の実行依頼を受けた場合、実行中の状態更新要求の有無に関わらず(言い換えれば、実行中の一つ以上の状態更新要求があっても)、実行を依頼された状態更新要求を実行する。状態更新要求の実行が完了した場合、サーバプログラム154が、完了応答(状態更新要求の実行完了を表す応答)を、実行が完了した状態更新要求の発行元に返す。依頼スレッドが、当該完了した状態更新要求でロックされていた全ての対象keyをアンロックする。
状態更新要求の実行において、サーバプログラム154は、指定されている対象key毎に、アセットレコードをアセット810に追加する。アセットセット800に代えて最新アセットレコードセット88(図4参照)が採用されている場合、サーバプログラム154は、指定されている対象key毎に、当該対象keyに対応するアセットレコードを更新する。
中間システム80において、オーダリング管理データ455が、オーダリングテーブル44を含む。オーダリングテーブル44には、ノードシステム1300毎に、コミットオフセットが登録される。
各ノードシステム1300について、コミットオフセットは、当該ノードシステム1300において実行が完了した状態更新要求の位置を表す。当該ノードシステム1300において状態更新要求の実行が完了した場合、オーダリングプログラム454は、当該ノードシステム1300から、当該状態更新要求の取得完了を受ける。当該取得完了を受けた場合、当該ノードシステム1300について、オーダリングプログラム454は、コミットオフセットを表す情報をオーダリングテーブル144に登録する。
中間システム80が複数の中間計算機450を有する場合、中間システム80が、シーケンシャルコンシステンシー以上の一貫性を持つ一つの論理的なオーダリングシステム(複数の中間計算機450の各々に配置されたオーダリングシステムの複製)を持つ。いずれかの中間計算機450のオーダリングシステムの状態が更新された場合、状態更新後のオーダリングシステムが他の全てのオーダリングシステムに反映され、結果として、複数のオーダリングシステムの状態が同じになる。
以下、実施例1で行われる処理の詳細を、図7を参照して説明する。なお、図7を参照した説明では、ノードシステム1300Aを例に取る。また、以下の説明では、コンテキスト70はクライアントプログラム134により付加されるとする。
図7は、状態更新要求の作成から実行完了までの実施例1での流れを示すフローチャートである。
S701で、クライアントプログラム134が、ユーザプログラム124から一つ以上の対象keyを受けて、状態更新要求を作成する。作成された状態更新要求には、クライアントプログラム134により付加されたコンテキスト70が含まれる。コンテキスト70は、ユーザプログラム124から指定された対象keyを特定するための記述を含む。
S702で、クライアントプログラム134が、当該状態更新要求を発行する。
S711で、オーダリングプログラム454が、当該発行された状態更新要求を受信する。S712で、オーダリングプログラム454が、当該受信した状態更新要求をオーダリングシステム4211に入れる。
S720で、ノードシステム1300Aにおける取得スレッド30Aが、オーダリングシステム4211から状態更新要求を取得する。具体的には、取得スレッド30Aが、取得要求を中間システム80に送信する。オーダリングプログラム454が、取得スレッド30Aからの取得要求に応答して、オーダリングシステム4211のうち、出力対象の状態更新要求(ノードシステム1300Aに対応したコミットオフセットが表す位置の次の位置にある状態更新要求)を、当該取得スレッド30Aに出力する。
S721で、取得スレッド30Aが、実行管理テーブル33を参照し、取得された状態更新要求が実行済か否かを判定する。取得された状態更新要求内のnonceと同じnonceが実行管理テーブル33に登録されていなければ、当該状態更新要求は未実行である。
S721の判定結果が偽の場合(S721:No)、S722で、取得スレッド30Aが、取得された状態更新要求のコンテキスト70から、指定されている一つ以上の対象keyを特定し、一つ以上の対象keyを決定的な順序に並べ、その順序で対象keyをロックする。
S723で、取得スレッド30Aは、全ての対象keyがロックされたか否かを判定する。少なくとも一つの対象keyがロックされなかった場合(S723:No)、取得スレッド30Aは、ロックされなかった対象keyのアンロックを待ち、当該対象keyがアンロックされたときに、アンロックされた対象keyをロックする(S722)。
全ての対象keyがロックされた場合(S723:Yes)、S724で、取得スレッド30Aが、依頼スレッドを生成する。その後、取得スレッド30Aが、状態更新要求を取得可能な状態となる。なお、複数の依頼スレッドが予め用意されていてもよい。
生成された依頼スレッドが、S731で、全ての対象keyがロックされた状態更新要求の実行をサーバプログラム154Aに依頼する。サーバプログラム154Aは、当該依頼に応答して状態更新要求を実行する。当該状態更新要求の実行において、サーバプログラム154Aが、ロックされている対象key毎のアセット810の更新(例えば、アセットレコードの追加)と、当該状態更新要求の番号(例えばnonce)を例えばプライマリキーとして実行管理テーブル33に書き込むこととをアトミックに行う。状態更新要求の実行が完了した場合、サーバプログラム154Aが、当該状態更新要求の完了応答を、当該状態更新要求の発行元に返す。
S732で、依頼スレッドが、S722でロックされた全ての対象keyをアンロックする。
S733で、依頼スレッドが、コミットを行う、具体的には、当該状態更新要求の完了を中間システム80に通知する。オーダリングプログラム454が、当該通知を受けて、ノードシステム1300Aについて、オーダリングテーブル44を更新する。具体的には、オーダリングプログラム454が、当該状態更新要求の位置を表すオフセットをコミットオフセットとする。
実施例1によれば、状態更新要求に、一つ以上の対象keyを特定するための記述であるコンテキスト70が付加される。各ノードシステム1300において、取得スレッド30が、コンテキスト70から、状態更新要求で指定された対象keyを特定し、特定された対象keyが、実行中の状態更新要求で指定された対象keyと競合しているか否かを判定する。競合が無ければ、取得スレッド30が、依頼スレッドを生成し、状態更新要求を取得可能な状態となる。つまり、取得スレッド30が、状態更新要求を取得し当該状態更新要求について競合が無いと判定する都度に、依頼スレッドを生成する。生成された依頼スレッドが、状態更新要求の実行をサーバプログラム154に依頼する。サーバプログラム154は、当該依頼を受けた場合、実行中の状態更新要求があっても、実行を依頼された状態更新要求を実行する。このようにして、各ノードシステム1300において競合が無い二つ以上の状態更新要求を並列に実行でき、結果として、複数のノードシステム1300において同一のアセットレコードが得られることを担保しつつ各ノードシステム1300の利用効率を向上することができる。
実施例2を説明する。その際、実施例1との相違点を主に説明し、実施例1との共通点については説明を簡略又は省略する。
図8は、実施例2の概要を示す。
オーダリングシステム4211が、複数のパーティション4311で構成されている。オーダリングテーブル44には、例えば、パーティション4311毎に、パーティションIDとパーティション位置とが登録されている。また、オーダリングテーブル44には、パーティション4311毎に、コミットオフセットが登録される。なお、パーティション4311毎にトータルオーダ性が保証されるが、複数のパーティション4311間でのトータルオーダ性は保証されない。例えば、第1の状態更新要求がパーティション4311−1に入れられ、その後に、第2の状態更新要求がパーティション4311−2に入れられたとしても、第1の状態更新要求が第2の状態更新要求よりも先にパーティション4311−1から出るとは限らない。
以下、対象keyを基に決定される値を、便宜上、「key値」と言い、key値がN(Nは自然数)である対象keyを“keyN”と表現する。一つの対象keyに一つのパーティション4311が対応する。対象keyとパーティション4311とが1:1に対応してもよいし、連続したkey値の範囲(例えば、N=1〜10、N=11〜20)とパーティションとが1:1に対応してもよいし、離散したkey値の範囲(例えば、N=奇数、N=偶数)とパーティションとが1:1に対応してもよい。例えば、key値を用いて算出される値(例えば、key値をパーティション4311の数で除算して得られた余り)からパーティション4311が一義的に決まってもよい。図8の例によれば、key値を3(パーティション数)で除算したときの余りが1である対象key(k1、k4、k7、…)は、パーティション4311−1に対応し、key値を3で除算したときの余りが2である対象key(k2、k5、k8、…)は、パーティション4311−2に対応し、key値を3で除算したときの余りが0である対象key(k3、k6、k9、…)は、パーティション4311−3に対応する。状態更新要求で複数の対象keyが指定されている場合、当該状態更新要求は、一つのパーティション4311に入れられることもあれば、複数のパーティション4311に入れられることもある。状態更新要求で複数の対象keyが指定されている場合、オーダリングプログラム454は、対象key毎に、当該状態更新要求をコピーし、コピーされた状態更新要求を、当該対象keyに対応したパーティション4311に入れる。ただし、二つ以上の対象keyが同一パーティション4311に対応している場合、オーダリングプログラム454は、当該二つ以上の対象keyに対応した一つのパーティション4311に一つの状態更新要求を入れる。具体的には、例えば、状態更新要求で指定されている対象keyがk1及びk4の場合、k1及びk4のいずれもパーティション4311−1に対応するため、当該状態更新要求の入力先は、一つのパーティション4311−1である。また、例えば、状態更新要求で指定されている対象keyがk1及びk2の場合、k1はパーティション4311−1に対応しk2はパーティション4311−2に対応するため、当該状態更新要求の入力先は、二つのパーティション4311−1及び4311−2である。
状態更新要求で複数の対象keyが指定されている場合、オーダリングプログラム454が、当該複数の対象keyを決定的な順序でロックしてから、当該複数の対象keyに対応する一つ以上のパーティション4311に当該状態更新要求を入れる。例えば、オーダリングプログラム454は、k1及びk2を決定的な順序でロックしてから、k1及びk2が指定された状態更新要求を、パーティション4311−1及び4311−2に入れる。このような処理により、競合が有る二つ以上の状態更新要求(例えば、R1とR3)の順序がパーティション4311間で異なってしまうことを避けること、言い換えれば、競合が有る二つ以上の状態更新要求の順序を決定的な順序に保つことができる。なお、本実施例では、対象keyをロックするとは、オーダリング管理データ455内のロックテーブル46に、状態更新要求の番号(例えばnonce)と、対象keyとを登録することである(対象keyが、キーである)。
各ノードシステム1300において、取得スレッド30は、一部のパーティション4311(一つ以上のパーティション4311)から状態更新要求を取得する。図8の例によれば、各ノードシステム1300について、パーティション4311と取得スレッド30が1:1に対応する。具体的には、パーティション4311−1に取得スレッド30−1が対応し、パーティション4311−2に取得スレッド30−2が対応し、パーティション4311−3に取得スレッド30−3が対応する。各取得スレッド30は、当該取得スレッド30に対応するパーティション4311から状態更新要求を取得する。各取得スレッド30は、取得された状態更新要求で二つ以上の対象keyが取得されていて、当該二つ以上の対象keyが二つ以上のパーティション4311に対応している場合、当該二つ以上の対象keyがロックされた後、当該状態更新要求が実行される。二つ以上のパーティション4311に対応した二つ以上の対象keyは、当該二つ以上のパーティション4311に対応する二つ以上の取得スレッド30によってロックされてもよいし、当該二つ以上の取得スレッド30のうちのいずれか一つの取得スレッド30により決定的な順序でロックされてもよい。前者の一例が下記(X)であり、後者の一例が下記(Y)である。本実施例では(X)が採用される。
(X)取得スレッド30が、二つ以上の対象keyのうち、当該取得スレッド30に対応するパーティション4311に対応した一つ以上の対象keyをロックする。取得スレッド30は、状態更新要求で指定されている二つ以上の対象keyの全てがロックされた場合、当該状態更新要求の実行をサーバプログラム154に依頼する。例えば、取得スレッド30−1Aが、パーティション4311−1からR1(k1, k2)を取得した場合、パーティション4311−1に対応するk1をロックする。しかし、k2が未だロックされていないので、取得スレッド30−1Aは、R1(k1, k2)の実行をサーバプログラム154に依頼しない。その後、取得スレッド30−2Aが、パーティション4311−2からR1(k1, k2)を取得した場合、パーティション4311−2に対応するk2をロックする。結果として、k1及びk2の全てがロックされたことになるので、取得スレッド30−2Aが、R1(k1, k2)の実行をサーバプログラム154Aに依頼する。R1(k1, k2)の実行が完了した場合、取得スレッド30−1A及び30−2Aの少なくとも一つが、k1及びk2をアンロックする。
(Y)取得スレッド30が、取得された状態更新要求で指定されている二つ以上の対象keyを決定的な順序でロックする。取得スレッド30は、当該二つ以上の対象keyの全てをロックした場合、当該状態更新要求の実行をサーバプログラム154に依頼する。例えば、取得スレッド30−1Aが、パーティション4311−1からR1(k1, k2)を取得した場合、k1及びk2を決定的な順序でロックし、R1(k1, k2)の実行をサーバプログラム154Aに依頼する。その後、取得スレッド30−2Aが、パーティション4311−2からR1(k1, k2)を取得した場合、k1及びk2をロックしようとするが、k1及びk2はロック済みのため待ちとなる。R1(k1, k2)の実行が完了した場合、取得スレッド30−1Aがk1及びk2をアンロックする。このため、取得スレッド30−2Aが、k1及びk2を決定的な順序でロックしてR1(k1, k2)の実行をサーバプログラム154Aに依頼するが、サーバプログラム154Aは、R1(k1, k2)の実行が完了していることを実行管理テーブル33から特定するため、R1(k1, k2)の実行をスキップする。
図9は、状態更新要求の作成から実行完了までの実施例2での流れを示すフローチャートである。なお、図9を参照した説明では、ノードシステム1300として、ノードシステム1300Aを例に取る。
S901は、S701と同じである。S902は、S702と同じである。S911は、S711と同じである。
S912で、オーダリングプログラム454が、条件Aが満たされているか否かを判定する。条件Aは、状態更新要求で指定されている対象keyが一つであるか、又は、当該状態更新要求で指定されている二つ以上のkeyの全てが同一のパーティションに対応していることである。なお、状態更新要求で指定されている対象keyは、当該状態更新要求のコンテキスト70から特定される。S912の判定結果が真の場合(S912:Yes)、対象keyをロックすることが不要のため、S913〜S915がスキップされる。
S912の判定結果が偽の場合(S912:No)、S913で、オーダリングプログラム454が、状態更新要求で指定されている二つ以上のkeyを決定的な順序に並び替える。S914で、オーダリングプログラム454が、対象keyの並び順(つまり決定的な順序)で、当該二つ以上の対象keyをロックする。S915で、オーダリングプログラム454が、当該二つ以上の対象keyの全てをロックしたか否かを判定する。
S912の判定結果が真の場合(S912:Yes)、又は、S915の判定結果が真の場合(S915:Yes)、S916で、オーダリングプログラム454が、状態更新要求で指定されている一つ以上の対象keyの各々について、当該対象keyに対応したパーティション4311を決定する。例えば、オーダリングプログラム454が、対象key毎に、当該対象keyのkey値をパーティション数で除算することにより得られた余りから、パーティション4311を決定する。これにより、一つ以上の対象keyについて一つ以上のパーティション4311が決定される。
S917で、オーダリングプログラム454が、決定された一つ以上のパーティション4311の各々に、状態更新要求を入れる。
当該状態更新要求についてロックされている二つ以上の対象keyがあれば、S918で、オーダリングプログラム454が、当該二つ以上の対象keyをアンロックする。
S920で、取得スレッド30−1Aが、パーティション4311−1から状態更新要求を取得する。具体的には、取得スレッド30−1Aが、パーティション4311−1のパーティションIDを指定した取得要求を中間システム80に送信する。オーダリングプログラム454が、取得スレッド30−1Aからの取得要求で指定されているパーティションIDに対応したパーティション4311−1のうち、出力対象の状態更新要求を、当該取得スレッド30−1Aに出力する。
S921で、サーバプログラム154A(又は取得スレッド30−1A)が、実行管理テーブル33を参照し、取得された状態更新要求が実行済か否かを判定する。
S921の判定結果が偽の場合(S921:No)、S922で、取得スレッド30−1Aが、条件Bが満たされているか否かを判定する。条件Bは、状態更新要求で指定されている対象keyが一つであるか、又は、当該状態更新要求で指定されている二つ以上のkeyの全てが同一のパーティションに対応していることである。なお、状態更新要求で指定されている対象keyは、当該状態更新要求のコンテキスト70から特定される。S922の判定結果が真の場合(S922:Yes)、対象keyをロックすることが不要のため、S923及びS924がスキップされる。
S923で、取得スレッド30−1Aが、状態更新要求で指定されている二つ以上の対象keyのうち、パーティション4311−1に対応した一つ以上の対象keyをロックする。S924で、取得スレッド30−1Aは、ロックテーブル40Aを参照し、全ての対象keyがロックされたか否かを判定する。
全ての対象keyがロックされた場合(S923:Yes)、S925で、取得スレッド30−1Aは、状態更新要求の実行をサーバプログラム154Aに依頼し、サーバプログラム154Aが、当該状態更新要求を実行する。実行された状態更新要求について二つ以上の対象keyがロックされている場合、S927で、取得スレッド30−1Aが、当該二つ以上の対象keyをアンロックする。
ロックされていない対象keyがある場合(S923:No)、S926で、取得スレッド30−1Aは、全ての対象keyがロックされて状態更新要求が実行されるのを待つ。別の言い方をすれば、取得スレッド30−1Aは、当該状態更新要求が実行されない限り、パーティション4311−1から次の状態更新要求を取得することをしない。このケースでは、同一の状態更新要求が一つ以上の別のパーティション4311から読み出され全ての対象keyがロックされた場合に、状態更新要求が実行されることになる。例えば、取得スレッド30−2Aが、S921〜S923を行って、全ての対象keyがロックされたとする(S924:Yes)。このため、取得スレッド30−2Aが、状態更新要求の実行をサーバプログラム154Aに依頼する。実行された状態更新要求について二つ以上の対象keyがロックされている場合、S927で、取得スレッド30−2Aが、当該二つ以上の対象keyをアンロックする。取得スレッド30−1Aが、S923でロックした対象keyのアンロックを検知し、待ちを終了する。S928で、取得スレッド30−2Aが、当該状態更新要求の完了を中間システム80に通知する。オーダリングプログラム454が、当該通知を受けて、ノードシステム1300Aについて、オーダリングテーブル44を更新する(具体的には、オーダリングプログラム454が、当該状態更新要求の位置を表すオフセットをコミットオフセットとする)。
実施例2によれば、オーダリングシステム4211が複数のパーティション4311に分割され、複数の状態更新要求が複数のパーティション4311に分散する。そして、各ノードシステム1300において、複数のパーティション4311から異なる複数の取得スレッド30により複数の状態更新要求が並列に取得され、当該複数の状態更新要求がサーバプログラム154により並列に実行される。このため、各ノードシステム1300において、実施例1よりも高い並列度を実現でき、故に、ノードシステム1300の利用効率が実施例1よりも向上する。
なお、実施例2において、図9の例によれば、オーダリングプログラム454は、S912の判定結果が偽の場合、対象keyをロックした後に当該対象keyに対応したパーティション4311を決定するが、対象keyに対応したパーティション4311を決定した後に、対象keyをロックしてもよい。つまり、状態更新要求をパーティション4311に入れる前に対象keyをロックするのであれば、パーティション4311の決定と対象keyのロックはどちらが先でもよい。
また、実施例2において、取得スレッド30が、図9のS925、S927及びS928を行うことに代えて、実施例1のように、状態更新要求を取得し当該状態更新要求について競合が無いと判定する都度に、依頼スレッドを生成してもよい。依頼スレッドが、図9のS925、S927及びS928を行ってもよい。
また、実施例1及び2において、「状態更新要求の実行」は、状態更新処理の実行と改ざん検知処理の実行とを含んでいてもよいし、状態更新処理の実行を含むが改ざん検知処理の実行を含まないでよい(すなわち、実施例3及び4で述べるように、状態更新処理の実行と改ざん検知処理の実行とが分離されていてもよい)。ここで言う「改ざん検知処理」は、同一の状態更新要求について二つ以上のノードシステム1300間のアセットレコード(例えば最新アセットレコード(末端アセットレコード))又はそれのHVが同一か否かを判定することを含んでよい。また、「改ざん検知処理」は、例えば、状態更新要求で指定された対象keyに対応したアセットレコード(例えば最新アセットレコード)のHVを、サーバプログラム154Aが、当該アセットレコードよりも過去のアセットレコードを用いて検証することを含んでもよい。
また、実施例1及び2の少なくとも一つにおいて、オーダリングプログラム454の機能は、中間システム80に代えて、各クライアントシステム13のクライアントプログラム134が有していてもよい。
また、実施例1及び2の少なくとも一つにおいて、複数の状態更新要求を並列に実行することができるサーバプログラム154に代えて、状態更新要求を実行するためのスレッド(以下、実行スレッド)が、複数存在し、複数の実行スレッドが、複数の状態更新要求を並列に実行してもよい。複数の実行スレッドは、予め用意されていてもよいし、動的に生成されてもよい。
また、実施例1及び2において、コンテキスト付加部は、クライアントプログラム134(要求発行部の一例)に含まれる。クライアントプログラム134は、ユーザプログラム124から一つ以上の対象keyの指定を受けるので、状態更新要求を仮実行すること無しに、状態更新要求にコンテキスト70を付加できる。実施例1及び2の少なくとも一つにおいて、コンテキスト付加部は、クライアントプログラム134に含まれない機能でよい。この場合、コンテキスト付加部は、状態更新要求の仮実行をすることにより、当該状態更新要求で指定された一つ以上の対象keyを特定し、特定された一つ以上の対象keyを特定するための記述であるコンテキスト70を作成し、作成したコンテキスト70を当該状態更新要求に付加してよい。コンテキスト付加部は、クライアントシステム13(第1の計算機システムの一例)、中間システム80、サーバシステム15(第2の計算機システムの一例)、及び、それらのシステム13、80及び15以外のシステムに備えられてよい。すなわち、実施例1及び2において、コンテキスト70は、状態更新要求が実行されるまでのいずれかの段階において付加されればよい。具体的には、実施例1では、状態更新要求にコンテキスト70が付加されることは、当該状態更新要求がキューに入る前でも当該状態更新要求がキューから出た後のいずれにおいて行われてもよい。実施例2では、状態更新要求にコンテキスト70が付加されることは、当該状態更新要求がパーティションに入る前に行われればよい。コンテキスト70の付加方法としては、下記のうちのいずれかが採用されてよい。
・実施例1及び2の少なくとも一つにおいて、クライアントプログラム134が、ユーザプログラム124から一つ以上の対象keyの指定を受け、コンテキスト70を、クライアントプログラム134が送信する状態更新要求に付加してよい。
・実施例1及び2の少なくとも一つにおいて、オーダリングプログラム454が、状態更新要求がオーダリングシステム4211に入る際、又は、状態更新要求がオーダリングシステム4211から出る際に、当該状態更新要求を仮実行することで一つ以上の対象keyを特定し、特定した一つ以上の対象keyを特定するための記述であるコンテキスト70を状態更新要求に付加してよい。
・実施例1において、取得スレッド30が、オーダリングシステム4211から出た状態更新要求を仮実行することで一つ以上の対象keyを特定し、特定した一つ以上の対象keyを特定するための記述であるコンテキスト70を状態更新要求に付加し、コンテキスト70が付加された状態更新要求を、サーバプログラム154に渡してよい。
・実施例1及び2の少なくとも一つにおいて、ノードシステム1300(例えば、取得スレッド30)が、クライアントプログラム134からの状態更新要求を仮実行することで一つ以上の対象keyを特定し、特定した一つ以上の対象keyを特定するための記述であるコンテキスト70を状態更新要求に付加し、コンテキスト70が付加された状態更新要求をクライアントプログラム134に送信してよい。クライアントプログラム134が、当該状態更新要求をオーダリングプログラム454に送信してよい。
実施例1及び2は、例えば下記のように総括されてもよい。
データ管理システムが、一つ又は複数のコンテキスト付加部と、一つ又は複数の競合判定部とを備える。一つ又は複数の第1の計算機システムに、一つ又は複数の要求発行部が備えられる。一つ又は複数の第1の計算機システムと通信する第2の計算機システムにおける複数のノードシステムに、複数の要求実行部が備えられる。第1の計算機システムにおける要求発行部が、状態更新要求を発行する。当該状態更新要求が、オーダリングシステムに入れられる。状態更新要求は、一つ以上の引数を含む引数群と、当該引数群を使用する状態更新処理の内容を表す記述又は当該記述へのリンクである処理内容とを含む。状態更新処理は、一つ以上の対象の各々について、当該対象の状態を表すデータであるオブジェクトを更新する処理である。オーダリングシステムは、一つ又は複数のパーティションで構成され、パーティション毎に、トータルオーダ性を保証するシステムである。コンテキスト付加部が、状態更新要求に、一つ以上の対象を特定するための記述であるコンテキストを付加する。ノードシステム毎に、前記オーダリングシステムから状態更新要求が出される都度に、競合判定部が、当該状態更新要求のコンテキストから一つ以上の対象を特定し、当該特定された一つ以上の対象が当該ノードシステムにおいて実行中の一つ以上の状態更新要求で指定された一つ以上の対象と競合するか否かの競合判定を行う。当該競合判定の結果が、競合が無いとの結果の場合に、当該ノードシステムにおける要求実行部が、当該状態更新要求を実行する。
前記オーダリングシステムから出された状態更新要求について、競合判定部は、当該状態更新要求のコンテキストから特定された一つ以上の対象をロックしてよい。当該一つ以上の対象の全てがロックされた場合、前記競合判定の結果が、競合が無いとの結果でよい。
前記オーダリングシステムが前記複数のパーティションで構成されているケース(以下、マルチパーティションケース)において、各状態更新要求は、当該状態更新要求のコンテキストから特定された一つ以上の対象に対応する一つ以上のパーティションに入れられてよい。各競合判定部は、当該競合判定部に対応したパーティションから出された状態更新要求のコンテキストから、一つ以上の対象を特定してよい。
マルチパーティションケースにおいて、パーティションから出された状態更新要求について、特定された対象が二つ以上であり、且つ、当該二つ以上の対象が、当該パーティションを含む二つ以上のパーティションに対応している場合、当該パーティションに対応した競合判定部が、当該二つ以上の対象のうち、少なくとも当該パーティションに対応した対象をロックしてよい。当該二つ以上の対象の全てがロックされた場合、前記競合判定の結果が、競合が無いとの結果でよい。
マルチパーティションケースにおいて、パーティションから出された状態更新要求について、特定された対象が一つであるか、又は、特定された二つ以上の対象の全てが一つのパーティションに対応している場合、当該状態更新要求について前記競合判定が行われること無しに、当該状態更新要求が実行されてよい。
マルチパーティションケースにおいて、前記一つ又は複数の要求発行部の各々、又は、前記オーダリングシステムを有する計算機システムに備えられるオーダリング管理部が、下記をおこなってよい。
・状態更新要求のコンテキストから一つ以上の対象を特定する。
・特定された対象が二つ以上であり、且つ、当該二つ以上の対象に二つ以上のパーティションに対応している場合、当該二つ以上の対象を決定的な順序でロックする。
・当該二つ以上の対象の全てがロックされた場合に、当該二つ以上のパーティションの各々に、当該状態更新要求を入れる。
・当該二つ以上の対象を全てアンロックする。
マルチパーティションケースにおいて、前記一つ又は複数の要求発行部の各々、又は、前記オーダリングシステムを有する計算機システムに備えられるオーダリング管理部が、下記を行ってよい。
・状態更新要求のコンテキストから一つ以上の対象を特定する。
・特定された対象が一つであるか、又は、特定された二つ以上の対象の全てが一つのパーティションに対応している場合、特定された一つ以上の対象をロックすること無しに、当該状態更新要求を当該パーティションに入れる。
前記一つ又は複数の要求発行部が、前記一つ又は複数のコンテキスト付加部を含んでよい。
前記コンテキスト付加部が、状態更新要求の仮実行をすることにより、当該状態更新要求で指定された一つ以上の対象を特定してよい。前記コンテキスト付加部が、当該特定された一つ以上の対象を特定するための記述であるコンテキストを作成し、当該作成したコンテキストを当該状態更新要求に付加してよい。
以下、実施例3を説明する。その際、実施例1及び2との相違点を主に説明し、実施例1及び2との共通点については説明を簡略又は省略する。
図10は、実施例3に係るシステム全体の構成の一例を示す。
サーバシステム15において、ノードシステム1300の処理速度(例えば、構成及び性能)は、異なっていてよい。例えば、ノードシステム1300Aは、通信ネットワーク1400Aに接続された四つのサーバ計算機150Aa、150Ab、150Ac及び150Adで構成されている。ノードシステム1300Bは、通信ネットワーク1400Bに接続された二つのサーバ計算機150Ba及び150Bbで構成されている。図10に例示の全てのサーバ計算機150の処理速度が同じ場合、ノードシステム1300Bの処理速度はノードシステム1300Aの処理速度より低い。このように、複数のノードシステム1300の処理速度は異なっていてよい。なお、図10の例では、各通信ネットワーク1400は通信ネットワーク19に接続されているが、少なくとも一つの通信ネットワーク1400は通信ネットワーク19と一体でもよい。
このように、個々のノードシステム1300は、当該ノードシステム1300とは別のノードシステム1300の処理速度を考慮することなく構成されてよい。
BFT(Byzantine Fault Tolerance)コンセンサスアルゴリズムやそれに類似したブロックチェーン等の仕組みが適用された一般的なデータ管理システムによれば、サーバシステムにおける複数のノードシステムの各々が、対象毎に、オブジェクト(対象の状態を表すデータ)を管理する。サーバシステムがクライアントシステムから状態更新要求を受信する都度に、各ノードシステムが、オブジェクトの改ざんの有無を検知する改ざん検知処理を実行する。各ノードシステムにおいて、「改ざん検知処理」は、現在(状態更新処理の実行前)のオブジェクトの改ざんの有無を検知することと、状態更新処理を途中まで実行することで得られた更新後のオブジェクトの改ざんの有無を検知することとの少なくとも一つを含む。複数のノードシステムにおいて同様の改ざん検知処理が実行される。全ノードシステムの改ざん検知処理の実行が完了しないと、いずれのノードシステムも、状態更新処理を実行することができない。また、いずれかのノードシステムが先に状態更新処理の実行を完了できたとしても、全ノードシステムにおいて当該状態更新処理の実行が完了しないと、当該状態更新要求に関連する次の状態更新要求について、いずれのノードシステムも状態更新処理を実行することができない。全ノードシステムに更新後オブジェクトがあるとは限らず、故に、当該次の状態更新要求について、全ノードシステムの改ざん検知処理の実行が完了しないためである。このため、複数のノードシステムの処理速度が同じであることが望ましい。複数のノードシステムの処理速度が異なっていると、処理速度が相対的に低いノードシステムの処理結果を待つ必要が起こり、システム全体の利用効率が低下するからである。
一方、実施例3では、後に詳述するように、状態更新処理の実行と、二つ以上のノードシステム1300のアセットレコード又はそのサマリを比較する改ざん検知処理の実行とが分離されている。具体的には、データ管理システムが、複数のノードシステム1300に備えられる複数の要求実行部の他に、一つ又は複数の改ざん検知実行部を備える。改ざん検知実行部は、改ざん検知処理を実行する。各ノードシステム1300において、要求実行部は、状態更新要求毎に、状態更新処理を実行し、改ざん検知処理の実行無しに、当該状態更新要求の完了を応答する。このため、サーバシステム15における全てのノードシステム1300の処理速度が同じである必要が無い。故に、サーバシステム15の構成の柔軟性を高めることができ、結果として、高効率にスケーラビリティを高めることができる。
また、状態更新処理の実行と改ざん検知処理の実行とが分離されているので、状態更新処理が各ノードシステム1300で独立して行われる。クライアントシステム13は、少なくとも一つのノードシステム1300から状態更新処理の完了応答が返ってくれば、関連する次の状態更新要求を送信できる。当該次の状態更新要求についても、状態更新処理が各ノードシステム1300で独立して行われる。このため、クライアントシステム13にとって状態更新要求のレイテンシが速い。
本実施例では、改ざん検知実行部は、クライアントプログラム134に含まれるが、改ざん検知実行部は、クライアントシステム13においてクライアントプログラム134とは別のプログラムが実行されることにより実現される機能でもよいし、クライアントシステム13以外のシステム、例えば、監査システム(監査の役割を担う計算機システム)に備えられてよい。一部のクライアントシステム13、一部のノードシステム1300又は中間システム80の少なくとも一つが監査システムを兼ねてもよい。
図11は、実施例3の概要の一例を示す。なお、図11において、「Rx」(xは自然数)は、状態更新要求を表す。
クライアントプログラム154から発行された状態更新要求は、オーダリングシステム4211に入り、オーダリングシステム4211から複数のノードシステム1300の各々に出るようになっている。各ノードシステム1300において、サーバプログラム154が、状態更新要求の実行として、状態更新処理を実行し(例えば、指定された対象のアセットに末端アセットレコードを追加し)、改ざん検知処理の実行無しに、当該状態更新要求の完了を、クライアントプログラム134に応答する。状態更新要求を発行したクライアントプログラム154は、少なくとも一つのノードシステム1300から当該要求に対する完了応答を受ければ、状態の更新が完了したと認識する。
上述したように、本実施例では、状態更新要求の実行の完了に、二つ以上のノードシステム1300でのアセットレコード又はそのサマリを比較する改ざん検知処理の実行は不要である。このため、状態更新要求は全てのノードシステム1300に送信されるものの、更新完了要求(状態更新処理の実行が完了した状態更新要求)の数は、ノードシステム1300間で必ずしも同じにはならない。図11の例では、オーダリングシステム4211に入っているR1〜R5のうち、ノードシステム1300Aでの更新完了要求は、R1〜R4であるが、ノードシステム1300Bでの更新完了要求は、R1及びR2のみである。
クライアントプログラム134は、一つ又は複数の更新完了要求のうちの共通完了要求について改ざん検知処理を実行する。共通完了要求は、複数のノードシステム1300のうちの二つ以上のノードシステム1300に共通の更新完了要求である。図11の例では、ノードシステム1300A及び1300Bでの共通完了要求は、R1及びR2である。クライアントプログラム134は、少なくとも一つの共通完了要求について改ざん検知処理を実行する。
データ管理システムのアプリケーションの要件によっては、改ざん検知処理が、必ずしも状態更新要求の受信の都度に直ちに実行されなくてもよい、及び/又は、全ての状態更新要求について必ずしも改ざん検知処理の実行が必要とされないと考えられる。例えば、対象が口座であり対象の状態が残高であるアプリケーションにおいて、残高は、入金及び出金のいずれのときにも変わるが、当該アプリケーションの要件によっては、入金については残高の改ざん検知処理の実行は不要であり出金について残高の改ざん検知処理が実行されればよいと考えられる。本実施例では、状態更新処理の実行と改ざん検知処理の実行とが分離されているので、改ざん検知処理の実行のタイミングを柔軟に決定することができる、及び/又は改ざん検知処理の実行対象とする共通完了要求を柔軟に選択することができる。例えば、改ざん検知処理の実行頻度を、状態更新要求の発行頻度より少なくしたり、対象毎に、改ざん検知処理の実行が必要とされる共通完了要求を一つ以上の共通完了要求のうちの一部の共通完了要求(例えば、最新の共通完了要求)に絞ったりすることができる。
なお、改ざん検知処理は、Nのノードシステム1300(Nは、2以上の整数であり、サーバシステム15を構成するノードシステム1300の数)のうちMのノードシステム1300(Mは、2以上N以下の整数)について実行されてよい。つまり、必ずしもM=Nでなくてもよい。以下の説明では、説明を簡単にするために、M=Nとする。
また、本実施例では、各対象について、当該対象を指定した状態更新要求の実行による状態の履歴の一例として、アセット810(図4参照)が採用される。
以下、実施例3で行われる処理の詳細を、図12〜図13を参照して説明する。なお、以下、実施例3の説明では、説明を簡単にするために、サーバシステム15を構成するNのノードシステム1300は、ノードシステム1300A及び1300Bであるとする。
図12は、状態更新要求の作成から実行完了までの実施例3での流れを示すフローチャートである。
S1201で、クライアントプログラム134が、状態更新要求を作成する。当該状態更新要求は、例えば、key、Sig、nonce等を含む。状態更新要求にコンテキスト70が付加されてもよい。S1202で、クライアントプログラム134が、当該状態更新要求を発行する。
S1211で、オーダリングプログラム454が、当該状態更新要求を受信する。S1212で、オーダリングプログラム454が、当該受信した状態更新要求をオーダリングシステム4211に入れる。
ノードシステム1300Aを例に取り、S1221及びS1222を説明する。S1221Aで、サーバプログラム154Aは、オーダリングシステム4211から状態更新要求を取得する。S1222Aで、サーバプログラム154Aは、当該状態更新要求を実行する。具体的には、S1222Aで、サーバプログラム154Aは、状態更新処理を実行するが、改ざん検知処理を実行しない。S1222Aは、実施例1のS721〜S724及びS731〜S733(図7参照)でもよい。また、S1222Aは、実施例2のS921〜S928(図9参照)でもよい。
ノードシステム1300A及び1300Bの各々について、状態更新要求が完了する都度に、状態更新要求に対する応答(例えば完了応答)がクライアントプログラム134に返却される。ノードシステム1300A及び1300Bのうちのいずれがメインのノードシステムであるかが予め決められていて、メインのノードシステムだけが、状態更新要求に対する応答をクライアントプログラム134に返却してもよい(メインのノードシステム以外のノードシステムは、状態更新要求が完了しても、状態更新要求に対する応答をクライアントプログラム134に返却しないでよい)。以下、図12の説明において、一つの状態更新要求を例に取る(図12の説明において「注目状態更新要求」)。
S1231で、クライアントプログラム134は、当該クライアントプログラム134が発行した注目状態更新要求の応答を受信する。
S1232で、クライアントプログラム134は、受信した応答に関し何らかの処理を実行する。例えば、当該受信した応答が、注目状態更新要求について初めて受信された応答であれば、クライアントプログラム134は、当該応答から注目状態更新要求の結果を解釈する。一方、当該応答が、注目状態更新要求について既に応答を受信した後に受信した応答であれば、クライアントプログラム134は、当該受信した応答を破棄する。つまり、注目状態更新要求について、最初に受信した応答が有効とされる。なお、クライアントプログラム134は、当該受信した応答を破棄せずに例えば一定期間保存しておいて、他のノードシステム1300からの応答と比較してもよい。
図13は、改ざん検知処理の実行のフローチャートである。
S1301で、クライアントプログラム134が、age問合せを作成する。age問合せでは、少なくとも一つの対象keyが指定される。以下、説明を簡単にするために、一つのage問合せには一つの対象key(図13の説明において「注目key」)が指定されるとする。age問合せは、注目keyの最大ageの問合せである。S1302で、クライアントプログラム134が、当該age問合せを送信する。age問合せは、中間システム80経由又は非経由で、ノードシステム1300A及び1300Bの各々に送信される。
ノードシステム1300Aを例に取り、S1311及びS1312を説明する。S1311Aで、ノードシステム1300Aにおけるサーバプログラム154Aは、age問合せを受信する。S1312Aで、サーバプログラム154Aは、当該age問合せで指定されている注目keyの最大age(注目keyの末端アセットレコード内のage)を例えばリニアライザブルに取得し、当該最大ageを、age問合せの送信元に回答する。なお、S1312Aの前に、サーバプログラム154Aは、注目keyに対応したアセット810を構成する各アセットレコードの改ざん検知処理を行ってもよい。
S1321で、クライアントプログラム134は、最大ageを受信する。S1322で、クライアントプログラム134は、ノードシステム1300A及び1300Bの全てから最大ageを受信したか否かを判定する。S1322の判定結果が偽の場合(S1322:No)、クライアントプログラム134は、ノードシステム1300A及び1300Bの全てから最大ageを受信することを待つ。
S1322の判定結果が真の場合(S1322:Yes)、S1323で、クライアントプログラム134は、受けた最大ageのうち最大の共通age(言い換えれば、受けた最大ageの最小値)を特定する。例えば、ノードシステム1300Aからの最新ageが“8”でノードシステム1300Bからの最新ageが“6”の場合、最大の共通ageは“6”である。S1324で、クライアントプログラム134は、上記注目keyとS1322で特定した最大共通ageとを指定したレコード問合せを作成する。S1325で、クライアントプログラム134は、当該レコード問合せを送信する。レコード問合せは、中間システム80経由又は非経由で、ノードシステム1300A及び1300Bの各々に送信される。
ノードシステム1300Aを例に取り、S1331〜S1333を説明する。S1331Aで、ノードシステム1300Aにおけるサーバプログラム154Aは、レコード問合せを受信する。S1332Aで、サーバプログラム154Aは、当該レコード問合せで指定されている注目key及び最大共通ageを持つアセットレコード又はそのサマリ(例えば、HV)を例えばリニアライザブルに取得する。S1333Aで、サーバプログラム154Aは、当該アセットレコード又はそのサマリを、レコード問合せの送信元に回答する。
S1341で、クライアントプログラム134は、注目key及び最大共通ageを持つアセットレコード又はそのサマリを受信する。S1342で、クライアントプログラム134は、ノードシステム1300A及び1300Bの全てから注目key及び最大共通ageを持つアセットレコード又はそのサマリを受信したか否かを判定する。S1342の判定結果が偽の場合(S1342:No)、クライアントプログラム134は全てのノードシステム1300A及び1300Bからアセットレコード又はそのサマリを受信することを待つ。
S1342の判定結果が真の場合(S1342:Yes)、S1343で、クライアントプログラム134は、受信した全てのアセットレコード又はそのサマリが一致するか否かを判定する。S1343の判定結果が真の場合(S1343:Yes)、S1344で、クライアントプログラム134は、改ざん無しと判定する。S1343の判定結果が偽の場合(S1343:No)、S1345で、クライアントプログラム134は、改ざん有りと判定する。
以上が、改ざん検知処理の実行の説明である。
改ざん検知処理の実行において、age問合せの作成及び送信のタイミングは、アプリケーションの要件又はその他に応じて柔軟に設定可能である。
また、改ざん検知処理の実行において、改ざんの有無が検知される共通ageも、アプリケーションの要件又はその他に応じて柔軟に設定可能である。例えば、改ざん有無が検知される一つ以上の共通ageは、最大共通ageのみでもよいし、最大共通ageと最大共通ageよりも小さい(古い)全ての共通ageでもよいし、最大共通ageと最大共通ageよりも小さい共通ageとのうちの任意の一つ以上の共通ageでもよい。
以下、実施例4を説明する。その際、実施例3との相違点を主に説明し、実施例3との共通点については説明を簡略又は省略する。
実施例3では、クライアントプログラム134が、age問合せを各ノードシステム1300に送信し、最大ageの回答を各ノードシステム1300から受け、最大の共通ageを特定する。その後に、クライアントプログラム134が、特定した最大の共通ageを指定したレコード問合せを各ノードシステム1300に送信し、最大の共通ageのアセットレコード又はそれのサマリを各ノードシステム1300から受ける。つまり、クライアントプログラム134と各ノードシステム1300間で2段階のやり取りが行われる。
実施例4では、クライアントプログラム134と各ノードシステム1300間でのやり取りは1段階である。
図14は、実施例4に係る改ざん検知処理の実行のフローチャートである。
S1401で、クライアントプログラム134が、レコード問合せを作成する。S1401で作成されるレコード問合せでは、少なくとも一つの対象keyが指定される。以下、説明を簡単にするために、一つのレコード問合せには一つの対象key(図14の説明において「注目key」)が指定されるとする。S1401で作成されるレコード問合せは、注目keyの全アセットレコードの問合せである。S1402で、クライアントプログラム134が、当該レコード問合せを送信する。レコード問合せは、中間システム80経由又は非経由で、ノードシステム1300A及び1300Bの各々に送信される。
ノードシステム1300Aを例に取り、S1411及びS1412を説明する。S1411Aで、ノードシステム1300Aにおけるサーバプログラム154Aは、レコード問合せを受信する。S1412Aで、サーバプログラム154Aは、当該レコード問合せで指定されている注目keyの全アセットレコード(アセット810)を例えばリニアライザブルに取得し、当該全アセットレコード(又は、全アセットレコードにそれぞれ対応した全アセットレコードサマリと全age(全アセットレコードのage))を、レコード問合せの送信元に回答する。なお、S1412Aの前に、サーバプログラム154Aは、注目keyに対応したアセット810を構成する各アセットレコードの改ざん検知処理を行ってもよい。
S1421で、クライアントプログラム134は、少なくとも一つのノードシステム1300から全アセットレコード(又は、全アセットレコードサマリと全age)を受信する。S1422で、クライアントプログラム134は、ノードシステム1300A及び1300Bの全てから全アセットレコード(又は、全アセットレコードサマリと全age)を受信したか否かを判定する。S1422の判定結果が偽の場合(S1422:No)、クライアントプログラム134は、ノードシステム1300A及び1300Bの全てから全アセットレコード(又は、全アセットレコードサマリと全age)を受信することを待つ。
S1422の判定結果が真の場合(S1422:Yes)、S1423で、クライアントプログラム134は、ノードシステム1300A及び1300Bの全アセットレコード(又は、全アセットレコードサマリと全age)から、最大の共通ageを特定し、特定された最大共通ageを含む共通アセットレコードである最新共通アセットレコード(又は、当該共通アセットレコードのサマリである最新共通アセットレコードサマリ)を特定する。「共通アセットレコード」は、共通完了要求(別の言い方をすれば、共通age)に対応したアセットレコードである(「共通アセットレコードサマリ」は、共通アセットレコードのサマリである)。
S1424で、クライアントプログラム134は、特定された最新共通アセットレコード(又は、最新共通アセットレコードサマリ)がノードシステム1300A及び1300B間で一致するか否かを判定する。S1424の判定結果が真の場合(S1424:Yes)、S1425で、クライアントプログラム134は、改ざん無しと判定する。S1424の判定結果が偽(S1424:No)となったアセットレコードについては、S1426で、クライアントプログラム134は、改ざん有りと判定する。
以上が、実施例4に係る改ざん検知処理の一例である。
なお、図14の説明において、各ノードシステム1300について、注目keyに対応した「全アセットレコード」は、必ずしもアセット810それ自体としての全アセットレコードでなくてもよい。例えば、S1401で作成されたレコード問合せでは、注目keyについて、レコード条件が指定されてもよい。「レコード条件」は、例えば、アセットレコードの追加日時に関する条件でよい。この場合、「全アセットレコード」とは、指定されたレコード条件に該当する全アセットレコードでよい。
また、S1423では、最新共通アセットレコード(又は、最新共通アセットレコードサマリ)に代えて、全共通アセットレコード(又は、全共通アセットレコードサマリ)が特定されてもよいし、最新共通アセットレコードを含む又は除く一部の共通アセットレコード(又は、最新共通アセットレコードサマリを含む又は除く一部の共通アセットレコードサマリ)が特定されてもよい。
また、クライアントプログラム134は、クライアントシステム130の通信状況及び/又はその他の状況に応じて、実施例3に係る改ざん検知処理と実施例4に係る改ざん検知処理のいずれを行うかを、選択してもよい。
実施例3及び4は、例えば下記のように総括されてもよい。
データ管理システムが、一つ又は複数の改ざん検知実行部と、一つ又は複数の第1の計算機システムと通信する第2の計算機システムにおける複数のノードシステムに備えられた複数の要求実行部とを備える。第1の計算機システムに備えられる要求発行部が、対象を指定した状態更新要求を発行する。各ノードシステムにおいて、要求実行部は、状態更新要求毎に、指定されている対象の状態を表すデータであるオブジェクトを更新する状態更新処理を実行し、改ざん検知処理の実行無しに、当該状態更新要求の完了を応答する。改ざん検知実行部が、一つ又は複数の更新完了要求のうちの一つ以上の共通完了要求の各々について、前記複数のノードシステムの更新後のオブジェクト又はそのサマリを比較することにより当該更新後オブジェクトの改ざんの有無を検知する改ざん検知処理を実行する。更新完了要求は、状態更新処理の実行が完了している状態更新要求である。共通完了要求は、前記複数のノードシステムのうちの二つ以上のノードシステムに共通の更新完了要求である。
各ノードシステムにおいて、前記指定された対象の状態を表すオブジェクトは、当該状態の世代を表すデータを含んでよい。前記指定された対象について、前記改ざん検知実行部が、下記を行ってよい。
・前記改ざん検知実行部が、前記複数のノードシステムの各々から、当該対象の状態の最新世代を表す最新世代情報を受信する。
・前記改ざん検知実行部が、前記複数のノードシステムの最新世代情報から最新の共通の世代を特定する。
・前記改ざん検知実行部が、当該特定された最新の共通の世代を含む一つ又は複数の共通の世代うちの一つ以上の共通の世代を前記二つ以上のノードシステムの各々に指定する。
・前記改ざん検知実行部が、当該一つ以上の共通の世代の各々について、当該共通の世代に対応した共通完了要求の更新後オブジェクト又はそのサマリを前記二つ以上のノードシステムの各々から受信する。
また、前記指定された対象について、前記改ざん検知実行部が、下記を行ってよい。
・前記改ざん検知実行部が、前記複数のノードシステムの各々から、当該対象について、全ての更新後オブジェクト、又は、全ての更新後オブジェクトサマリを受信する。更新後オブジェクトサマリは、更新後のオブジェクトのサマリである。
・前記改ざん検知実行部が、前記複数のノードシステムの全ての更新後オブジェクト又は全ての更新後オブジェクトサマリから、前記複数のノードシステムの少なくとも一つの共通更新後オブジェクト又は少なくとも一つの共通更新後オブジェクトサマリを特定する。共通更新後オブジェクトは、共通完了要求に対応した更新後オブジェクトである。共通更新後オブジェクトサマリは、共通更新後オブジェクトのサマリである。
・前記改ざん検知実行部が、前記複数のノードシステムの共通更新後オブジェクト又はそのサマリを比較することにより当該共通更新後オブジェクトの改ざんの有無を検知する。
実施例3及び4の少なくとも一つに係るデータ管理システムは、実施例1及び2の少なくとも一つに係るデータ管理システムが有する機能(例えば、コンテキスト付加部及び競合判定部)を含んでいてもいなくてもよい。また、実施例3及び4の少なくとも一つにおいて、オーダリングシステムは、一つのパーティションで構成されていてもよいし、複数のパーティションで構成されていてもよい。
以上、幾つかの実施例を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実行することが可能である。
例えば、アセットセット800は、UTXO(Unspent Transaction Output)のようなDAG構造の複数のトランザクションでもよい(各トランザクションは、一つ以上の入力と一つ以上の出力とを含む)。つまり、ノードとなるオブジェクトが、トランザクションでよく、エッジが表す関係が、トランザクション間の関係でよい。
また、例えば、処理ロジック、Arg、nonceのうちの少なくとも一つについてユーザの秘密鍵を用いた電子署名は作成されないでもよい。従って、例えば、クライアントプログラム134から発行される要求に、BL、nonce及びSigのうちの少なくとも一つは関連付けられないでもよい。
また、例えば、各ノードシステム1300において、アセットレコードの追加(書き込み)又は取得(読み込み)は、リニアライザブル及び/又はシリアライザブルに行われてよい。