(57)【特許請求の範囲】
【請求項１】
イベントを配信するためのコンピューター実装方法であって、
イベント待ち行列においてイベントの発行を受けるステップであって、前記イベントが特定のタイプのイベントである、ステップと、
複数の異なる処理エージェントのうちの処理エージェントに前記イベントをマッピングするステップであって、前記処理エージェントが前記特定のタイプのイベントを受けることになり、前記処理エージェントが前記イベントを受けることを明示的に登録申込みしていない、ステップと、
前記処理エージェントが有効化されていないことを決定するステップと、
前記処理エージェントが有効化されていないと決定したことに応答して、前記処理エージェントを有効化するステップであって、前記処理エージェントがアプリケーションに対し機能を提供するために利用可能となるようにする、ステップと、
前記イベントを前記処理エージェントに配信するステップと、
前記処理エージェントから登録申込みを受けるステップと、
前記イベント待ち行列において１つ以上の追加のイベントの１つ以上の追加の発行を受けるステップであって、前記１つ以上の追加のイベントが前記特定のタイプのイベントの関連し、前記１つ以上の追加のイベントが、前記処理エージェントから前記登録申込みを受けた後に発生する、ステップと、
前記登録申込みに少なくとも部分的に基づいて、前記１つ以上の追加のイベントを前記処理エージェントに配信するステップと、
１つ以上の過去のイベントが配信されることを前記登録申込みが要求していると決定するステップであって、前記登録申込みを前記処理エージェントから受ける前に前記１つ以上の過去のイベントが前記イベント待ち行列において発行されている、ステップと、
前記１つ以上の過去のイベントが配信されることを前記登録申込みが要求していると決定したことに応答して、前記１つ以上の過去のイベントを前記処理エージェントに配信するステップと、
を含む、方法。
【請求項２】
請求項１記載の方法において、前記イベント待ち行列において前記イベントの発行を受けるステップが、
前記イベントをイベント待ち行列において発行する要求を受けるステップと、
前記イベントに対応する仮想ストリームを有効化するステップと、
前記仮想ストリームを介して前記イベント待ち行列において前記イベントを発行するステップと、
を含む、方法。
【請求項３】
請求項１記載の方法において、前記１つ以上のイベントに対する前記登録申込みが仮想ストリームを定め、前記登録申込みが、前記１つ以上の追加のイベントに対応する前記仮想ストリームに対する登録申込みである、方法。
【請求項４】
請求項３記載の方法において、前記処理エージェントを有効化するステップが、システム・リソースを前記処理エージェントに割り当てるステップを含み、前記仮想ストリームに対する前記登録申込みが前記仮想ストリームを有効化し、システム・リソースを前記仮想ストリームに割り当てさせる、方法。
【請求項５】
請求項４記載の方法であって、更に、
一定の時間期間にわたって前記仮想ストリームにおいてイベントが受けられないとき、前記仮想ストリームに割り当てられたシステム・リソースを取り戻すことによって、前記仮想ストリームを無効化するステップと、
前記処理エージェントが所与の時間期間にわたってアイドルになったとき、前記処理エージェントに割り当てられたシステム・リソースを取り戻すことによって、前記処理エージェントを無効化するステップと、
を含む、方法。
【請求項６】
請求項１記載の方法において、前記処理エージェントの構成が、プロプラミングによって得られるか、または前記処理エージェントの宣言的定義から決定される、方法。
【請求項７】
請求項１記載の方法において、前記処理エージェントが有効化されているか否かに関係なく、前記イベントを配信するために前記処理エージェントがアドレス可能である、方法。
【請求項８】
請求項１記載の方法において、前記特定のタイプのイベントが、ビデオ・ゲームの特性に関連付けられ、前記１つ以上の追加のイベント及び前記１つ以上の過去のイベントを含む前記イベント待ち行列において発行された前記特定のタイプのイベントの全てのイベントを前記登録申込みが要求する、方法。
【請求項９】
ランタイムを実行する１つ以上の計算デバイスを含むシステムであって、前記ランタイムが、
イベントの発行を受けて永続化するための待ち行列を管理し、
仮想ストリームにおいて特定のタイプのイベントの発行を受け、前記イベントの発行を前記待ち行列に転送し、
複数の異なる処理エージェントのうちの処理エージェントに、前記特定のタイプの前記イベントをマッピングし、前記処理エージェントが、前記特定のタイプの前記イベントを受けることを明示的に登録申込みしておらず、前記処理エージェントが有効化されているかまたは有効化されていないかには関係なく、前記特定のタイプの前記イベントを配信するために前記処理エージェントがアドレス可能であり、
前記処理エージェントが有効化されていないことを決定し、
前記処理エージェントが有効化されていないと決定したことに応答して、前記処理エージェントを有効化して、前記処理エージェントがアプリケーションに対し機能を提供するために利用可能となるようにし、
前記特定のタイプの前記イベントを前記処理エージェントに配信し、
前記特定のタイプの前記イベントが前記処理エージェントに配信された後に、前記処理エージェントから前記仮想ストリームに対する明示的登録申込みを受け、前記明示的登録申込みが、前記待ち行列において発行された前記特定のタイプのすべてのイベントを要求し、
前記明示的登録申込みを受けた後に１つ以上の追加のイベントの１つ以上の追加の発行を前記仮想ストリームにおいて受け、前記１つ以上の追加のイベントの前記１つ以上の追加の発行を前記待ち行列に転送し、
前記明示的登録申込みに少なくとも部分的に基づいて、前記１つ以上の追加のイベントを前記処理エージェントに配信し、
前記明示的登録申込みが受けられる前に、前記待ち行列において前記特定のタイプの過去のイベントが発行されていることを決定し、
前記待ち行列において発行された前記特定のタイプの前記過去のイベントを引き出し、
前記特定のタイプの前記過去のイベントを前記処理エージェントに配信する、
ように構成される、システム。
【請求項１０】
請求項９記載のシステムにおいて、前記処理エージェントを有効化することが、システム・リソースを前記処理エージェントに割り当てることを含み、前記仮想ストリームに対する前記明示的登録申込みが、前記仮想ストリームにシステム・リソースを割り当てさせる、システム。
【発明の詳細な説明】
【背景技術】
【０００１】
[0001]  ストリーム処理システムでは、ストリーム処理ユニットが、処理するイベントを受けるために、他の処理ユニットと通信する場合がある。これは、処理ユニット同士間の直接通信によって、または出版購読型モデル(publication-subscription model)を介して行うことができる。出版購読型モデルでは、処理ユニットが一定のイベントに登録申込み(subscribe)し、これらが発行（publish）されたときにイベントを受ける。
【０００２】
[0002]  ストリーム処理システムの規模が大きくなるに連れ、例えば、数百万台の処理ユニットが関与する場合、処理ユニット間において直接通信技法を利用することは非実用的となる場合もある。出版購読型モデルは実現可能に思われるかもしれないが、従前からの出版購読型モデルは、処理ユニットがイベントに関する何らかの情報を受ける前に、イベント登録申込みを明示的に提出しなければならない。これは、場合によっては、処理ユニットが、一定のイベントが発生する前に登録申込みすべきイベントを推定することは不可能である場合もあるので、問題となるおそれがある。例えば、ゲーム・アプリケーションのマップ上で発生するイベントを処理するように構成された処理ユニットは、そのマップ上でゲームが開始されるまでは、どのゲームに登録申込みすべきかわからない。このような状況では、処理ユニットに関心があるイベントを受けるためには、処理ユニットは全ての可能なイベントに登録申込みしなければならず、この場合も大規模なストリーム処理システムでは、非実用的および非効率的になる。
【０００３】
[0003]  本明細書において本開示を紹介するのは、これらおよび他の検討事項(considerations)に関してである。
【発明の概要】
【０００４】
[0004]  本明細書では、仮想処理エージェントを利用するイベント配信およびストリーム処理のための技術について記載する。１つ以上の仮想処理エージェントを作成し、ストリーム・イベントを受けて処理するように構成することができる。ストリーム処理システムにおいて種々のエンティティからイベント発行を受けるためには、待ち行列のようなメカニズムを利用するおよび／または構成するのでもよい。また、発行されたイベントは、必要になったときに後に引き出すおよび配信するために、永続化（persist）するまたは格納することもできる。イベント発行を受けると、ランタイム・システムがこの発行されたイベントを受けることに関心があるかもしれないが、明示的にこの発行されたイベントに登録申込みしていない１つ以上の仮想処理エージェントを識別することができる。次いで、発行されたイベントのイベント情報を、識別された仮想処理エージェントに配信することができる。イベントまたはイベント情報の実際の配信に先立って、ランタイム・システムは、更に、仮想処理エージェントが有効化(activate)されているか否か判定することもでき、処理エージェントが有効化されていない場合、ランタイム・システムは処理エージェントを有効化することができる。次いで、イベントまたはその中に含まれるイベント情報を、有効化された処理エージェントに配信することができる。
【０００５】
[0005]  受けたイベントまたはイベント情報に基づいて、仮想処理エージェントは、待ち行列から更に多くのイベントを受けるために、明示的に登録申込みを提出することを決定することができる。次いで、明示的な登録申込みは、登録申込みされたイベントを処理エージェントに配信するきっかけとなることができ、この明示的な登録申込みが提出される前に待ち行列において発行された過去のイベントを含むこともできる。本明細書において説明する技法を利用することによって、仮想処理エージェントは、待ち行列においてイベントが発行される前には処理エージェントが他の方法では知ることができないイベントを登録申込みし、受け、処理することが可能になる。仮想処理エージェントを利用してイベントを登録申込みし、受け、処理することによって、計算リソースのスケーラビリティ、信頼性、および柔軟性を向上させることができる。
【０００６】
[0006]  更に、以上で説明した主題は、コンピューター制御型装置、コンピューター・プロセス、計算システムとして、またはコンピューター読み取り可能記憶媒体のような製品としても実現できることは認められてしかるべきである。これらおよび種々の他の特徴は、以下の詳細な説明を読み、添付図面を検討することによって明白になるであろう。
【０００７】
[0007]  この摘要は、詳細な説明において以下で更に説明する概念から選択したものを、簡略化した形態で紹介するために設けられている。この摘要は、特許請求する主題の主要な特徴や必須の特徴を特定することを意図するのではなく、特許請求する主題の範囲を限定するために使用されることを意図するのでもない。更に、特許請求する主題は、本開示の任意の部分に記される任意の欠点を解決する実現例にも、全ての欠点を解決する実現例にも限定されない。
【図面の簡単な説明】
【０００８】
【図１】図１は、仮想処理エージェントを利用するストリーム処理のために本明細書において開示される１つのメカニズムの全体的な説明を示すコンピューター・システム図である。
【図２】図２は、待ち行列および仮想ストリームの形態(aspect)を示すブロック図である。
【図３】図３は、イベントを仮想処理エージェントに配信するための１つの例示的なプロセスの更に他の形態を示す流れ図である。
【図４】図４は、仮想処理エージェントによるイベント登録申込みおよび処理のための１つの例示的なプロセスの形態を示す流れ図である。
【図５Ａ】図５Ａは、異なる時点において待ち行列において発行されたイベントに応答する仮想処理エージェント例による動作を示す。
【図５Ｂ】図５Ｂは、異なる時点において待ち行列において発行されたイベントに応答する仮想処理エージェント例による動作を示す。
【図５Ｃ】図５Ｃは、異なる時点において待ち行列において発行されたイベントに応答する仮想処理エージェント例による動作を示す。
【図５Ｄ】図５Ｄは、異なる時点において待ち行列において発行されたイベントに応答する仮想処理エージェント例による動作を示す。
【図６】図６は、本明細書において提示した技術を実現することができる計算システムの例示的なコンピューター・ハードウェア・アーキテクチャを示すコンピューター・アーキテクチャ図である。
【発明を実施するための形態】
【０００９】
[0014]  本明細書では、仮想処理エージェントを利用するイベント配信およびストリーム処理のための技術について記載する。本明細書において開示する技術では、本明細書では「処理エージェント」または「ＰＡ」と呼ぶこともある、１つ以上の仮想処理エージェントを、ストリーミング処理のための処理ユニットとして採用することができる。これらの仮想処理エージェントは１つ以上のサーバーにおいて実行することができ、処理エージェントが有効化されているかまたは有効化されていないかには関係なく、動作および相互作用のためにアドレス可能にすることができる。仮想処理エージェントの各々は、種々のイベントを発行する、受ける、および／または処理するように構成することができる。イベントは、待ち行列において発行することができ、更に、後に引き出すために、待ち行列内に永続化するまたは格納することもできる。
【００１０】
[0015]  一旦イベントの発行が待ち行列において受けられたなら、発行されたイベントを受ける１つ以上の処理エージェントを識別することができる。識別される処理エージェントは、発行されたイベントを受けることを明示的に登録申込みしていない処理エージェントを含むことができ、ここでは「暗示サブスクライバー処理エージェント」(implicit subscriber processing agent)または「暗示サブスクライバー」(implicit subscriber)と呼ぶ。暗示サブスクライバーの識別は、仮想処理エージェントの設定または構成に基づいて行うことができ、仮想処理エージェントによって実行されるアクション、仮想処理エージェントの入力および出力、仮想処理エージェントのステータス、ならびに仮想処理エージェントの可能な他の構成を含むが、これらに限定されるのではない。仮想処理エージェントの構成は、処理エージェントの宣言的定義(declarative definition)から導くことができ、またはプログラムによって得ることができる。
【００１１】
[0016]  次いで、発行イベント、または発行イベント内に含まれるまたはこれに関連する情報を、識別された暗示サブスクライバー処理エージェントに配信することができる。この情報をここでは「イベント情報」と呼ぶ。実際の配信に先立って、仮想処理エージェントをサポートおよび管理するランタイム・システムは、暗示サブスクライバー処理エージェントが有効化されているか否か判定することができ、処理エージェントが有効化されていない場合、処理エージェントを有効化することができる。次いで、イベントまたはイベント情報を、有効化された処理エージェントに配信することができ、ここでイベントまたはイベント情報を更に処理することができる。同様に、イベント発行が待ち行列に受け入れられたとき、発行されたイベントを受けることを明示的に登録申込みした１つ以上の処理エージェントも識別し、必要であれば有効化することができる。次いで、発行されたイベントを明示サブスクライバー処理エージェントに処理のために配信することができる。
【００１２】
[0017]  受けたイベントまたはイベント情報に基づいて、暗示サブスクライバー処理エージェントは、処理のために更に他のイベントが必要とされると判断することもあり、これらのイベントが待ち行列において発行されるときに受けるために明示登録申込みを提出することができる。処理エージェントの構成に依存して、明示登録申込みにおいて指定されるイベントは、既に発生し待ち行列において発行されている過去のイベントも含むことができる。このようなシナリオでは、待ち行列において発行されるイベントが永続化されるまたは格納されることもあるので、待ち行列は、これら登録申込みされた過去のイベントを引き出し、処理エージェントに配信することができる。更に、他のイベントが待ち行列において発行されるに連れて、待ち行列は登録申込みイベントを処理エージェントに配信することができる。
【００１３】
[0018]  更に他の形態によれば、待ち行列内にあるイベントを１つ以上の仮想ストリームにマッピングまたは抽象化することができ、仮想ストリームの各々が、待ち行列において発行されているイベントの部分集合を含むこともできる。処理エージェントおよび／または他のエンティティによって実行されるイベント発行およびイベント登録申込みは、待ち行列ではなく、仮想ストリームに導くことができる。仮想ストリームの各々は、その中で発行されるイベントによって、および／または処理エージェントが受けることに関心があるイベントのタイプによって定めることができる。したがって、仮想ストリームは動的であってもよく、仮想ストリームの存在は、発行されるイベントおよび／または配信されるイベントに依存してもよい。本明細書において提示する技術のこれらおよび他の形態に関する追加の詳細は、図１〜図６に関して以下に示す。
【００１４】
[0019]  本明細書において説明する主題は、コンピューター・システムにおけるオペレーティング・システムおよびアプリケーション・プログラムの実行と併せて実行するプログラム・モジュールという一般的なコンテキストで紹介するが、他のタイプのプログラム・モジュールとの組み合わせで他の実現例も実行できることは、当業者には認められよう。一般に、プログラム・モジュールは、ルーチン、プログラム、コンポーネント、データー構造、および他のタイプの構造を含み、特定のタスクを実行するか、または特定の抽象データー型を実装する。更に、本明細書において説明する主題は、他のコンピューター・システム構成でも実施できることは、当業者には認められよう。他のコンピューター・システム構成には、ハンドヘルド・デバイス、マルチプロセッサー・システム、マイクロプロセッサー・ベースまたはプログラマブル消費者用電子機器、ミニコンピューター、メインフレーム・コンピューター等が含まれる。
【００１５】
[0020]  以下の詳細な説明では、本明細書の一部を形成する添付図面を参照する。添付図面は、例示、具体的な形態、または例として示される。これより図面を参照して、イベントを登録申込みし、受け、そして処理する計算システムおよび方法について説明する。図面において、同様の番号は様々な図にわたって同様のエレメントを表すものとする。
【００１６】
[0021]  これより図１に移り、本明細書において紹介する形態によるコンピューター・システムおよびその中に含まれる様々なコンポーネントに関する詳細を示す。具体的には、図１は、仮想処理エージェントを利用するイベント配信およびストリーム処理のためのストリーム処理システム１００の形態を示す。図１に示すように、ストリーム処理システム１００は、ランタイム・システム１０８を含むことができる。ランタイム・システム１０８は、ストリーム処理システム１００における種々のエンティティ間の通信をサポートしそしてやり易くする。種々のエンティティには、仮想処理エージェント１０２Ａ〜１０２Ｎ（ここでは個々に仮想処理エージェント１０２と呼ぶことも、または纏めて仮想処理エージェント１０２と呼ぶこともある）、待ち行列システム１０４、クライアント計算デバイス１１６、およびサーバー計算デバイス１１８が含まれるが、これらに限定されるのではない。
【００１７】
[0022]  ランタイム・システム１０８は、一群の分散型サーバー（図１には示されていない）を含むことができる。分散型サーバーは、「仮想化分散型コンポーネント」（ここでは「仮想コンポーネント」と呼ぶこともある）を纏めて提供しサポートするランタイム・ベース・レイヤー１２２を実行するように構成することができる。本明細書において使用する場合、「コンポーネント」とは、ソフトウェア・オブジェクトのようなソフトウェア・コンポーネント、または分散型オブジェクト、エージェント、アクター(actor)等のような、他の種類の個々にアドレス可能な分離エンティティ(isolated entity)を指す。ランタイム・システム１０８によってサポートされる仮想化分散型コンポーネントは、そのメモリー内インスタンス化の内任意のものの寿命(lifetime)とも独立した、したがってランタイム・システム１０８における任意の特定のサーバーの寿命とも独立した存在(existence)を有する。仮想コンポーネントのメモリー内インスタンスがない場合、コンポーネントに送られるメッセージが、ランタイム・ベース・レイヤー１２２によって利用可能なサーバーにおいて新たなインスタンスが自動的に作成させられる。利用可能なサーバーとは、ランタイム・システム１０８における任意の利用可能なサーバーでよい。したがって、仮想コンポーネントは、仮想コンポーネントがシステムにおいて有効化されているか否かには関係なく、相互作用および／または動作のために、仮想コンポーネントの識別によって常にアドレス可能である。
【００１８】
[0023]  また、ランタイム・ベース・レイヤー１２２は、仮想コンポーネントの有効化および無効化を管理するように構成することもできる。更に、ランタイム・ベース・レイヤー１２２は、仮想コンポーネントを使用するプログラムには透過的に、仮想コンポーネントへの通信を管理するように構成することもできる。これを達成するために、ランタイム・ベース・レイヤー１２２は、仮想コンポーネントの任意の有効化されたインスタンスのために１つ以上のサーバー位置を示す情報を維持し、１つ以上の通信を有効化された仮想コンポーネント・インスタンスに送り、または無効化状態にある仮想コンポーネントへの通信を、この仮想コンポーネントのインスタンスが、それへの通信を受信するために、有効化(activation)に有効化されるまで保存することができる。このように、ランタイム・ベース・レイヤー１２２は、開発者に、システムにおいて任意の可能な仮想コンポーネントを、これがあたかも有効化されているかのように、即ち、メモリー内に存在するかのように、呼び出すことを可能にする仮想「コンポーネント空間」を与えることができる。
【００１９】
[0024]  仮想コンポーネントが有効化されているサーバーがクラッシュした場合、ランタイム・システム１０８における他のサーバーにおいて仮想コンポーネントの他の有効化を再有効化する(reactivating another activation)することによって、この仮想コンポーネントを復元することができる。したがって、仮想コンポーネントを監視する必要がなく、および／またはランタイム・ベース・レイヤー１２２に基づいて開発されたアプリケーションによって明示的に作成し直す必要もない。
【００２０】
[0025]  コンポーネントの仮想化は、仮想コンポーネントから、現在実行している物理インスタンス化／有効化にマッピングする間接参照(indirection)のレベルに基づく。この間接参照のレベルは、ランタイム・ベース・レイヤー１２２に、仮想コンポーネント配置および負荷均衡化、使用されていない仮想コンポの無効化、ならびにサーバー障害後における仮想コンポーネントの復元というような、他の場合ではアプリケーション開発者が取り組む必要がある多くの問題に対処する機会を与えることができる。つまり、ランタイム・ベース・レイヤー１２２によって提供される仮想コンポーネントは、負荷を均衡化し透過的に障害から復元するときにランタイムの柔軟性を許容しつつ、プログラミング・モデルを簡略化することができる。ランタイム・ベース・レイヤー１２２についての更なる詳細は、２０１４年３月２６に出願され、"Virtualized Components in Computing System"（計算システムにおける仮想化コンポーネント）と題する同時係属中の米国特許出願第１４／２２８，１２９号において見ることができる。
【００２１】
[0026]  本明細書において紹介する技術の形態によれば、ストリーム処理システム１００における仮想処理エージェント１０２は、ランタイム・システム１０８のランタイム・ベース・レイヤー１２２によって提供およびサポートされる仮想コンポーネントとして構成することができる。このような構成に基づいて、仮想処理エージェント１０２は、常に、仮想処理エージェント１０２が有効化されているか否かには関係なく、相互作用および／または動作のためにアドレス可能であることができる。仮想処理エージェント１０２は、ランタイム・システム１０８における他のサーバーにおいて仮想処理エージェント１０２を再有効化することによって、仮想処理エージェント１０２が有効化されたサーバーの障害後復元することができる。
【００２２】
[0027]  ある形態では、仮想処理エージェント１０２が、各々、一定のアクションを実施するように構成されてもよく、そして大規模なソフトウェア・アプリケーションのための機能を集合的に提供することもできる。例えば、コンピューター・ゲーム・アプリケーションでは、仮想処理エージェント１０２は、ゲーム・アプリケーションにおけるゲーム毎に作成され、各ゲームを管理するように構成することができる。また、仮想処理エージェント１０２は、ゲーム・アプリケーションにおいてゲームをホストするマップ毎に作成することもできる。更に、別々の仮想処理エージェント１０２を作成し、ゲーム・アプリケーションの種々のゲームに参加する個々のプレーヤーを管理するように構成することができる。仮想処理エージェント１０２によって実行されるアクション、仮想処理エージェント１０２の入力および出力、および／または他の構成を含む仮想処理エージェント１０２の構成は、仮想処理エージェント１０２の宣言的定義によって指定することができ、あるいはプログラミングによって得ることができる。
【００２３】
[0028]  ストリーム処理のためのコヒーレントなシステムを提供するために、ストリーム処理システム１００における種々の仮想処理エージェント１０２が互いに通信しなければならないことがある。例えば、仮想処理エージェント１０２のステータスを更新するため、他の仮想処理エージェント１０２を有効化するため、および／または他の仮想処理エージェント１０２によって一定のアクションが実行されるきっかけを作るために、メッセージが１つの仮想処理エージェント１０２から他に伝達されることがある。本明細書において説明するある形態によれば、他の仮想処理エージェント１０２および／またはシステムにおける他のエンティティに伝達されることが意図された仮想処理エージェント１０２からのメッセージは、待ち行列システム１０４によって実装された待ち行列１０６内においてイベント１１２として発行することができる。
【００２４】
[0029]  待ち行列システム１０４は、ストリーム処理システム１００における種々のエンティティからのイベント発行を受けて永続化するための待ち行列１０６を実装する１つ以上のサーバーを含むことができる。尚、待ち行列システム１０４およびランタイム・システム１０８におけるサーバーは、同じまたは異なるサーバーを含んでもよく、待ち行列システム１０４およびランタイム・システム１０８におけるサーバーは、ウェブ・サーバー、アプリケーション・サーバー、ネットワーク・アプライアンス、専用コンピューター・ハードウェア・デバイス、パーソナル・コンピューター（「ＰＣ」）、あるいはこれらおよび／または当技術分野において周知である他の計算デバイスの任意の組み合わせであってもよいことは理解されてしかるべきである。これらのサーバーはネットワーク（図１には示されていない）を介して接続することができる。ネットワークは、ローカル・エリア・ネットワーク（「ＬＡＮ」）、ワイド・エリア・ネットワーク（「ＷＡＮ」）、インターネット、または計算デバイスを接続する当技術分野において周知である任意の他のネットワーキング・トポロジーであってもよい。
【００２５】
[0030]  待ち行列１０６において発行されるイベント１１２は、イベント送出エンティティにおいて起こったまたは観察されたイベントに関連する種々の情報を含むことができる。イベント送出エンティティは、仮想処理エージェント１０２、クライアント計算デバイス１１６、サーバー計算デバイス１１８、および／またはストリーム処理システム１００において可能な他のエンティティであってもよい。イベント１１２に含まれる情報は、イベントが発生したエンティティの識別、イベントの時刻、イベントの場所、イベントに関与するエンティティの識別、および／またはイベントを記述するために使用することができる他の情報を含むことができるが、これらに限定されるのではない。イベント１１２は、イベント発行１１０をランタイム・システム１０８を介して送ることによって、待ち行列１０６において発行することができる。イベント発行１１０は、対応するイベント１１２において含まれる全ての情報を、イベントが発行のためであることの指示、イベントをどこにそしていつ発行するか指定するデーター等のような追加情報と共に含むことができる。更に他の形態では、待ち行列システム１０４は発行されたイベント１１２を待ち行列１０６の中に、あるいは待ち行列システム１０４および／またはランタイム・システム１０８にアクセス可能な他の記憶位置に永続化するまたは格納することもできる。
【００２６】
[0031]  他の仮想処理エージェント１０２、および／またはストリーム処理システム１００における他のイベント発生エンティティから処理のためにイベントを受けるために、仮想処理エージェント１０２は、待ち行列１０６において発行されるイベントを受けることを登録申込みするために、１つ以上のイベント登録申込み(event subscription)を送ることができる。このような仮想処理エージェント１０２をここでは「明示サブスクライバー処理エージェント１０２」またはこれらのイベントの「明示サブスクライバー１０２」と呼ぶこともある。一例として、そして限定ではなく、イベント登録申込み１１４は、登録申込みする仮想処理エージェント１０２が受けることに関心があるイベントのタイプまたはコンテンツを指定するデーターを含むことができる。イベント登録申込み１１４は、登録申込みされたイベントが起こる時間期間を指定することができる。更に、イベント登録申込み１１４は、仮想処理エージェント１０２に配信されるイベントをフィルタリングするために利用できる１つ以上の述部(predicate)または規則も指定することができる。尚、仮想処理エージェント１０２が受けることに関心があるイベントを記述する種々の他のデーターも、イベント登録申込み１１４に含んでもよいことは理解されてしかるべきである。
【００２７】
[0032]  以下で更に詳しく説明するが、ランタイム・システム１０８は、ストリーム処理レイヤー１２４を実行するように構成することもできる。ストリーム処理レイヤー１２４を、ここでは、「ストリーム処理レイヤー１２４」または「ランタイム・ストリーム処理レイヤー１２４」と呼ぶこともある。ランタイム・ストリーム処理レイヤー１２４は、ストリーム処理システム１００におけるエンティティ間のイベント通信を管理するように構成することができ、待ち行列１０６においてイベント発行１１０を管理すること、仮想処理エージェント１０２および／または他のイベント・サブスクライバーへのイベント１１２の配信を調整すること、イベント登録申込み１１４を受けて処理すること、ならびに他の可能な動作を含むがこれらに限定されるのではない。
【００２８】
[0033]  ランタイム・ストリーム処理レイヤー１２４は、イベント登録申込み１１４を１つ以上の明示サブスクライバー処理エージェント１０２から受け、登録申込みされたイベント１１２が待ち行列１０６において発行されたときに、登録申込みされたイベント１１２を対応する明示サブスクライバー処理エージェント１０２に送ることができる。更に他の形態によれば、ランタイム・ストリーム処理レイヤー１２４は、更に、イベント１１２に含まれる発行イベント１１２またはイベント情報を、明示的にイベント１１２を登録申込みしていないが発行イベント１１２に含まれる情報を受けることに関心があるかもしれない１つ以上の仮想処理エージェント１０２に送ることもできる。この仮想処理エージェント１０２を、ここでは、発行イベント１１２の「暗示サブスクライバー処理エージェント１０２」または「暗示サブスクライバー１０２」とも呼ぶ。
【００２９】
[0034]  暗示サブスクライバー処理エージェント１０２は、仮想処理エージェント１０２によって実行されるアクション、仮想処理エージェント１０２の入力および出力、仮想処理エージェント１０２のステータス、および／または仮想処理エージェント１０２の他の構成というような、仮想処理エージェント１０２の構成または設定を調べることによって識別することができる。例えば、仮想処理エージェント１０２によって実行されるアクションが、開始された、述べられた、またはそれ以外で発行イベント１１２に関連付けられたオブジェクトあるいはエンティティを伴う場合、この仮想処理エージェント１０２を暗示サブスクライバー処理エージェント１０２として識別することができる。また、発行イベント１１２に含まれるデーターが仮想処理エージェント１０２によって消費または処理される場合、この仮想処理エージェント１０２を暗示サブスクライバー処理エージェント１０２として識別することができる。尚、これらの例は単なる例示に過ぎず、限定として解釈してはならないことは理解されてしかるべきである。暗示サブスクライバー処理エージェント１０２を識別する他の方法も利用することができる。
【００３０】
[0035]  一旦ランタイム・ストリーム処理レイヤー１２４が暗示サブスクライバー処理エージェント１０２を識別したなら、ランタイム・ベース・レイヤー１２２を介して、この暗示サブスクライバー処理エージェント１０２にイベント１１２を配信することができる。先に説明したように、ストリーム処理システム１００における仮想処理エージェント１０２は、ランタイム・システム１０８のランタイム・ベース・レイヤー１２２によってサポートされる仮想コンポーネントとして実装することができる。ランタイム・ストリーム処理レイヤー１２４の観点からは、仮想処理エージェント１０２がシステムにおいて有効化されているか否かには関係なく、イベント１１２の配信のために常にアドレス可能であることができる。したがって、ランタイム・ストリーム処理レイヤー１２４は、イベント１１２を配信のためにランタイム・ベース・レイヤー１２２に渡すことができる。
【００３１】
[0036]  イベント１１２を受けると、ランタイム・ベース・レイヤー１２２は、暗示サブスクライバー処理エージェント１０２が有効化されているか否、即ち、暗示サブスクライバー処理エージェント１０２がメモリーに既にロードされており動作する準備ができているか否か判定することができる。暗示サブスクライバー処理エージェント１０２が未だ有効化されていない場合、ランタイム・ベース・レイヤー１２２は暗示サブスクライバー処理エージェント１０２を有効化し、次いで有効化した暗示サブスクライバー処理エージェント１０２にイベント１１２を配信することができる。同様に、イベント１１２を明示サブスクライバー処理エージェント１０２に配信するときも、ランタイム・ベース・レイヤー１２２は、この明示サブスクライバー処理エージェント１０２が有効化されているか否判定し、必要であれば、イベント１１２の配信前に、明示サブスクライバー処理エージェント１０２を有効化することができる。
【００３２】
[0037]  仮想処理エージェント１０２の実現例に依存して、そして有効化されたときの仮想処理エージェント１０２のステータスに依存して、有効化された暗示サブスクライバー処理エージェント１０２の内一部は、未だイベント１１２を受け入れて処理するように構成されていない場合がある。例えば、暗示サブスクライバー処理エージェント１０２は、有効化されたときに、未だイベント・ハンドラーが構築されていないこともあり得る。このようなシナリオでは、イベント１１２に含まれるデーターの一部または全部を含むイベント情報を編成し直して(rearranged)、暗示サブスクライバー処理エージェント１０２に受け入れ可能なフォーマットで、暗示サブスクライバー処理エージェント１０２に配信することができる。他のシナリオでは、イベント１１２に含まれる詳細データーを送ることなく、イベント１１２の発生を示すイベント情報を仮想処理エージェント１０２に送れば十分な場合もある。
【００３３】
[0038]  受けたイベント１１２またはイベント情報に基づいて、一部の暗示サブスクライバー処理エージェント１０２は、待ち行列１０６において発行される更に多くのイベントを処理のために受けるために、１つ以上のイベント登録申込み１１４をランタイム・ストリーム処理レイヤー１２４に提出することを決定することができる。先に端的に述べたように、暗示サブスクライバー処理エージェント１０２によって提出された明示イベント登録申込み１１４に含まれるイベントは、イベント登録申込み１１４が受けられて処理される前に待ち行列１０６において既に発行されている過去のイベントを含む場合がある。ランタイム・ストリーム処理レイヤー１２４は、対応するイベントが永続化されている待ち行列または他のストレージから過去のイベントを引き出し、引き出したイベントを暗示サブスクライバー処理エージェント１０２に配信することができる。尚、暗示サブスクライバー処理エージェント１０２がイベント登録申込み１１４を提出するとき、暗示サブスクライバー処理エージェント１０２は、登録申込みしたイベントに対しては、明示サブスクライバー処理エージェント１０２に変わることができ、明示サブスクライバー処理エージェント１０２を扱うことについて先に説明したのと同様に処理されればよい。
【００３４】
[0039]  更に、以上では、仮想処理エージェント１０２がイベント発行１１０を送り、イベント登録申込み１１４を提出し、および／またはイベント１１２を受けることができると主に説明したが、ストリーム処理システム１００における種々の他のエンティティもこれらの動作を実行できることは理解されてしかるべきである。例えば、コンピューター・ゲーム・アプリケーションのユーザーが、そのゲームのリーダー・ボード情報のような、ゲームに関する情報を受けることに関心がある場合がある。このユーザーは、このような情報をクライアント計算デバイス１１６を介して得るために、イベント登録申込み１１４をランタイム・システム１０８に送ることができる。クライアント計算デバイス１１６は、パーソナル・コンピューター（「ＰＣ」）、ラップトップ、ノートブック、パーソナル・ディジタル・アシスタント（「ＰＤＡ」）、ゲーム・コンソール、セットトップ・ボックス、電子書籍、消費者用電子デバイス、スマートフォン、タブレット計算デバイス、サーバー・コンピューター、またはランタイム・システム１０８と通信することができる任意の他の計算デバイスであってもよい。
【００３５】
[0040]  同様に、サーバー計算デバイス１１８も、サーバー・コンピューター、ウェブ・サーバー、アプリケーション・サーバー、ネットワーク・アプライアンス、専用コンピューター・ハードウェア・デバイス、ＰＣ、あるいはこれらおよび／または当技術分野において周知の他の計算デバイスの任意の組み合わせであってもよく、そこでゲームを実行さることができる。サーバー計算デバイス１１８は、待ち行列１０６においてゲーム開始イベント１１２を発行するためにイベント発行１１０を送ることができる。また、サーバー計算デバイス１１８が処理することに関心があるイベント１１２を受けるために、サーバー計算デバイス１１８は１つ以上のイベント登録申込み１１４を送ることもできる。また、ストリーム処理システム１００における他のエンティティも、以上で説明したのと同様にイベント１１２を発行し、受け、および／または登録申込みするように構成することができる。
【００３６】
[0041]  また、図１は、主に、ストリーム処理システム１００における種々のエンティティからイベント発行１１０を受けて永続化するための待ち行列１０６の使用を開示したが、種々の他のメカニズムも同様に利用できることは認められてしかるべきである。実際に、後の処理のためにデーターを格納および保持することができる事実上あらゆるデーター構造を、待ち行列１０６に関して以上で説明したのと同様に利用することができる。本願は、イベント発行１１０を保持し格納するための全てのこのようなデーター構造を含むことを意図している。
【００３７】
[0042]  これより図２を参照して、待ち行列１０６およびランタイム・ストリーム処理レイヤー１２４の更に他の形態を示すブロック図について説明する。先に端的に説明したように、ランタイム・ストリーム処理レイヤー１２４は、イベント発行１１０およびイベント登録申込み１１４を処理するために、仮想ストリームを提供しサポートすることができる。仮想ストリームを利用することによって、仮想処理エージェント１０２および／または他のエンティティによって提出されたイベント発行１１０およびイベント登録申込み１１４を、待ち行列１０６ではなく、仮想ストリームに導くことができる。その結果、仮想処理エージェント１０２は、待ち行列１０６の存在を知る必要がなくなることが可能である。図２は、ランタイム・ストリーム処理レイヤー１２４によって抽象化された種々の仮想ストリーム、ならびに仮想ストリーム、待ち行列１０６、および仮想処理エージェント１０２間における相互作用を示す。
【００３８】
[0043]  図２に示すように、ランタイム・ストリーム処理レイヤー１２４は、仮想ストリームに関連する機能を提供しサポートするため、そして待ち行列１０６および仮想ストリーム間におけるイベントのマッピングを維持するために、仮想ストリーム・モジュール２０２を含むことができる。仮想ストリーム・モジュール２０２によって提供される仮想ストリームは、イベント発行仮想ストリーム２０４Ａ〜２０４Ｃ（ここでは、個々にイベント発行仮想ストリーム２０４と呼ぶことも、または纏めてイベント発行仮想ストリーム２０４と呼ぶこともある）と、イベント登録申込み仮想ストリーム２０６Ａ〜２０６Ｄ（ここでは、個々にイベント登録申込み仮想ストリーム２０６と呼ぶことも、または纏めてイベント登録申込み仮想ストリーム２０６と呼ぶこともある）とを含む。
【００３９】
[0044]  イベント発行仮想ストリーム２０４の各々は、その中で発行されるイベントによって定めることができ、イベント登録申込み仮想ストリーム２０６の各々は、登録申込みエンティティが受けることに関心があるイベントによって定めることができる。例えば、仮想処理エージェント１０２Ａが、イベント１１２を発行するために、イベント発行１１０をランタイム・ストリーム処理レイヤー１２４に送るとしてもよい。イベント発行１１０は、イベント発行仮想ストリーム２０４Ｃを介して、ランタイム・ストリーム処理レイヤー１２４に送ることができる。イベント発行１１０がランタイム・ストリーム処理レイヤー１２４によって受けられる前には、イベント発行仮想ストリーム２０４Ｃが存在しないこともあり得るので、イベント発行１１０の到達が、イベント発行仮想ストリーム２０４Ｃを作成させてもよい。言い換えると、イベント発行１１０またはその中に含まれるイベントが、イベント発行１１０が送られるイベント発行仮想ストリーム２０４を定め、これを存在させるのでもよい。同様に、他の仮想処理エージェント１０２も、イベントを発行するために、イベント発行１１０をそれらの対応する発行仮想ストリーム２０４に提出することができる。イベント発行仮想ストリーム２０４を介してイベント発行１１０を受けた後、仮想ストリーム・モジュール２０２は、イベント発行１１０において指定されたイベントを、発行のために、待ち行列１０６に送ることができる。
【００４０】
[0045]  同様に、仮想処理エージェント１０２Ｐが、仮想処理エージェント１０２Ｐが受けることに関心があるイベントを示すイベント登録申込み１１４を提出すると、このようなイベント登録申込み１１４が、イベント登録申込み１１４によって指定されるイベントに対応するイベント登録申込み仮想ストリーム２０６Ｄを定めることができる。その結果、イベント登録申込み１１４を提出することによって、仮想処理エージェント１０２Ｐは、イベント登録申込み１１４によって定められたイベント登録申込み仮想ストリーム２０６Ｄに登録申込みしているのと同等となる。尚、仮想処理エージェント１０２は、１つまたは複数のイベント登録申込み１１４をランタイム・ストリーム処理レイヤー１２４に提出することによって、複数のイベント登録申込み仮想ストリーム２０６に登録申込みできることは理解されてしかるべきである。一旦ランタイム・ストリーム処理レイヤー１２４がイベント登録申込み１１４を受けたなら、イベント登録申込み仮想ストリーム２０６Ｄを作成し、存在させることができる。イベント登録申込み１１４に基づいて、仮想ストリーム・モジュール２０２は、待ち行列１０６において発行されたイベント１１２を引き出し、このイベント１１２をイベント登録申込み仮想ストリーム２０６Ｄにプッシュすることができ、次いで、イベント登録申込み仮想ストリーム２０６Ｄを仮想処理エージェント１０２Ｐに配信することができる。
【００４１】
[0046]  例えば、仮想処理エージェント１０２Ａは、ゲームを処理するように構成することができ、このゲームにおいて発生したイベント１１２を発行するために、イベント発行１１０をランタイム・ストリーム処理レイヤー１２４に送ることができる。提出されたイベント発行１１０は、ゲーム・イベント・ストリーム２０４Ｃを作成させて、発行のためにイベント１１２を受けることができる。ゲーム・イベント・ストリーム２０４Ｃを介して受けられたイベント１１２は、更に、発行および格納のために、待ち行列１０６に送ることができる。その間に、ランタイム・ストリーム処理レイヤー１２４が、ゲームにおける全てのキル・イベント(kill event)を受けることを登録申込みするために、仮想処理エージェント１０２Ｐからイベント登録申込み１１４を受けることができた。このようなイベント登録申込み１１４が、キル・イベント・ストリーム２０６Ｄを作成させることができた。
【００４２】
[0047]  ゲーム・イベント・ストリーム２０４Ｃにおいてイベント発行１１０を受けたときに、仮想ストリーム・モジュール２０２は、ゲーム・イベント・ストリーム２０４Ｃを介して発行されたキル・イベントが１つでもある場合には、仮想処理エージェント１０２Ｐへの配信のために、それをキル・イベント・ストリーム２０６Ｄに転送すべきことを検出することができる。この検出は、例えば、先に説明したように、待ち行列１０６におけるイベントおよび仮想ストリーム・モジュール２０２によって維持されている仮想ストリームにおけるイベントのマッピングを利用することによって実行することができる。その後、ゲーム・イベント・ストリーム２０４Ｃを介して発行されたキル・イベント１１２毎に、仮想ストリーム・モジュール２０２はキル・イベント１１２を待ち行列１０６から引き出し、仮想処理エージェント１０２Ｐへの配信のためにそれをキル・イベント・ストリーム２０６Ｄにプッシュすることができる。尚、以上の例は単なる例示に過ぎず、種々の他のイベント１１２、イベント発行１１０、イベント登録申込み１１４、および／または他のデーターも仮想処理エージェント１０２と待ち行列１０６との間で、仮想ストリーム２０４および２０６、および／またはランタイム・ストリーム処理レイヤー１２４を介して通信できることは認められてしかるべきである。
【００４３】
[0048]  更に他の形態によれば、仮想処理エージェント１０２によって提出されたイベント登録申込み１１４は、対応するイベント登録申込み仮想ストリーム２０６を更に定めるために利用することができる１つ以上の述部を更に指定することもできる。述部は、イベント登録申込み仮想ストリーム２０６にプッシュされるイベントをフィルタリングするために利用することができる１つ以上のフィルタを作成するというように、イベント登録申込み仮想ストリーム２０６をリファインするために、適正な時点において、ランタイム・ストリーム処理レイヤー１２４によって処理することができる。述部を利用すると、仮想処理エージェント１０２に送られるイベントを更にリファインし、不要なイベントの仮想処理エージェント１０２への配信を排除することができる。
【００４４】
[0049]  以上からわかるように、仮想ストリーム２０４および２０６は非常に動的で柔軟性があり、必要なときにはいつでも作成することができ、これによってストリーム処理システム１００のスケーラビリティを著しく高めることができる。更に他の形態によれば、仮想ストリーム２０４および２０６は論理的に常時存在することができるが、処理すべきイベントが仮想ストリーム２０４および２０６内にあるときにだけ、システム・リソースがこれらに割り当てられる。一定の時間期間にわたって仮想ストリーム２０４および２０６においてイベントが受けられないとき、それらのリソースを取り戻すことによって、仮想ストリーム２０４および２０６を無効化することができる。この時間期間は予め決められていても、システム・リソースの使用度のような、システムのステータスにしたがって動的に調節されてもよい。このような実現例は、仮想ストリームが細かい粒度で組み立てられるシナリオでは、有用となることができる。例えば、アプリケーション・システムにおける仮想ストリームは、ユーザー毎、デバイス毎、および／またはセッション毎に組み立てることができる。大きなアプリケーション・システムでは、ユーザー数、デバイス数、および／またはセッション数、つまり仮想ストリーム数も、億単位または１０億単位となることもあり得る。これらの仮想ストリームに関連するイベントは、しかしながら、希にしか発生しない、および／または纏まって(in burst)発生する場合もあり、しかも一度に仮想ストリームの小さな部分だけがアクティブであればよい。このようなシステムでは、処理すべきイベントが仮想ストリーム２０４および２０６にあるときにだけリソースを仮想ストリームに割り当てることによって、システムの効率およびスケーラビリティを著しく高めることができる。
【００４５】
[0050]  その上、仮想ストリーム・モジュール２０２は、更に、待ち行列１０６と相互作用する前に、仮想処理エージェント１０２への通信および仮想処理エージェント１０２からの通信を集計するように構成することもできる。例えば、仮想ストリーム・モジュール２０２は、複数のイベント発行１１０を複数の仮想処理エージェント１０２から受けることもある。これら複数のイベント発行１１０を、例えば、多重化によって集計し、１回の通信接続によって複数のイベント１１２を発行するために、待ち行列１０６に伝達することができる。同様に、複数の仮想処理エージェント１０２から受けた複数のイベント登録申込み１１４を処理して集計することができ、同様に待ち行列１０６との１回の通信接続によって、複数の仮想処理エージェント１０２に送るべきイベント１１２を待ち行列１０６から引き出すことができる。
【００４６】
[0051]  尚、以上の例では、複数の通信が集計され、１回の通信接続によって待ち行列１０６に伝達されると説明したが、１回よりも多い通信接続が、伝達のために、ランタイム・ストリーム処理レイヤー１２４と待ち行列１０６との間に作られてもよいことは理解されてしかるべきである。作られる通信接続の回数は、しかしながら、イベント発行１１０および／またはイベント登録申込み１１４のような、仮想処理エージェント１０２からの通信要求の回数よりもはるかに少なくすることができる。通信集計の利点は、ストリーム処理システム１００の規模が大きくなる程、増々重要になるであろう。例えば、数百万個の仮想処理エージェント１０２があるストリーム処理システム１００では、仮想処理エージェント１０２からの通信要求は、数千万回の規模になる可能性があり、通例、仮想処理エージェント１０２の各々と、このような大多数の直接ＴＣＰ／ＩＰ接続を作ることは、待ち行列１０６にとって非実用的である。通信の集計によって、仮想ストリーム・モジュール２０２は、待ち行列１０６に対する直接ＴＣＰ／ＩＰ接続の回数を数千回に低減し、これによって通信リソースの消費を著しく減らすことができる。
【００４７】
[0052]  更に、図１および図２は、１つの待ち行列１０６がイベント１１２を発行し永続化するために利用されることを例示するが、複数の待ち行列１０６を採用してもよいことも認められてしかるべきである。このような実現例では、仮想ストリーム・モジュール２０２は、更に、複数の待ち行列１０６を管理し、これらの待ち行列１０６と種々の仮想ストリーム２０４および２０６との間におけるイベントのマッピングを維持するように構成することができる。また、クライアント計算デバイスおよびサーバー計算デバイスのような、ストリーム処理システム１００における他のエンティティも、イベント発行１１０によってイベントを発行し、イベント登録申込み１１４を提出し、および／または仮想ストリーム２０４および２０６を介してイベント１１２を受けることができることも理解されてしかるべきである。
【００４８】
[0053]  図２は、更に、処理エージェント・コンテナ２０８Ａ〜２０８Ｂ（ここでは、個々に処理エージェント・コンテナ２０８と呼ぶこともあり、または纏めて処理エージェント・コンテナ２０８と呼ぶこともある）を利用して仮想処理エージェント１０２を編成(organize)および管理する形態を示す。処理エージェント・コンテナ２０８の各々は、他の処理エージェント・コンテナ２０８から分けられ孤立された仮想処理エージェント１０２に、独立した計算環境を提供することができる。仮想処理エージェント１０２をホストするために、仮想機械のような種々の計算リソースを処理エージェント・コンテナ２０８に割り当てることができる。また、各処理エージェント・コンテナ２０８は、他の処理エージェント・コンテナ２０８とは独立して、スケーリングする(scale)ことができる。尚、イベント１１２を発行する仮想処理エージェント１０２、およびイベント１１２に登録申込みしこれを受ける仮想処理エージェント１０２は、１つの同じ処理エージェント・コンテナ２０８内にあっても、または２つの異なる処理エージェント・コンテナ２０８内にあってもよいことは理解されてしかるべきである。更に、仮想処理エージェント１０２は、処理エージェント・コンテナ２０８の使用を伴わない種々の他の方法で編成および管理されてもよいことも理解されてしかるべきである。
【００４９】
[0054]  図３は、イベントを仮想処理エージェント１０２に配信するための１つの例示的なルーチン３００の形態を示す流れ図である。ある実現例では、ルーチン３００は、図１に関して先に説明したランタイム・システム１０８のランタイム・ストリーム処理レイヤー１２４によって実行される。しかしながら、ルーチン３００は、ランタイム・システム１０８の他のモジュールおよび／またはコンポーネントによって、あるいは図１に示したストリーム処理システム１００における他のエンティティのモジュールおよび／またはコンポーネントによって実行されてもよいことは認められてしかるべきである。
【００５０】
[0055]  尚、図３および他の図に関して本明細書において説明する論理動作は、（１）計算システムにおいて実行するコンピューター実装アクトまたはプログラム・モジュールのシーケンスとして、および／または（２）計算システム内部で相互接続された機械論理回路または回路モジュールとして実現されることは認められてしかるべきである。実現例は、計算システムの性能および他の要件に依存する選択事項である。したがって、本明細書において説明する論理動作は、様々に、状態、動作、構造的デバイス、アクト、またはモジュールと呼ばれる。これらの状態、動作、構造的デバイス、アクト、およびモジュールは、ソフトウェア、ファームウェア、特殊目的ディジタル・ロジック、およびこれらの任意の組み合わせで実現することができる。また、図に示しここで説明するよりも多い動作または少ない動作が実行されてもよいことも認められてしかるべきである。これらの動作は、ここで説明する順序とは異なる順序で実行することもできる。また、図示する方法の各々は任意の時点で終了することができ、その全体を実行する必要がないことも理解されてしかるべきである。
【００５１】
[0056]  以上の方法の動作、および／または実質的に等価な動作の一部または全部は、以下に定めるような、コンピューター記憶媒体に含まれるコンピューター読み取り可能命令の実行によって実行することができる。「コンピューター読み取り可能命令」という用語およびその異形は、この説明および特許請求の範囲において使用される場合、本明細書では、ルーチン、アプリケーション、アプリケーション・モジュール、プログラム・モジュール、プログラム、コンポーネント、データー構造、アルゴリズム等を含むように広く使用される。コンピューター読み取り可能命令は、種々のシステム構成において実装することができ、単一プロセッサーまたはマルチプロセッサー・システム、ミニコンピューター、メインフレーム・コンピューター、パーソナル・コンピューター、ハンドヘルド計算デバイス、マイクロプロセッサー・ベース、プログラマブル消費者用電子機器、これらの組み合わせ等が含まれる。
【００５２】
[0057]  ルーチン３００は、動作３０２において開始し、ランタイム・システム１０８のストリーム処理レイヤー１２４が対応するイベント発行仮想ストリーム２０４においてイベント発行１１０を受けることができる。先に説明したように、受けたイベント発行１１０に基づいてイベント発行仮想ストリーム２０４を動的に作成することができる。次いで、ルーチン３００は動作３０４に進み、ランタイム・ストリーム処理レイヤー１２４は、イベント発行１１０において指定されたイベント１１２を、発行のために待ち行列１０６に送る。更に、ランタイム・ストリーム処理レイヤー１２４は、イベント１１２が後に引き出せるように、イベント１１２を待ち行列１０６に永続化するまたは格納するように、待ち行列１０６に命令することができる。ある実現例では、イベント１１２は、待ち行列１０６および／またはランタイム・ストリーム処理レイヤー１２４にアクセス可能である記憶デバイスに永続化するまたは格納することもできる。
【００５３】
[0058]  動作３０４から、ルーチン３００は動作３０６に進み、ランタイム・ストリーム処理レイヤー１２４はイベント１１２を待ち行列１０６から引き出すことができ、ルーチン３００は更に動作３０８に進み、イベント１１２に基づいて、暗示サブスクライバー処理エージェント１０２を識別することができる。先に注記したように、暗示サブスクライバー処理エージェント１０２とは、イベント１１２を明示的に登録申込みしていないが、発行されたイベント１１２に含まれる情報を受けることに関心があるかもしれない仮想処理エージェント１０２である。暗示サブスクライバー処理エージェント１０２は、仮想処理エージェント１０２によって実行されるアクション、仮想処理エージェント１０２の入力および出力、仮想処理エージェント１０２のステータス、および／または仮想処理エージェント１０２の他の構成というような、仮想処理エージェント１０２の構成または設定を調べることによって識別することができる。例えば、仮想処理エージェント１０２によって実行されるアクションが、開始した、述べられた、またはそれ以外で発行されたイベント１１２に関連付けられたオブジェクトまたはエンティティを伴う場合、仮想処理エージェント１０２を暗示サブスクライバー処理エージェント１０２として識別することができる。また、発行されたイベント１１２に含まれるデーターが仮想処理エージェント１０２によって消費または処理される場合、仮想処理エージェント１０２を暗示サブスクライバー処理エージェント１０２として識別することができる。
【００５４】
[0059]  ある実現例では、ランタイム・ストリーム処理レイヤー１２４が、異なるタイプのイベントまたは対応するイベント登録申込み仮想ストリーム２０６を１つ以上の暗示サブスクライバー処理エージェント１０２にマッピングする暗示有効化テーブル(implicit activation table)を維持することもできる。暗示有効化テーブルの一例を図６に示し、後に説明する。暗示有効化テーブルは、予め生成され、必要なときにランタイム・ストリーム処理レイヤー１２４が参照することができる。また、暗示有効化テーブルは、ランタイム・ストリーム処理レイヤー１２４において実行して、所与のイベントまたはイベント情報に対して１つ以上の暗示サブスクライバー処理エージェント１０２を出力することができる機能またはモジュールによって実現することもできる。尚、暗示有効化テーブルは、以上で説明した同じ原理に従うことによって、他の方法で実現されてもよいことは注記してしかるべきである。
【００５５】
[0060]  動作３０８から、ルーチン３００は動作３１０に進み、例えば、イベント１１２またはイベント１１２のイベント情報を暗示サブスクライバー処理エージェント１０２に送ることによって、動作３０８において識別された暗示サブスクライバー処理エージェント１０２にイベント１１２を知らせることができる。先に述べたように、イベント情報は、イベント１１２内に含まれる情報、またはイベント１１２に関連する情報を含むことができる。暗示サブスクライバー処理エージェント１０２の性質に依存して、ある暗示サブスクライバー処理エージェント１０２に送られるイベント情報は、イベント１１２に含まれるデーターの一部または全部を含んでもよい。他の暗示サブスクライバー処理エージェント１０２については、イベント情報がイベント１１２の存在の指示だけを含むのでもよい。図４に関して詳しく説明するが、受けたイベント１１２またはイベント情報に基づいて、暗示サブスクライバー処理エージェント１０２は、更に多くのイベントを受けること、および／または更に他の動作を実行することに登録申込みするか否か決定することができる。
【００５６】
[0061]  動作３１０から、ルーチン３００は動作３１２に進み、ランタイム・ストリーム処理レイヤー１２４は、対応するイベント登録申込み仮想ストリーム２０６に登録申込みするために、暗示サブスクライバー処理エージェント１０２の内１つ以上からのイベント登録申込み１１４を受けることができる。次いで、ルーチン３００は動作３１４に進み、ランタイム・ストリーム処理レイヤー１２４は、明示イベント登録申込み１１４において指定されたイベントが、既に発生し待ち行列１０６において発行された過去のイベントを含むか否か判定することができる。明示イベント登録申込み１１４が過去のイベントを含むと判定した場合、ルーチン３００は動作３１６に進み、ランタイム・ストリーム処理レイヤー１２４は待ち行列１０６および／または過去のイベントを格納する他の記憶デバイスから過去のイベントを引き出し、引き出した過去のイベントを対応する仮想処理エージェント１０２に配信することができる。
【００５７】
[0062]  動作３１６から、または動作３１４において明示イベント登録申込み１１４が過去のイベントを含まないと判定した場合、ルーチン３００は動作３１８に進み、ランタイム・ストリーム処理レイヤー１２４は、それが維持する明示登録申込みを更新する、および／または受けた明示イベント登録申込み１１４に基づいて、イベント発行仮想ストリーム２０４、イベント登録申込み仮想ストリーム２０６、および待ち行列１０６におけるイベントのマッピングを更新するというような、他の動作を実行することができる。
【００５８】
[0063]  動作３０６から、ルーチン３００は動作３２０にも進むことができる。動作３２０において、ランタイム・ストリーム処理レイヤー１２４は、以前に仮想処理エージェント１０２によって提出されたイベント登録申込み１１４に基づいて、１つ以上の明示サブスクライバー処理エージェント１０２を識別することができる。更に、ルーチン３００は動作３２２に進むことができ、明示サブスクライバー処理エージェント１０２にイベント１１２を配信することができる。動作３１８または動作３２２から、ルーチン３００は動作３２４に進み、ランタイム・ストリーム処理レイヤー１２４が更に多くのイベントを配信する必要があるか否か判定することができる。ランタイム・ストリーム処理レイヤー１２４が更に多くのイベントを配信する必要がある場合、ルーチン３００は動作３０２に戻り、処理および配信のために更に多くのイベント発行１１０を受ける。それ以外の場合、ルーチン３００は動作３２６に進み、ルーチン３００は終了する。
【００５９】
[0064]  尚、以上で説明したイベント配信プロセスにおいて、イベント１１２を明示サブスクライバー処理エージェント１０２に配信するとき、および／またはイベント１１２またはイベント情報を暗示サブスクライバー処理エージェント１０２に送るとき、ランタイム・ベース・レイヤー１２２は、最初に、対応する処理エージェント１０２が有効化されているか否か判定してもよいことは認められてしかるべきである。有効化されていない処理エージェント１０２がある場合は、ランタイム・ベース・レイヤー１２２はその処理エージェント１０２を有効化し、次いで有効化した処理エージェント１０２にイベント１１２またはイベント情報を配信することができる。
【００６０】
[0065]  これに関して、暗示サブスクライバー処理エージェント１０２のような処理エージェント１０２を動的に有効化することができ、処理エージェント１０２が処理することを責務とするストリーム２０６における第イベント１１２の到達時にシステム・リソースを割り当てることを含む。つまり、第１イベント１１２が到達する前に、メモリーおよびＣＰＵのようなシステム・リソースを処理エージェント１０２に割り当てる必要性をなくすることができる。同様に、例えば、処理エージェント１０２が登録申込みしたストリーム２０６から処理のためにイベント１１２を受けないために、処理エージェントがある所与の時間期間アイドルになるとき、そのシステム・リソースを引き取るために処理エージェント１０２を透過的に無効化することもできる。処理エージェント１０２を無効化するための所与の時間期間は、予め決められていてもよく、またはシステム・リソースの使用度のような、システムのステータスにしたがって動的に調節されてもよい。
【００６１】
[0066]  図４は、イベント処理および登録申込みのための１つの例示的なルーチン４００の形態を示す流れ図である。ある実現例では、ルーチン４００は、図１および図２に関して先に説明した仮想処理エージェント１０２によって実行される。しかしながら、ルーチン４００は、図１に示したストリーム処理システム１００における他のエンティティによって実行されてもよいことは認められてしかるべきである。
【００６２】
[0067]  ルーチン４００は動作４０２において開始し、暗示サブスクライバー処理エージェント１０２がイベント１１２またはイベント１１２のイベント情報をランタイム・ストリーム処理レイヤー１２４から受け、更に受けたイベント１１２またはイベント情報を処理することができる。動作４０２から、ルーチン４００は更に動作４０４に進み、暗示サブスクライバー処理エージェント１０２は、受けたイベント１１２またはイベント情報に基づいて、更に多くのイベント１１２に登録申込みする必要があるか否か判定することができる。暗示サブスクライバー処理エージェント１０２が更に多くのイベントに登録申込みする必要があると判定した場合、ルーチンは動作４０６に進み、暗示サブスクライバー処理エージェント１０２は、暗示サブスクライバー処理エージェント１０２がイベントを受けることに関心がある１つ以上のイベント登録申込み仮想ストリーム２０６を識別することができる。動作４０８において、暗示サブスクライバー処理エージェント１０２は、イベント登録申込み１１４をランタイム・ストリーム処理レイヤー１２４に提出することによって、識別されたイベント登録申込み仮想ストリーム２０６に登録申込みすることができる。イベント登録申込み１１４を提出することによって、暗示サブスクライバー処理エージェント１０２は、提出したイベント登録申込み１１４に関して、明示サブスクライバー処理エージェント１０２に変わることができる。
【００６３】
[0068]  動作４０８から、ルーチン４００は動作４１０に進み、明示サブスクライバー処理エージェント１０２は、待ち行列１０６において発行された、登録申込みイベントを受けることができる。先に説明したように、動作４０８において提出されたイベント登録申込み１１４が過去のイベントを指定する場合、動作４１０において受けられたイベントはこれら過去のイベントを含む可能性がある。次いで、ルーチン４００は動作４１２に進み、受けたイベントを処理することができる。更に、ルーチン４００は動作４１４に進み、明示サブスクライバー処理エージェント１０２が更に多くのイベントを処理する必要があるか否か判定することができる。更に多くのイベントを必要とすると判定した場合、ルーチン４００は動作４１０に戻り、明示サブスクライバー処理エージェント１０２は処理のために更に多くのイベント１１２を受けることができる。動作４１４において、それ以上のイベントは必要ないと判定した場合、または動作４０４において暗示サブスクライバー処理エージェント１０２が更に多くのイベントに登録申込みする必要がないと判定した場合、ルーチン４００は動作４１６に進み、ルーチン４００は終了する。
【００６４】
[0069]  図５Ａ〜図５Ｄは、本明細書において紹介する１つ以上の形態にしたがって、異なる時点において待ち行列１０６において発行されたイベント１１２に応答した、仮想処理エージェント例１０２による動作を示す。図５Ａに示すように、ランタイム・システム１０８のストリーム処理レイヤー１２４は、暗示有効化テーブル５０６を維持する、またそうでなければ生成することができる。暗示有効化テーブル５０６は、異なるタイプのイベント１１２またはそれらの対応するイベント登録申込み仮想ストリーム２０６を暗示サブスクライバー処理エージェント１０２にマッピングする。図５Ａに示す暗示有効化テーブル例５０６によれば、マップ処理エージェント、ゲーム処理エージェント、リーダー・ボード処理エージェント、および／またはエリート・プレーヤー処理エージェントが、ゲーム・ストリーム５０４の暗示サブスクライバー処理エージェント１０２として識別されればよい。同様に、プレーヤー・ストリーム５２０では、可能な暗示サブスクライバー処理エージェント１０２は、プレーヤー処理エージェント、ゲーム処理エージェント、および／またはエリート・プレーヤー処理エージェントを含むことができる。暗示有効化テーブル５０６に基づいて、ランタイム・ストリーム処理レイヤー１２４は、イベント１１２が受けられ待ち行列１０６において発行されるに連れて、１つ以上の暗示サブスクライバー処理エージェント１０２を識別し有効化することができる。
【００６５】
[0070]  時点Ｔ０において、例えば、イベント発行仮想ストリーム２０４を介して、ゲーム開始イベント５０２が待ち行列１０６において発行される。ゲーム開始イベント５０２に含まれるデーターは、ゲームＸがマップＨ上において、現在ゲームＸにいるプレーヤーＡ〜Ｆと開始したことを示す。ランタイム・ストリーム処理レイヤー１２４は、ゲーム開始イベント５０２を待ち行列１０６から引き出し、ゲーム開始イベント５０２に対応するゲーム・ストリーム５０４の暗示サブスクライバー処理エージェント１０２を識別することができる。暗示有効化テーブル５０６に基づいて、ランタイム・ストリーム処理レイヤー１２４は、ゲーム・ストリーム５０４の暗示サブスクライバー処理エージェント１０２が、マップＧ上におけるキル(kill)の数を計算するマップ処理エージェント５０８、マップＨ上におけるキルの数を計算するマップ処理エージェント５１０、およびエリート・プレーヤーＣ、Ｍ、およびＳに対するキルの数を計算するエリート・プレー処理エージェント５１２を含むことができる。次いで、ランタイム・ストリーム処理レイヤー１２４は、ゲーム開始イベント５０２に基づいて、ゲーム開始イベント情報５１４を生成し、識別した暗示サブスクライバー処理エージェント５０８、５１０、および５１２への配信のために、それをゲーム・ストリーム５０４にプッシュすることができる。
【００６６】
[0071]  図５Ｂに示す時点Ｔ１において、ゲーム開始イベント情報５１４が、暗示サブスクライバー処理エージェント５０８、５１０、および５１２によって配信され処理されていればよい。処理エージェント５０８において、ゲーム開始イベント情報５１４において示されたゲームＸに関連するマップＨが、マップ処理エージェント５０８に関心のあるマップＧとは異なることを判定することができる。その結果、処理エージェント５０８は、受けたゲーム開始イベント情報５１４に関して何も行わなくてもよい。マップ処理エージェント５１０において、しかしながら、ゲーム開始イベント情報５１４に含まれるマップＨが、マップ処理エージェント５１０に関心のあるものであると判定することができ、したがって、マップ処理エージェント５１０は次いで、ゲームＸにおける全てのキル・イベントを受けるためにゲームＸキル・ストリーム５３０に登録申込みするために、登録申込み５２０を送ることができる。
【００６７】
[0072]  同様に、エリート・プレー処理エージェント５１２は、ゲームＸが、それが処理しているエリート・プレーヤーの内１つを含むと判定することができ、したがってゲームＸプレーヤーＣキル・ストリーム５３２に登録申込みしてゲームＸにおけるプレーヤーＣによる全てのキル・イベントを受けるために、登録申込み５２４を提出することができる。尚、ゲーム開始イベント情報５０４が配信され処理エージェント５０８、５１０、および５１２において処理されている間に、プレーヤーＣによるキル・イベント５１４、プレーヤーＡに報いるための報償イベント５１６、およびプレーヤーＦによるキル・イベント５１８のような、更に多くのイベントが待ち行列１０６において発行される可能性があることは注記してしかるべきである。
【００６８】
[0073]  図５Ｃに示す時点Ｔ２において、ランタイム・ストリーム処理レイヤー１２４は、マップ処理エージェント５１０およびエリート・プレーヤー処理エージェント５１２によって提出されたイベント登録申込みを処理することができる。登録申込み５２２はゲームＸの開始以来全てのキル・イベントを要求するので、ランタイム・ストリーム処理レイヤー１２４は、このような登録申込みが、登録申込み５２２が受けられる前に発行された過去のキル・イベント５１４および５１８を含むと判定することができる。同様に、ランタイム・ストリーム処理レイヤー１２４は、登録申込み５２４が過去のキル・イベント５１４を含むと判定することもできる。したがって、ランタイム・ストリーム処理レイヤー１２４は、キル・イベント５１４および５１８を待ち行列１０６から引き出し、キル・イベント５１４および５１８をマップ処理エージェント５１０に、ゲームＸキル・ストリーム５３０を介して送り、更にキル・イベント５１４をエリート・プレー処理エージェント５１２に、ゲームＸプレーヤーＣキル・ストリーム５３２を介して送ることができる。
【００６９】
[0074]  図５Ｄに示すように、時点Ｔ３において、新たなキル・イベント５２８が待ち行列１０６において発行される。ランタイム・ストリーム処理レイヤー１２４は、イベント５２８を待ち行列１０６から引き出し、この新たなキル・イベント５２８がゲームＸキル・ストリーム５３０に属すると判定することができる。次いで、キル・イベント５２８をゲームＸキル・ストリーム５３０にプッシュし、マップ処理エージェント５１０に配信することができる。ランタイム・ストリーム処理レイヤー１２４は、更に多くのイベントが待ち行列１０６において同様に発行されるに連れて、これらを処理し配信し続けることができる。
【００７０】
[0075]  以上から、暗示サブスクライバー処理エージェント１０２が登録申込みしていないイベントについての情報を、暗示サブスクライバー処理エージェント１０２が受けることを可能にすることにより、システムを通過するイベントに基づいて、ストリーム処理エージェント１０２を自動的に有効化し、これによって非常に細かい(granular)ストリーム処理ユニットをサポートし、こうしてプログラミング・モデルを大幅に簡素化することができる。更に、ストリームの定義を、そのストリームを介して配信されるイベントのセマンティクス(semantics)に縮減することによって、処理エージェント１０２がストリーム・トポロジーを知る必要をなくすことができ、代わりに処理することを望む特定のイベントに集中し、これによって更にプログラミング・モデルを簡素化することができる。加えて、本明細書において紹介した技術を利用することによって、トポロジーをコンパイルし直すまたは配備し直す必要なく、複雑なイベント検出および集計ロジックのその場限りの定義をシステムに動的に適用することができる。
【００７１】
[0076]  図６は、図１に示したコンポーネントを格納および実行することができる計算デバイス６００のコンピューター・アーキテクチャ例を示す。図６に示すコンピューター・アーキテクチャは、従来のサーバー・コンピューター、ワークステーション、デスクトップ・コンピューター、ラップトップ、タブレット、ファブレット(phablet)、ネットワーク・アプライアンス、パーソナル・ディジタル・アシスタント（「ＰＤＡ」）、電子書籍(e-reader)、ディジタル・セルラ・フォン、または他の計算デバイスを例示し、本明細書において紹介したソフトウェア・コンポーネントの内任意のものを実行するために利用することができる。例えば、図６に示すコンピューター・アーキテクチャは、先に説明したソフトウェア・コンポーネントの内任意のものを実行するために利用することもできる。
【００７２】
[0077]  計算デバイス６００は、ベースボード６０２または「マザーボード」を含む。これは、複数のコンポーネントまたはデバイスをシステム・バスまたは他の電気通信経路を介して接続することができる印刷回路ボードである。１つの例示的な形態では、１つ以上の中央処理ユニット（「ＣＰＵ」）６０４がチップセット６０６と共に動作する。ＣＰＵ６０４は、計算デバイス６００の動作に必要な算術および論理動作を実行する標準的なプログラマブル・プロセッサーでよい。
【００７３】
[0078]  ＣＰＵ６０４は、１つの離散物理状態から次の状態に、これらの状態間で区別し(differentiate)、これらの状態を変化させるスイッチング・エレメントの操作によって遷移させることによって、動作を実行する。スイッチング・エレメントは、一般に、フリップ・フロップのような、２つの二進状態の内１つを維持する電子回路、および論理ゲートのような、１つ以上の他のスイッチング・エレメントの状態の論理組み合わせに基づいて、出力状態を与える電子回路を含むことができる。これらの基本的なスイッチング・エレメントを組み合わせると、レジスター、加算器−減算器、算術論理ユニット、浮動小数点ユニット等を含む、更に複雑な論理回路を作ることができる。
【００７４】
[0079]  チップセット６０６は、ＣＰＵ６０４と、ベースボード６０２上のコンポーネントおよびデバイスの残りのものとの間にインターフェースを設ける。チップセット６０６は、計算デバイス６００において主メモリーとして使用されるＲＡＭ６０８へのインターフェースを設けることもできる。更に、チップセット６０６は、リード・オンリー・メモリー（「ＲＯＭ」）６１０または基本ルーチンを格納するための不揮発性ＲＡＭ（「ＮＶＲＡＭ」）のようなコンピューター読み取り可能記憶媒体へのインターフェースも設けることができる。基本ルーチンは、計算デバイス６００を起動し、種々のコンポーネントおよびデバイス間で情報を転送するのを補助する。また、ＲＯＭ６０１またはＮＶＲＡＭは、本明細書において説明した形態による計算デバイス６００の動作に必要な他のソフトウェア・コンポーネントも格納することができる。
【００７５】
[0080]  計算デバイス６００は、ローカル・エリア・ネットワーク６２０のようなネットワークを介して、リモート計算デバイスおよびコンピューター・システムへの論理接続を使用して、ネットワーク接続環境において動作することができる。チップセット６０６は、ギガバイト・イーサネット（登録商標）・アダプターのような、ネットワーク・インターフェース・コントローラー（ＮＩＣ）６１２を介してネットワーク接続を設けるための機能を含むことができる。ＮＩＣ６１２は、計算デバイス６００を他の計算デバイスにネットワーク６２０を介して接続することができる。尚、複数のＮＩＣが計算デバイス６００内に存在し、コンピューターを他のタイプのネットワークおよびリモート・コンピューター・システムに接続できることも認められてしかるべきである。ローカル・エリア・ネットワーク６２０は、計算デバイス６００が、リモート・サービスおよびリモート・コンピューター６５０のようなサーバーと通信することを可能にする。
【００７６】
[0081]  計算デバイス６００は、計算デバイスに不揮発性ストレージを設ける大容量記憶デバイス６１６に接続することもできる。大容量記憶デバイス６１６は、システム・プログラム、アプリケーション・プログラム、他のプログラム・モジュール、およびデーターを格納することができ、これについては本明細書において更に詳細に説明した。大容量記憶デバイス６１６は、チップセット６０６に接続されたストレージ・コントローラー６１４を介して、計算デバイス６００に接続することができる。大容量記憶デバイス６１６は、１つ以上の物理記憶ユニットで構成することができる。ストレージ・コントローラー６１４は、シリアル・アタッチドＳＣＳＩ（「ＳＡＳ」）インターフェース、シリアル高度技術接続（「ＳＡＴＡ」： serial advanced technology attachment）インターフェース、ファイバー・チャネル（「ＦＣ」）インターフェース、またはコンピューターと物理記憶ユニットとの間を物理的に接続しデーターを転送するための他のタイプのインターフェースを介して、物理記憶ユニットとインターフェースすることができる。また、大容量記憶デバイス６１６、他の記憶媒体、およびストレージ・コントローラー６１４は、ＭｕｌｔｉＭｅｄｉａＣａｒｄ（ＭＭＣ）コンポーネント、ｅＭＭＣコンポーネント、セキュア・ディジタル（ＳＤ）コンポーネント、ＰＣＩ  Ｅｘｐｒｅｓｓコンポーネント等も含むことができることも認められてしかるべきである。
【００７７】
[0082]  計算デバイス６００は、格納される情報を反映するように物理記憶ユニットの物理状態を変換することによって、データーを大容量記憶デバイス６１６に格納することができる。物理状態の具体的な変換は、この説明の異なる実現例では、種々の要因に依存する場合もある。このような要因の例には、物理記憶ユニットを実現するために使用される技術、大容量記憶デバイス１６１が主ストレージまたは副ストレージのどちらとして特徴付けられるか等を含むことができるが、これらに限定されるのではない。
【００７８】
[0083]  例えば、計算デバイス６００は、ストレージ・コントローラー６１４を介して、磁気ディスク・ドライブ・ユニット内の特定の位置の磁気特性、光記憶ユニットにおける特定の位置の反射または屈折特性、あるいはソリッド・ステート記憶ユニットにおける特定のキャパシター、トランジスター、または他のディスクリート・コンポーネントの電気的特性を変化させる命令を発行することによって、情報を大容量記憶デバイス６１６に格納することができる。物理媒体の他の変換も、本説明の範囲および主旨から逸脱することなく、可能であり、以上の例はこの説明を容易にするために示されたに過ぎない。更に、計算デバイス６００は、物理記憶ユニット内の１つ以上の特定の位置の物理状態または特性を検出することによって、大容量記憶デバイス６１６から情報を読み出すこともできる。
【００７９】
[0084]  以上で説明した大容量記憶デバイス６１６に加えて、計算デバイス６００は、プログラム・モジュール、データー構造、または他のデーターのような情報を格納し引き出すために、他のコンピューター読み取り可能記憶媒体にアクセスすることができるとよい。つまり、ランタイム・システム１０８および他のモジュールは大容量記憶デバイス６１６に格納されたデーターおよびソフトウェアとして表されているが、ランタイム・システム１０８および／または他のモジュールは、少なくとも部分的に、デバイス６００の他のコンピューター読み取り可能記憶媒体に格納されてもよいことは認められてしかるべきである。本明細書に含まれるコンピューター読み取り可能媒体の説明は、ソリッド・ステート・ドライブ、ハード・ディスク、またはＣＤ−ＲＯＭドライブのような大容量記憶デバイスに言及するが、コンピューター読み取り可能媒体は、計算デバイス６００によってアクセスすることができる任意の入手可能なコンピューター記憶媒体または通信媒体とすることができることは、当業者によって認められてしかるべきである。
【００８０】
[0085]  通信媒体は、コンピューター読み取り可能命令、データー構造、プログラム・モジュール、または他のデーターを、搬送波のような変調データー信号、または他の移送メカニズムに含み、任意の配信媒体を含む。「変調データー信号」という用語は、信号内に情報をエンコードするようにその特性の内１つ以上が変更または設定された信号を意味する。一例として、そして限定ではなく、通信媒体は、有線ネットワークまたは直接有線接続のような有線媒体、ならびに音響、ＲＦ、赤外線、および他のワイヤレス媒体のようなワイヤレス媒体を含む。以上の内任意のものの組み合わせも、コンピューター読み取り可能媒体の範囲に含まれてしかるべきである。  
【００８１】
[0086]  一例として、そして限定ではなく、コンピューター記憶媒体は、コンピューター読み取り可能命令、データー構造、プログラム・モジュール、または他のデーターのような情報の格納のための任意の方法または技術で実現される揮発性および不揮発性、リムーバブルおよび非リムーバブル媒体を含むことができる。例えば、コンピューター媒体は、ＲＡＭ、ＲＯＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、フラッシュ・メモリーまたは他のソリッド・ステート・メモリー技術、ＣＤ−ＲＯＭ、ディジタル・バーサタイル・ディスク（「ＤＶＤ」）、ＨＤ−ＤＶＤ、ＢＬＵ−ＲＡＹ、または他の光ストレージ、磁気カセット、磁気テープ、磁気ディスク・ストレージまたは他の磁気記憶デバイス、あるいは所望の情報を格納するために使用することができ計算デバイス６００によってアクセスすることができる任意の他の媒体を含むが、これらに限定されるのではない。請求項に限って言えば、「コンピューター記憶媒体」、「コンピューター読み取り可能記憶媒体」という句、およびこれらの異形は、波や信号自体、および／または通信媒体を含まない。
【００８２】
[0087]  大容量記憶デバイス６１６は、計算デバイス６００の動作を制御するために利用されるオペレーティング・システム６２２を格納することができる。１つの形態によれば、オペレーティング・システムはＬＩＮＵＸオペレーティング・システムを含む。他の形態によれば、オペレーティング・システムは、ＭＩＣＲＯＳＯＦＴ  ＣｏｒｐｏｒａｔｉｏｎからのＷＩＮＤＯＷＳ（登録商標）オペレーティング・システムを含む。更に他の態様によれば、オペレーティング・システムは、ＵＮＩＸ（登録商標）、Ａｎｄｒｏｉｄ、Ｗｉｎｄｏｗｓ  Ｐｈｏｎｅ、またはｉＯＳオペレーティング・システムを含んでもよい。尚、他のオペレーティング・システムも利用してもよいことは認められてしかるべきである。大容量記憶デバイス６１６は、ランタイム・システム１０８および／または以上で説明した他のソフトウェア・コンポーネントおよびデーターの内任意のもののような、計算デバイス６００によって利用される他のシステムまたはアプリケーション・プログラム、およびデーターも格納することができる。また、大容量記憶デバイス６１６は、本明細書では具体的に識別されなかった他のプログラムやデーターも格納することができる。
【００８３】
[0088]  １つの形態では、大容量記憶デバイス６１６または他のコンピューター読み取り可能記憶媒体には、コンピューター実行可能命令がエンコードされる。コンピューター実行可能命令は、計算デバイス６００内にロードされると、コンピューターを汎用計算システムから、本明細書において説明した形態を実現することができる特殊目的コンピューターに変換する。これらのコンピューター実行可能命令は、以上で説明したように、ＣＰＵ６０４がどのように状態間を遷移するか指定することによって、計算デバイス６００を変換する。１つの形態によれば、計算デバイス６００は、コンピューター実行可能命令を格納するコンピューター読み取り可能記憶媒体にアクセスすることができ、コンピューター実行可能命令が計算デバイス６００によって実行されると、図３および図４に関して先に説明した種々のルーチンを実行する。また、計算デバイス６００は、本明細書において説明した他のコンピューター実装動作の内任意のものを実行するために、コンピューター読み取り可能記憶媒体を含むこともできる。
【００８４】
[0089]  また、計算デバイス６００は、入力デバイス６１９から入力を受けて処理する１つ以上の入力／出力コントローラー６１７も含むことができる。入力デバイス６１９は、キーボード、マウス、マイクロフォン、ヘッドセット、タッチパッド、タッチ・スクリーン、電子スタイラス、または任意の他のタイプの入力デバイスのような、複数の入力デバイスを含むことができる。同様に、入力／出力コントローラー６１７は、コンピューター・モニター、フラット・パネル・ディスプレイのようなディスプレイ、ディジタル・プロジェクター、プリンター、プロッター、または他のタイプの出力デバイスに出力を供給することができる。尚、計算デバイス６００は図６に示すコンポーネントの全てを含まなくてもよく、図６には明示的に示されない他のコンポーネントを含むこともでき、または図６に示すものとは完全に異なるアーキテクチャを利用してもよいことは認められてしかるべきである。
【００８５】
[0090]   本明細書において紹介した開示は、以下の節において検討することもできる。
[0091]  節１：イベントを配信するためのコンピューター実装方法であって、この方法は、イベントの発行を受けるステップと、処理エージェントの構成に基づいて、イベントに関連する情報を受けるために処理エージェントを識別するステップであって、処理エージェントがイベントを受けることを明示的に登録申込みしない、ステップと、処理エージェントが有効化されているか否か判定するステップと、処理エージェントが有効化されていないと判定したことに応答して、処理エージェントを有効化するステップと、イベントに関連する情報を処理エージェントに配信するステップと、処理エージェントから１つ以上のイベントへの登録申込みを受けるステップと、１つ以上のイベントを処理エージェントに配信するステップとを含む。
【００８６】
[0092]  節２：節１の方法であって、更に、登録申込みが、１つ以上の過去のイベントが配信されることを指定するか否か判定するステップと、登録申込みが１つ以上の過去のイベントが配信されることを指定すると判定したことに応答して、１つ以上の過去のイベントを処理エージェントに配信するステップとを含む。
【００８７】
[0093]  節３：節１および２の方法において、待ち行列においてイベントの発行を受けるステップが、イベントを待ち行列において発行する要求を受けるステップと、イベントに対応する仮想ストリームを有効化するステップと、仮想ストリームを介して待ち行列においてイベントを発行するステップとを含む。
【００８８】
[0094]  節４：節１〜３の方法において、１つ以上のイベントに対する登録申込みが仮想ストリームを定め、登録申込みが、１つ以上のイベントに対応する仮想ストリームに対する登録申込みである。
【００８９】
[0095]  節５：節１〜４の方法において、処理エージェントを有効化するステップが、システム・リソースを処理エージェントに割り当てるステップを含み、仮想ストリームに対する登録申込みが仮想ストリームを有効化し、システム・リソースを仮想ストリームに割り当てさせる。
【００９０】
[0096]  節６：節１〜５の方法であって、更に、一定の時間期間にわたって仮想ストリームにおいてイベントが受けられないとき、仮想ストリームに割り当てられたシステム・リソースを取り戻すことによって、仮想ストリームを無効化するステップと、処理エージェントが所与の時間期間にわたってアイドルになったとき、処理エージェントに割り当てられたシステム・リソースを取り戻すことによって、処理エージェントを無効化するステップとを含む。
【００９１】
[0097]  節７：節１〜６の方法において、処理エージェントの構成が、プログラミングによって得られるか、または処理エージェントの宣言的定義から決定される。
[0098]  節８：節１〜７の方法において、処理エージェントが有効化されているかまたは有効化されていないかには関係なく、処理エージェントがイベントを配信するためにアドレス可能である。
【００９２】
[0099]  節９：コンピューター実行可能命令が格納されたコンピューター読み取り可能記憶媒体であって、コンピューター実行可能命令がコンピューターによって実行されると、このコンピューターに、待ち行列において発行されているイベントを受けるために、このイベントに明示的にイベントに登録申込みしていない処理エージェントを決定させ、このイベントに対応する第１仮想ストリームを介して、このイベントが待ち行列において発行されており、処理エージェントが有効化されているか否か判定させ、処理エージェントが有効化されていないと判定したことに応答して、処理エージェントを有効化させ、イベントのイベント情報を処理エージェントに配信させ、明示的な登録申込みによって定められる第２仮想ストリームに対する明示登録申込みを処理させ、明示登録申込みが、処理エージェントに配信されたイベント情報に応答して、処理エージェントによって提出され、第２仮想ストリームにおけるイベントを処理エージェントに配信させる。
【００９３】
[00100]  節１０：節９のコンピューター読み取り可能記憶媒体において、待ち行列において発行されるイベントが永続化される。
[00101]  節１１：節９〜１０のコンピューター読み取り可能記憶媒体であって、更に、コンピューター実行可能命令を含み、コンピューターによって実行されると、このコンピューターに、第２仮想ストリームが、待ち行列において発行された過去のイベントを含むか否か判定させ、第２仮想ストリームが待ち行列において発行された過去のイベントを含むと判定したことに応答して、過去のイベントを第２仮想ストリームにプッシュさせ、処理エージェントに配信させる。
【００９４】
[00102]  節１２：節９〜１１のコンピューター読み取り可能記憶媒体であって、更に、コンピューター実行可能命令を含み、コンピューターによって実行されると、このコンピューターに、一定の時間期間にわたって第２仮想ストリームにおいてイベントが受けられないとき、この仮想ストリームに割り当てられたシステム・リソースを取り戻すことによって、第２仮想ストリームを無効化させ、所与の時間期間にわたって処理エージェントがアイドルになったとき、この仮想エージェントに割り当てられたシステム・リソースを取り戻すことによって、この処理エージェントを無効化させる。
【００９５】
[00103]  節１３：節９〜１２のコンピューター読み取り可能記憶媒体において、処理エージェントを有効化することが、システム・リソースをこの処理エージェントに割り当てることを含み、第２仮想ストリームに対する登録申込みが、第２仮想ストリームを有効化し、システム・リソースを第２仮想ストリームに割り当てさせる。
【００９６】
[00104]  節１４：節９〜１３のコンピューター読み取り可能記憶媒体において、処理エージェントが有効化されているかまたは有効化されていないかには関係なく、処理エージェントが、イベントを配信するためにアドレス可能である。
【００９７】
[00105]  節１５：節９〜１４のコンピューター読み取り可能記憶媒体において、処理エージェントがプログラミングによって得られるか、または処理エージェントの宣言的定義に基づいて決定される。
【００９８】
[00106]  節１６：ランタイムを実行する１つ以上の計算デバイスを含むシステムであって、このランタイムが、イベントの発行を受けて永続化する待ち行列を管理し、第１仮想ストリームにおいてイベントの発行を受け、イベントの発行を待ち行列に転送し、処理エージェントの構成に基づいて、イベントのイベント情報を配信するために処理エージェントを識別し、処理エージェントがイベントを受けることを明示的に登録申込みせず、処理エージェントが有効化されているかまたは有効化されていないかには関係なく、イベント情報を配信するためにアドレス可能であり、処理エージェントが有効化されているか否か判定し、処理エージェントが有効化されていないと判定したことに応答して、処理エージェントを有効化し、イベント情報を処理エージェントに配信し、イベント情報が処理エージェントに配信された後に、処理エージェントから第２仮想ストリームにおいてイベントに対する明示的登録申込みを受け、明示的登録申込みが、当該明示的登録申込みが受けられる前に、待ち行列において発行された過去のイベントを指定するか否か判定し、明示的登録申込みが過去のイベントを指定すると判定したことに応答して、待ち行列において発行された過去のイベントから、過去のイベントを引き出し、過去のイベントを第２仮想ストリームにプッシュし、第２仮想ストリームにおけるイベントを処理エージェントに配信するように構成される。
【００９９】
[00107]  節１７：節１６のシステムにおいて、処理エージェントを有効化する動作が、システム・リソースを処理エージェントに割り当てる動作を含み、第２仮想ストリームに対する登録申込みが、第２仮想ストリームを有効化し、第２仮想ストリームにシステム・リソースを割り当てさせる。
【０１００】
[00108]  節１８：節１６〜１７のシステムであって、更に、１つ以上の処理エージェントを実行する複数のサーバーを含み、ランタイムが、更に、処理エージェントが有効化された１つのサーバーの障害後に、他のサーバーにおいて処理エージェントを再有効化することによって、処理エージェントを復元するように構成される。
【０１０１】
[00109]  節１９：節１６〜１８のシステムにおいて、処理エージェントの構成が、プログラミングによって得られるか、または処理エージェントの宣言的定義から決定される。
【０１０２】
[00110]  節２０：節１６〜１９のシステムにおいて、ランタイムが、更に、 一定の時間期間にわたって第２仮想ストリームにおいてイベントが受けられないとき、この仮想ストリームに割り当てられたシステム・リソースを取り戻すことによって、第２仮想ストリームを無効化し、所与の時間期間にわたって処理エージェントがアイドルになったとき、この仮想エージェントに割り当てられたシステム・リソースを取り戻すことによって、この処理エージェントを無効化するように構成される。
【０１０３】
[00111]  以上に基づいて、イベントを登録申込みし、受け、処理するための概念および技術が本明細書において紹介されたことが認められるはずである。本明細書において紹介した主題は、コンピューターの構造的特徴、方法論的アクト、およびコンピューター読み取り可能媒体に特定の文言で記載されたが、添付する特許請求の範囲において定められる発明は、必ずしも本明細書において説明した具体的な特徴、アクト、または媒体に限定されないことは理解されよう。逆に、具体的な特徴、アクト、および媒体は、特許請求の範囲を実現する形態例として開示されたまでである。
【０１０４】
[00112]  以上で説明した主題は、例示として提示したに過ぎず、限定として解釈すべきではない。本明細書において説明した主題には、例示し説明した形態例およびアプリケーション例に従うことなく、そして以下の特許請求の範囲において説明される、本発明の真の主旨および範囲から逸脱することなく、種々の変更(modification)および変化(change)が行われてもよい。
【図１】
0006523425.tif 000002
【図２】
0006523425.tif 000003
【図３】
0006523425.tif 000004
【図４】
0006523425.tif 000005
【図５Ａ】
0006523425.tif 000006
【図５Ｂ】
0006523425.tif 000007
【図５Ｃ】
0006523425.tif 000008
【図５Ｄ】
0006523425.tif 000009
【図６】
0006523425.tif 000010