(57)【特許請求の範囲】
【請求項１】
両方向ルーティング用に構成されたノードのリングのフェデレーションインフラストラクチャ内に維持される複製セット内でデータアクセストランザクションを実行する方法であって、
プライマリノードがノードの複製セット内の複数のノードの中から選ばれたことを判定する行為であって、前記プライマリノードは、クライアントデータアクセス要求を受け入れ、処理するように構成され、前記複製セットは、前記プライマリノードおよび１つまたは複数のセカンダリノードを含む、行為と、
前記プライマリノードが、１つまたは複数のクライアントデータアクセス要求を受信する行為であって、各データアクセス要求は、前記複製セット内で少なくとも前記プライマリノード上でアクセスされるデータの少なくとも一部を示す、行為と、
前記プライマリノードが、前記クライアントデータアクセス要求が受信される順序で状態を変化させる前記クライアントデータアクセス要求のそれぞれにデータシーケンス番号を割り当てる行為であって、前記データシーケンス番号は、前記複製セット内の前記ノードのそれぞれによって従われる、動作のシーケンスを表す線形化された処理順序を含む、行為と、
前記プライマリノードが、任意の対応するデータシーケンス番号を含む前記クライアントデータアクセス要求のうちの少なくとも１つを前記セカンダリノードのうちの少なくとも１つに送信する行為と、
前記プライマリノードが、少なくとも閾値個数のセカンダリノードから、前記クライアントデータアクセス要求の受信を示す肯定応答を受信する行為と、
前記プライマリノードが、前記データアクセス要求をコミットする行為であって、前記コミットは、前記クライアントデータアクセス要求に従ってデータにアクセスすることを含む、行為と
を含むことを特徴とする方法。
【請求項２】
前記プライマリノードは、前記データアクセス要求を単一フェーズでコミットすることを特徴とする請求項１に記載の方法。
【請求項３】
ノードの前記複製セット内の複数のノードの間からプライマリノードを選ぶ行為をさらに含むことを特徴とする請求項１に記載の方法。
【請求項４】
許容可能な同時障害の最大個数に基づいて、前記複製セットのメンバになるセカンダリノードの個数を判定する行為をさらに含むことを特徴とする請求項１に記載の方法。
【請求項５】
前記肯定応答は、前記クライアントデータアクセス要求の受入または拒否のうちの少なくとも１つを示すことを特徴とする請求項１に記載の方法。
【請求項６】
前記閾値個数のセカンダリノードは、クォーラムを表すことを特徴とする請求項１に記載の方法。
【請求項７】
プライマリになるはずのノードが、前記プライマリになるはずのノードが知らないすべてのトランザクションを判定するために前記クォーラムのセカンダリノードに要求を送信する行為をさらに含むことを特徴とする請求項６に記載の方法。
【請求項８】
前記クォーラムの各メンバが、少なくとも、ＬＳＮによって順序付けられる各メンバのデータアクセスキューに前記クライアントデータアクセス要求を挿入したことの表示を前記クォーラムの各メンバから受信することをさらに含むことを特徴とする請求項６に記載の方法。
【請求項９】
データの一部は、ＬＳＮ、ＣＳＮ、ＤＳＮ、プライマリノードアイデンティティ、およびセカンダリノードアイデンティティのうちの少なくとも１つを含む、前記複製セット自体に関する制御情報のセットを含むことを特徴とする請求項１に記載の方法。
【請求項１０】
前記データアクセス要求を単一フェーズでコミットすることは、前記セカンダリノードのいずれかに関してコミットクエリを送信することおよび受信することを伴わずに前記データにアクセスすることを含むことを特徴とする請求項１に記載の方法。
【請求項１１】
前記クライアントデータアクセス要求を第２複製セットに送信する行為をさらに含み、前記第２複製セットは、前記プライマリノードの近傍ノードとは異なる近傍ノードに位置することを特徴とする請求項１に記載の方法。
【請求項１２】
前記複製セットは、前記クライアントデータアクセス要求の第１部分を処理することを要求され、前記第２複製セットは、前記データアクセス要求の第２の異なる部分を処理することを要求されることを特徴とする請求項１１に記載の方法。
【請求項１３】
前記クライアントデータアクセス要求の前記第１部分に対応する前記複製セットからの応答を受信する行為と、
前記データアクセス要求の前記第２の異なる部分に対応する前記第２複製セットからの応答を受信する行為と、
前記応答を組み合わせる行為と、
前記組み合わされた応答に基づいて、最新のデータアクセス応答を生成する行為と
をさらに含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
両方向ルーティング用に構成されたノードのリングのフェデレーションインフラストラクチャ内で、フェデレーションインフラストラクチャ内の複製セットからデータにアクセスするシステムであって、
前記リング上の複数のノードの近傍を確立するように構成された近傍確立モジュールであって、前記近傍は、少なくとも直接に隣接する先行ノードおよび直接に隣接する後続ノードを含む、近傍確立モジュールと、
前記確立された近傍の外の参加するノードが、ノードの前記リング内の前記確立された近傍に参加する意図を示したことを判定するように構成された意図判定モジュールと、
前記複数のノード内の各ノードが前記近傍内のｉｄ空間の一部のｉｄ空間オーナーシップをとるように、前記確立された近傍内のリング一貫性を維持するように構成された一貫性維持モジュールと、
前記複数のノード内の前記ノードの１つが、プライマリノードによって向けられるクライアントデータアクセス要求に応答するように構成されたノードの複製セットにまたがる責任を有する前記プライマリノードになるために選ばれたことを判定するように構成された選出判定モジュールと、
１つまたは複数のクライアントデータアクセス要求を受信するように構成された要求受信モジュールであって、各データアクセス要求は、前記複製セット内の前記ノードのうちの少なくとも１つでアクセスされるデータの少なくとも一部を示す、要求受信モジュールと、
前記クライアントデータアクセス要求内で示されるデータにアクセスするように構成されたデータアクセスモジュールと
を含むことを特徴とするシステム。
【請求項１５】
前記データアクセスモジュールは、クライアントデータ書き込み要求に従ってデータを書き込むように構成されることを特徴とする請求項１４に記載のシステム。
【請求項１６】
前記プライマリノードは、セカンダリノードに、前記クライアントデータ書き込み要求内で示される前記データを前記セカンダリノードによって管理されるデータストアに書き込むように指示することを特徴とする請求項１５に記載のシステム。
【請求項１７】
前記プライマリノードは、前記書き込み要求を１つまたは複数のセカンダリノードに２フェーズで複製することを特徴とする請求項１５に記載のシステム。
【請求項１８】
前記データアクセスモジュールは、クライアントデータ読み取り要求に従ってデータを読み取るように構成されることを特徴とする請求項１４に記載のシステム。
【請求項１９】
前記クライアントデータ読み取り要求は、セカンダリノードによって直接に処理されることを特徴とする請求項１８に記載のシステム。
【請求項２０】
プライマリの前記確立された近傍は、そのプライマリの複製セットのセカンダリノードのセットであることを特徴とする請求項１４に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フェデレーションインフラストラクチャ内の一貫性に関する。
【背景技術】
【０００２】
コンピュータシステムおよび関連するテクノロジは、社会の多くの側面に影響する。実際に、コンピュータシステムの情報を処理する能力は、我々が生活し、働く形を変えてきた。コンピュータシステムは、今や、一般に、コンピュータシステム出現の前に手作業で実行されタスク（例えば、ワードプロセッシング、スケジューリング、およびデータベース管理）のホストを実行する。最近では、コンピュータシステムは、お互いおよび他の電子デバイスに結合されて、有線および無線のコンピュータネットワークを形成し、このネットワーク上で、コンピュータシステムおよび他の電子デバイスが電子データを転送することができる。その結果、コンピュータシステムで実行される多くのタスク（例えば、音声通信、電子メールへのアクセス、ホームエレクトロニクスの制御、ウェブブラウジング、および文書の印刷）は、複数のコンピュータシステムおよび／または他の電子デバイスの間の有線コンピュータネットワークおよび／または無線コンピュータネットワークを介する電子メッセージの交換を含む。
【０００３】
しかし、コンピュータ化されたタスクを実行するのにネットワークリソースを利用するために、コンピュータシステムは、ネットワークリソースを識別し、これにアクセスする何らかの手段を有しなければならない。したがって、リソースは、通常、リソースを一意に識別し、あるリソースを他のリソースから区別するのに使用できる一意識別子、例えば、ネットワークアドレスを割り当てられる。したがって、リソースを利用することが望まれるコンピュータシステムは、リソースに対応するネットワークアドレスを使用してそのリソースに接続することができる。しかし、ネットワークリソースへのアクセスは、コンピュータシステムがネットワークリソースのネットワークアドレスの以前の知識を有しない場合にはむずかしくなり得る。例えば、コンピュータシステムは、そのコンピュータシステム（または別のネットワーク化されたコンピュータシステム）がネットワークプリンタのネットワークアドレスを知らない限り、ネットワークプリンタで文書を印刷することができない。
【０００４】
したがって、様々な機構（例えば、ドメインネームシステム（「ＤＮＳ」）、アクティブディレクトリ（「ＡＤ」）、分散ファイルシステム（「ＤＦＳ」））が、コンピュータシステムが以前に未知のリソースを識別する（およびアクセスする）ために開発されてきた。しかし、異なるコンピュータネットワークを介してアクセス可能なリソース（例えば、デバイスおよびサービス）の量および多様性に起因して、開発者は、しばしば、様々な異なるリソース識別機構およびリソースアクセス機構を実施するアプリケーションを開発することを要求される。異なる機構のそれぞれは、異なるコーディング要件を有し、開発者に、アプリケーション内で必要になるすべての機能性を提供しない場合がある。
【０００５】
例えば、ＤＮＳは、分散管理アーキテクチャを有する（すなわち、集中管理が不要である）が、ＤＮＳは、十分にダイナミックでも自己管理式でもなく、弱いデータおよびクエリモデルをサポートし、固定されたルートのセットを有する。その一方で、ＡＤは、十分にダイナミックであるが、集中管理を必要とする。さらに、異なる機構の諸態様は、互いに互換ではない場合がある。例えば、ＤＮＳを使用して識別されるリソースが、ＤＦＳルーティングプロトコルと互換でない場合がある。したがって、開発者は、最も適切な機構を選択し、他の機能の利益を捨てることを強いられる場合がある。
【０００６】
リソースを識別する機構は、ピアツーピアネットワークで特に問題になり得る。ＤＮＳは、ルックアップ要求を実施するために特殊なルートサービスのセットに頼る、キーとしてホスト名および値としてＩＰアドレスを有するルックアップサービスを提供する。さらに、ＤＮＳは、クライアントがネームサーバ階層をナビゲートすることを可能にするための情報（ＮＳレコード）の管理を必要とする。したがって、リソースをネットワーク上で識別できるようになる前に、そのリソースをＤＮＳに入力しなければならない。より大きいスケールで、ノードが情報のエントリに頼ってネットワークに頻繁に接続し、切断するネットワークは、必ずしも実用的とは限らない。さらに、ＤＮＳは、ホストまたはサービスを発見するというタスクに特殊化され、他のタイプのリソースに一般的に適用可能ではない。
【０００７】
したがって、リソース識別およびアクセスの他の仕組みが、これらの欠点に対処することを試みて開発されてきた。ＤＮＳより拡張性のある複数の機構は、分散ルックアッププロトコルを含む。これらの機構は、要求を対応するリソースにルーティングし、ルックアップ用の情報を格納するために、様々なノード配置およびルーティングアルゴリズムを使用する。
【０００８】
これらの機構のうちの少なくとも１つは、宛先ノードへメッセージをルーティングするのに、ネットワーク内の各ノードでローカルマルチレベル近傍マップを利用する。これは、本質的に、各ノードがノード（近傍マップ内のノード）の対応するツリーの「ルートノード」であるアーキテクチャをもたらす。メッセージは、１桁ずつ宛先ＩＤに増分式にルーティングされる（例えば、＊＊＊６ → ＊＊４６ →，＊３４６ → ２３４６、ただし、＊はワイルドカードを表す）。このタイプの機構のルーティング効率は、Ｏ（ｌｏｇ Ｎ）ルーティングホップであり、ノードがＯ（ｌｏｇ Ｎ）サイズのルーティングテーブルを維持することを必要とする。
【０００９】
これらの機構のうちの他の少なくとも１つは、数の線形リングからとられた一意ＩＤをノードに割り当てる。ノードは、それに直接に後続するノード（ＩＤ値による）へのポインタおよびそのＩＤ値が値ＩＤ＋２Lの最も近い後続物であるノードへのポインタを含むルーティングテーブルを維持する。このタイプの機構のルーティング効率は、やはりＯ（ｌｏｇ Ｎ）ルーティングホップであり、ノードがＯ（ｌｏｇ Ｎ）サイズのルーティングテーブルを維持することを必要とする。
【００１０】
少なくとも１つのさらなる機構は、Ｏ（ｌｏｇ Ｎ1/d）ルーティングホップを必要とし、ノードがＯ（Ｄ）サイズのルーティングテーブルを維持することを必要とする。したがって、これらの機構のすべてのルーティング効率は、少なくとも部分的に、システム内のノードの個数に依存する。
【００１１】
さらに、ＩＤは（少なくともいくつかの機構について）、リングに沿って均一に分布させることができるので、リング上のノードの間のルーティングがある非効率性をもたらす可能性が必ずある。例えば、ルーティングホップが、膨大な地理的距離をまたぐ可能性があり、より高価なリンクをまたぐ可能性があり、非セキュアドメインを通過する可能性などがある。さらに、メッセージルーティングが、複数のホップを伴うときに、そのようなイベントが複数回発生する可能性がある。残念ながら、これらの機構は、お互いに関するノードの近接（物理的なまたは他の形の）を考慮に入れていない。例えば、リング上のノード分布に応じて、ニューヨークからボストンへのメッセージのルーティングが、ニューヨークからロンドン、アトランタ、東京を経てボストンへのメッセージのルーティングを用いる可能性がある。
【００１２】
したがって、少なくとも１つの他の最近の仕組みは、単一のスカラ近接メトリック（例えば、ＩＰルーティングホップ数または地理的距離）として近接を定義することによって、近接を考慮に入れる。これらの機構は、ルーティングテーブルエントリの近接ベースの選択という概念を使用する。ルーティングテーブルエントリごとに多数の「正しい」ノード候補があるので、これらの機構は、候補ノードの中から近さ的に近いノードを選択することを試みる。これらの機構のために、各ノードがそれ自体への所与のＩＰノードを有するノードの「距離」を判定することを可能にする関数を提供することができる。メッセージは、より離れたノードへのルーティングの前に宛先に向かって進行するために、より近い近接内のノードの間でルーティングされる。したがって、一部のリソースを節約することができ、ルーティングは、より効率的である。
【００１３】
残念ながら、これらの既存の機構は、通常、とりわけ、ノードの間の対称関係（すなわち、第１ノードが、第２ノードがパートナになると考える場合に、第２ノードも、第１ノードをパートナと考える）、リング上での両方向（時計回りおよび反時計回り）でのメッセージのルーティング、複数の近接メトリックスに基づくノードのリンクリストのパーティショニング、および複数の近接メトリックスに基づくメッセージのルーティングを提供しない。これらの不足は、例えば、ネットワークのすべてのノードにデータをブロードキャストするときなど、ネットワークのノードの間でのデータのダイナミックで分散した効率的な転送を制限する可能性がある。
【発明の概要】
【発明が解決しようとする課題】
【００１４】
いくつかの環境で、セーフティ機構が、ノード責任が不適当にオーバーラップしないことを保証するのに使用される。例えば、セーフティ機構は、２つの異なるノードが、１つのシステムリソース（例えば、１つのメッセージ）またはシステム内の論理アイデンティティの責任を主張しないようにするのに使用することができる。いくつかの環境で、ライブネス機構が、メッセージが１つのターゲットに繰り返して送信される場合にそのメッセージが受け入れられることを保証するのに使用される。残念ながら、多くの既存の非同期システムは、限られたセーフティ機構およびライブネス機構(liveness mechanisms)のみを提供する。例えば、一部の非同期システムは、最終的にのみセーフティおよびライブネスを提供する。したがって、これらの非同期システムは、例えば、信頼すべきストレージなど、様々なタイプのアプリケーションに適切ではない。
【課題を解決するための手段】
【００１５】
本発明は、ランデブフェデレーション（ｒｅｎｄｅｚｖｏｕｓ ｆｅｄｅｒａｔｉｏｎ）内で維持される複製セット内でデータアクセストランザクションを実行する方法、システム、およびコンピュータプログラム製品におよぶ。いくつかの実施形態で、プライマリノードが、ノードの複製セット内の複数のノードの中から選ばれたことが判定される。プライマリノードは、クライアントデータアクセス要求を受け入れ、処理するように構成される。複製セットは、プライマリノードおよび他のセカンダリノードを含む。プライマリノードは、クライアントデータアクセス要求を受信し、各データアクセス要求は、複製セット内でプライマリノード上でアクセスされなければならないデータの少なくとも一部を示す。
【００１６】
プライマリノードは、クライアントデータアクセス要求が受信される順序でクライアントデータアクセス要求のそれぞれにデータシーケンス番号を割り当てる。データシーケンス番号は、複製セット内のノードのそれぞれが従わなければならない線形化された処理順序を含む。プライマリノードは、任意の対応するデータシーケンス番号を含むクライアントデータアクセス要求のうちの少なくとも１つを、セカンダリノードに送信する。プライマリノードは、少なくとも閾値個数のセカンダリノードから、クライアントデータアクセス要求の受信を示す肯定応答を受信する。プライマリノードは、データアクセス要求をコミットする。コミットは、クライアントデータアクセス要求に従ってデータにアクセスすることを含む。
【００１７】
この要約は、下の「発明を実施するための形態」でさらに説明される概念の選択物を単純化された形で導入するために提供される。この要約は、請求される主題の主要な特徴または本質的特徴を識別することを意図されたものではなく、請求される主題の範囲を判定する際の助けとして使用されることを意図されたものでもない。
【００１８】
追加の特徴および利益は、次の説明で示され、部分的にはその説明から明白になり、あるいは本明細書の教示の実践によって習得することができる。本発明の特徴および利益は、添付の特許請求の範囲で具体的に指摘される機器および組合せによって実現し、入手することができる。本発明の特徴は、次の説明および添付の特許請求の範囲からより十分に明らかになり、あるいは、下で示される本発明の実践によって習得することができる。
【００１９】
上で列挙したおよび他の利益および特徴を入手できる形を説明するために、上で短く説明した主題のより具体的な説明を、添付図面に示された特定の実施形態を参照することによって行う。これらの図面が通常の実施形態のみを示し、したがって、範囲において限定的と考えられてはならないことを理解して、実施形態を、添付図面の使用を介してさらに具体的かつ詳細に記述し、説明する。
【図面の簡単な説明】
【００２０】
【図１】フェデレーションインフラストラクチャの一例を示す図である。
【図２】パートナへの間接的な要求のルーティングを容易にするコンピューティングアーキテクチャの一例を示す図である。
【図３】ソートされたリストおよび対応するリングの形の、フェデレーションインフラストラクチャ内のノードの間の例示的なバイナリ関係を示す図である。
【図４】近接ルーティングを容易にするリングの例のリングを示す図である。
【図５】近接ルーティングを容易にするリングの例の近接誘導されたパーティションツリーを示す図である。
【図６】本発明の原理に適切なオペレーティング環境を示す図である。
【図７】近接判断基準を考慮に入れるノードルーティングテーブルを移植する方法を示す一例の流れ図である。
【図８】フェデレーションインフラストラクチャのノードをパーティショニングする方法を示す一例の流れ図である。
【図９】ノードルーティングテーブルを移植する方法を示す一例の流れ図である。
【図１０】メッセージを宛先ノードに向かって数値的にルーティングする方法を示す一例の流れ図である。
【図１１】メッセージを宛先ノードに向かって近接ルーティングする方法を示す一例の流れ図である。
【図１２Ａ】既存フェデレーション内でメンバシップを確立するノードの一例を示す図である。
【図１２Ｂ】メッセージを交換するフェデレーションインフラストラクチャ内のノードの一例を示す図である。
【図１３】フェデレーションインフラストラクチャ内でメンバシップを確立する方法を示す一例の流れ図である。
【図１４】フェデレーションインフラストラクチャ内でメンバシップを維持する方法を示す一例の流れ図である。
【図１５】別のノードのライブネス情報を発見する方法を示す一例の流れ図である。
【図１６】メッセージモデルおよび関連する処理モデルの一例を示す図である。
【図１７】機能レイヤとアプリケーションレイヤとの間で発生し得る複数のライブネス相互作用の一例を示す図である。
【図１８】リング上のノードにまたがってルーティングされる要求−応答メッセージ交換パターンの一部を形成するメッセージの一例を示す図である。
【図１９Ａ】あるノードが別の（例えば、対象）ノードを監視することを容易にする例のリングアーキテクチャを示す図である。
【図１９Ｂ】２つのノードがお互いを監視するのを容易にする例のリングアーキテクチャを示す図である。
【図１９Ｃ】相互に監視するノードが、他方のノードが障害について疑われることをそれぞれ報告できるときのアービトレーションを容易にする例のリングアーキテクチャを示す図である。
【図２０】あるノードが別のノードを監視する方法を示す一例の流れ図である。
【図２１】疑われるノード障害の衝突する報告の間でアービトレートする方法を示す一例の流れ図である。
【図２２Ａ】キャッシングされた２ウェイ合意によるメッセージのルーティングを容易にする例のリングアーキテクチャを示す図である。
【図２２Ｂ】複数のキャッシングされた２ウェイ合意によるメッセージのルーティングを容易にする例のリングアーキテクチャを示す図である。
【図２３Ａ】キャッシングされた２ウェイ合意を定式化するのを容易にする例のリングアーキテクチャを示す図である。
【図２３Ｂ】キャッシングされた２ウェイ合意を定式化するのを容易にする例のリングアーキテクチャを示す図である。
【図２３Ｃ】キャッシングされた２ウェイ合意を定式化するのを容易にする例のリングアーキテクチャを示す図である。
【図２３Ｄ】キャッシングされた２ウェイ合意を定式化するのを容易にする例のリングアーキテクチャを示す図である。
【図２４】キャッシングされた２ウェイ合意に従ってメッセージをルーティングする方法を示す一例の流れ図である。
【図２５】複数のキャッシングされた２ウェイ合意に従ってメッセージをルーティングする方法を示す一例の流れ図である。
【図２６】２ウェイ合意に参加する方法を示す一例の流れ図である。
【図２７】フェデレーション内のノードのリングへのノードの参加を容易にする例のリングアーキテクチャを示す図である。
【図２８】参加するノード、選択された直接に隣接するノード、およびもう１つの直接に隣接するノードの展望からの、参加するノードがノードのリングに参加するときのリング一貫性を維持する方法を示す一例の流れ図である。
【図２９】リービングノード(leaving node)がノードのリングを去るときにリング一貫性を維持する方法を示す一例の流れ図である。
【図３０】ノードのリングに参加する、参加するノードの例示的状態図である。
【図３１】ノードのリングを去る、リービングノードの例示的状態図である。
【図３２】フェデレーション内で複製セットおよびデータ一貫性を維持するのを容易にする例のリングアーキテクチャを示す図である。
【図３３】フェデレーションインフラストラクチャ内で維持される複製セット内でデータアクセストランザクションを実行する方法を示す一例の流れ図である。
【図３４】フェデレーションインフラストラクチャ内で一貫した複製セットを確立し、維持する方法を示す一例の流れ図である。
【図３５】動作の例示的シーケンスを示す図である。
【図３６】フェデレーションインフラストラクチャ内で複製セットからデータにアクセスする例示的システムを示す図である。
【発明を実施するための形態】
【００２１】
本発明は、ランデブフェデレーション内でリソースを割り当て、再生する方法、システム、およびコンピュータプログラム製品におよぶ。いくつかの実施形態で、メッセージは、宛先ノードに向かってルーティングされる。受信ノードは、ノードのリング上の宛先を示す宛先識別子と共にメッセージを受信する。宛先識別子は、受信ノードと直接近傍ノードとの間で配置される。直接近傍ノードは、直接先行近傍ノードおよび直接後続近傍ノードの間から選択される。
【００２２】
受信ノードは、受信ノードと直接近傍ノードとの間のキャッシングされた２ウェイ合意を参照して、メッセージを受信すべき次の適当なノードを決定する。キャッシングされた２ウェイ合意は、少なくとも、受信ノードと直接近傍ノードとの間での識別子空間の責任の分割を暗示する。受信ノードは、次の適当なノードの決定に基づいて、次の適当なコンポーネントにメッセージを送信する。
【００２３】
他の実施形態では、現行ノードと直接近傍ノードとの間の２ウェイ合意が定式化される。ノードのリングの構成が変化したことの表示に現行ノードはアクセスする。表示は、少なくとも現行直接近傍ノードでの変化を示す。現行直接近傍ノードは、現行直接先行ノードと現行直接後続ノードとの間で選択される。この変化は、新しい直接近傍ノードをもたらす。
【００２４】
表示、現行ノードと新しい直接近傍ノードとの間のリング上の少なくとも非占有識別子の責任を分割する２ウェイ合意を定式化する必要のさらなる表示。現行ノードおよび新しい直接近傍ノードは、現行ノードと新しい直接近傍ノードとの間の責任境界に合意する。責任境界は、現行ノードと新しい直接近傍ノードとの間の非占有識別子の責任を分割する。現行ノードと責任境界との間の非占有識別子は、現行ノードの責任になる。同様に、責任境界と新しい直接近傍ノードとの間の非占有識別子は、新しい直接希望ノードの責任である。
【００２５】
本発明の実施形態は、下で詳細に述べるように、コンピュータハードウェアを含む特殊目的のまたは汎用のコンピュータを含むか利用することができる。本発明の範囲内の実施形態は、コンピュータ実行可能命令および／またはデータ構造を担持しまたは格納する物理的なおよび他のコンピュータ可読媒体をも含む。そのようなコンピュータ可読媒体は、汎用のまたは特殊目的のコンピュータシステムによってアクセスできる任意の使用可能な媒体とすることができる。コンピュータ実行可能命令を格納するコンピュータ可読媒体は、物理記憶媒体である。コンピュータ実行可能命令を担持するコンピュータ可読媒体は、伝送媒体である。したがって、限定ではなく例として、本発明の実施形態は、少なくとも２つの明瞭に異なる種類のコンピュータ可読媒体すなわち物理記憶媒体および伝送媒体を含むことができる。
【００２６】
物理記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭ、もしくは他の光学ディスクストレージ、磁気ディスクストレージもしくは他の磁気ストレージデバイス、または、コンピュータ実行可能命令もしくはデータ構造の形で所望のプログラムコード手段を格納するのに使用でき、汎用コンピュータまたは特殊目的コンピュータによってアクセスできる任意の他の媒体を含む。
【００２７】
「ネットワーク」は、コンピュータシステムおよび／またはモジュールおよび／または他の電子デバイスの間での電子データのトランスポートを可能にする１つまたは複数のデータリンクと定義される。情報がネットワークまたは別の通信接続（有線、無線、または有線もしくは無線の組合せのいずれであれ）を介してコンピュータに転送されるか提供されるときに、そのコンピュータは、当然、その接続を伝送媒体とみなす。伝送媒体には、コンピュータ実行可能命令またはデータ構造の形で所望のプログラムコード手段を搬送するかトランスポートするのに使用でき、汎用コンピュータまたは特殊目的コンピュータによってアクセスできるネットワークおよび／またはデータリンクを含めることができる。上記の組合せも、コンピュータ可読媒体の範囲に含まれなければならない。
【００２８】
しかし、様々なコンピュータシステムコンポーネントに達するときに、コンピュータ実行可能命令またはデータ構造の形のプログラムコード手段を、伝送媒体から物理記憶媒体へ自動的に転送できることを理解されたい。例えば、ネットワークまたはデータリンクを介して受信されたコンピュータ実行可能命令またはデータ構造を、ネットワークインターフェースカード内のＲＡＭにバッファリングすることができ、その後、コンピュータシステムで最終的にコンピュータシステムＲＡＭおよび／またはより不揮発性の物理記憶媒体に転送することができる。したがって、物理記憶媒体を、伝送媒体をも（または主に伝送媒体を）利用するコンピュータシステムコンポーネントに含めることができることを理解されたい。
【００２９】
コンピュータ実行可能命令は、例えば、汎用コンピュータ、特殊目的コンピュータ、または特殊目的処理デバイスにある種の機能または機能のグループを実行させる命令およびデータを含む。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語などの中間フォーマット命令、またはソースコードとすることすらできる。本主題を、構造的特徴および／または方法論的行為に固有の言葉で説明してきたが、添付の特許請求の範囲で定義される本主題が、必ずしも説明された特徴または上記行為に限定されないことを理解されたい。そうではなく、説明された特徴および行為は、特許請求の範囲を実施する例の形として開示されるものである。
【００３０】
いくつかの実施形態で、例えば、特殊目的集積回路またはゲートアレイなどのハードウェアモジュールが、本発明の原理を実施するために最適化される。
【００３１】
この説明および後続の特許請求の範囲では、「ノード」は、電子データに対する動作を実行するために一緒に働く、１つまたは複数のソフトウェアモジュール、１つまたは複数のハードウェアモジュール、あるいはその組合せと定義される。例えば、ノードのこの定義は、パーソナルコンピュータのハードウェアコンポーネントならびにパーソナルコンピュータのオペレーティングシステムなどのソフトウェアモジュールを含む。モジュールの物理的レイアウトは、重要ではない。ノードは、ネットワークを介して結合された１つまたは複数のコンピュータを含むことができる。同様に、ノードは、内部モジュール（メモりおよびプロセッサなど）が電子データに対する動作を実行するために一緒に働く、単一の物理デバイス（携帯電話機または携帯情報端末「ＰＤＡ」など）を含むことができる。さらに、ノードは、例えば、特殊目的集積回路を含むルータなど、特殊目的ハードウェアを含むことができる。
【００３２】
本発明を、パーソナルコンピュータ、ラップトップコンピュータ、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラマブルな消費者エレクトロニクス、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、携帯電話機、ＰＤＡ、ポケットベル、ルータ、ゲートウェイ、ブローカ、プロキシ、ファイヤウォール、リダイレクタ、ネットワークアドレストランスレータ、および類似物を含む多数のタイプのノード構成を有するネットワークコンピューティング環境内で実践できることを、当業者は了解するであろう。本発明は、ネットワークを介してリンクされた（有線データリンク、無線データリンク、または有線データリンクと無線データリンクとの組合せのいずれかによって）ローカルノードとリモートノードとの両方がタスクを実行する、分散システム環境で実践することもできる。分散システム環境では、プログラムモジュールを、ローカルメモリストレージデバイスとリモートメモリストレージデバイスとの両方に配置することができる。
【００３３】
（フェデレーションアーキテクチャ）
図１に、フェデレーションインフラストラクチャ１００の一例を示す。フェデレーションインフラストラクチャ１００は、異なるタイプのフェデレーティングパートナーシップを形成できるノード１０１、１０２、および１０３を含む。例えば、ノード１０１、１０２、および１０３を、ルートノードなしでピアとしてお互いの間でフェデレートすることができる。ノード１０１、１０２、および１０３のそれぞれは、それぞれ対応するＩＤ１７１、１８２、および１９３を有する。
【００３４】
一般に、ノード１０１、１０２、および１０３は、フェデレーションプロトコルを使用して、パートナーシップを形成し、情報（例えば、他のノードとの相互作用に関する状態情報）を交換することができる。パートナーシップの形成および情報の交換は、より効率的で信頼できる、リソースへのアクセスを容易にする。他の中間ノード（図示せず）が、ノード１０１、１０２、および１０３の間に存在することができる（例えば、１７１と１９３との間のＩＤを有するノード）。したがって、例えば、ノード１０１と１０３との間でルーティングされるメッセージが、１つまたは複数の他の中間ノードを通過する可能性がある。
【００３５】
フェデレーションインフラストラクチャ１００内のノード（他の中間ノードを含む）は、対応するランデブプロトコルスタックを含むことができる。例えば、ノード１０１、１０２、および１０３は、それぞれ対応するランデブプロトコルスタック１４１、１４２、および１４３を含む。プロトコルスタック１４１、１４２、および１４３のそれぞれは、アプリケーションレイヤ（例えば、アプリケーションレイヤ１２１、１２２、および１２３）および他の下位レイヤ（例えば、対応する他の下位レイヤ１３１、１３２、および１３３）を含む。ランデブプロトコルスタック内の各レイヤは、リソース要求を対応するリソースにランデブさせることに関連する異なる機能性の責任を負う。
【００３６】
例えば、他の下位レイヤは、チャネルレイヤ、ルーティングレイヤ、および機能レイヤを含むことができる。一般に、チャネルレイヤは、あるエンドポイントから別のエンドポイントへ（例えば、ノード１０１からノード１０３へ）メッセージを信頼できる形でトランスポートする（例えば、ＷＳ−ＲｅｌｉａｂｌｅＭｅｓｓａｇｉｎｇおよびＳｉｍｐｌｅ Ｏｂｊｅｃｔ Ａｃｃｅｓｓ Ｐｒｏｔｏｃｏｌ（「ＳＯＡＰ」）を使用して）責任を負う。チャネルレイヤは、着信および発信の信頼できるメッセージングヘッダを処理し、信頼できるメッセージングセッションに関係する状態を維持する責任をも負う。
【００３７】
一般に、ルーティングレイヤは、宛先に向かう次のホップを計算する責任を負う。ルーティングレイヤは、着信および発信のアドレッシングメッセージヘッダおよびルーティングメッセージヘッダを処理し、ルーティング状態を維持する責任をも負う。一般に、機能レイヤは、参加要求、離脱要求、ｐｉｎｇ、更新、および他のメッセージなどのランデブプロトコルメッセージの発行および処理ならびにこれらのメッセージに対する応答の生成の責任を負う。機能レイヤは、ルーティングレイヤからの要求メッセージを処理し、対応する応答メッセージがある場合に、その応答メッセージをルーティングレイヤを使用して起点ノードに送り返す。また、機能レイヤは、要求メッセージを開始し、ルーティングレイヤを使用してその応答メッセージを送達させる。
【００３８】
一般に、アプリケーションレイヤは、機能レイヤから送達された非ランデブプロトコル固有データ（すなわち、アプリケーションメッセージ）を処理する。機能レイヤは、アプリケーションレイヤからのアプリケーションデータにアクセスし、ランデブプロトコルメッセージ内のアプリケーションデータをゲットし、プットすることができる（例えば、ｐｉｎｇおよび更新）。すなわち、機能レイヤは、アプリケーションデータをランデブプロトコルメッセージにピギーバックさせることができ、アプリケーションデータを、受信ランデブプロトコルノード内のアプリケーションレイヤに戻して渡させることができる。いくつかの実施形態で、アプリケーションデータは、リソースおよびリソース関心を識別するのに使用される。したがって、アプリケーションレイヤは、リソースおよびリソース関心を識別するために他の下位レイヤから受け取られ、他の下位レイヤに送られるデータを処理するアプリケーション固有のロジックおよび状態を含むことができる。
【００３９】
（フェデレーティング機構）
ノードは、様々な異なる機構を使用してフェデレートすることができる。第１のフェデレーティング機構は、情報をすべての他のピアノードに転送するピアノードを含む。あるノードが、フェデレーションインフラストラクチャに参加するときに、そのノードは、例えば、ＷＳ−Ｄｉｓｃｏｖｅｒｙなどのブロードキャスト／マルチキャストディスカバリプロトコルを利用して、そのプレゼンスをアナウンスし、ブロードキャスト／マルチキャストファインド（ｂｒｏａｄｃａｓｔ／ｍｕｌｔｉｃａｓｔ ｆｉｎｄ）を発行して、他のノードを検出する。次に、ノードは、ネットワーク上に既に存在する他のノードとの単純な転送パートナーシップを確立し、新たに参加するノードとの新しいパートナーシップを受け入れる。その後、ノードは、単純にすべてのアプリケーション固有メッセージをそのパートナノードのすべてに転送する。
【００４０】
第２のフェデレーティング機構は、アプリケーション固有メッセージをその宛先（１つまたは複数）に最も効率的に送信するピアノードを含む。新しいノードがフェデレーションインフラストラクチャに参加するときに、その新しいノードは、例えば、ＷＳ−Ｄｉｓｃｏｖｅｒｙなどのブロードキャスト／マルチキャストディスカバリプロトコルを利用してそのプレゼンスをアナウンスし、ブロードキャスト／マルチキャストファインドを発行して、フェデレーションインフラストラクチャの一部である他のノードを検出する。別のノードを検出したときに、新しいノードは、その別のノードとのパートナーシップを確立する。確立されたパートナーシップから、新しいノードは、フェデレーションインフラストラクチャに既に参加している他のノードのプレゼンスに関して学習する。新しいノードは、次に、これらの新たに学習されたノードとのパートナーシップを確立し、すべての新しい着信パートナーシップ要求を受け入れる。
【００４１】
ノード到着／離脱とあるアプリケーション固有メッセージへの関心の登録との両方が、フェデレーションインフラストラクチャを介してフラッディングされ、すべてのノードが他のパートナノードおよびアプリケーション固有メッセージへの関心の登録のグローバル知識を有することをもたらす。そのようなグローバル知識を用いて、すべてのノードが、アプリケーション固有メッセージへの関心を表したノードに直接にアプリケーション固有メッセージを送信することができる。
【００４２】
第３のフェデレーティング機構は、すべてのアプリケーション固有メッセージをその宛先（１つまたは複数）に間接的に転送するピアノードを含む。この第３の機構では、ノードは、例えば、１２８ビットまたは１６０ビットの識別子（ＩＤ）などのＩＤを割り当てられる。所与のアプリケーション固有メッセージへの関心の登録を維持する責任を負うノードは、そのＩＤが、アプリケーション固有メッセージの宛先アイデンティティ（例えば、ＵＲＩ）をこの１２８ビットまたは１６０ビットのＩＤにマッピングする（例えば、ハッシュ化する）ことによって入手されるＩＤに最も近いノードになるように決定することができる。
【００４３】
この第３の機構では、ノード到着および離脱は、ファブリック全体にフラッディングされる。その一方で、あるアプリケーション固有メッセージへの関心の登録は、そのような登録情報を維持する責任を負うと決定されたノードに転送される。スケーラビリティ、ロードバランシング、およびフォールトトレランスのために、あるアプリケーション固有メッセージへの関心の登録を受信するノードは、その近傍セット内でその登録情報を信頼できる形でフラッディングすることができる。指定されたノードの近傍セットは、指定されたノードのＩＤの両側の事前定義の範囲内のＩＤを有するノードのセットになるように決定することができる。
【００４４】
第２の機構に似て、新たに参加するノードは、例えば、ＷＳ−Ｄｉｓｃｏｖｅｒｙなどのブロードキャスト／マルチキャストディスカバリプロトコルを利用してそのプレゼンスをアナウンスし、ローカルブロードキャスト／マルチキャストファインドを発行して、既にフェデレーションインフラストラクチャの一部であるノードを検出する。新しいノードは、発見されたノードとのパートナーシップを確立し、そのパートナーシップを使用して、フェデレーションインフラストラクチャに参加する他の新しいノードのプレゼンスについて学習する。次に、新しいノードは、新たに発見されたノードとのさらなるパートナーシップを確立し、新たな着信パートナーシップ要求のすべてを受け入れる。新しいノードは、それが責任を負う、そのパートナからのあるアプリケーションレイヤ固有リソースへの関心の着信登録を受け入れ、これらをその近傍セットにフラッディングすることができる。したがって、メッセージを、一般に、仲介ルーティングノード（例えば、新たに参加するノードがそれとパートナにされたノードまたはパートナノードがそれを知っているノード）を介して最終的な宛先に転送することができる。
【００４５】
着信アプリケーション固有メッセージの受信に応答して、新しいノードは、そのメッセージで指定される宛先の登録情報を維持する責任を負う可能性があるパートナノードにそのメッセージを転送する。したがって、この第３の機構を使用するときに、フェデレーションインフラストラクチャ内のすべてのノードは、他のすべてのノードのグローバル知識を有するが、登録情報は、効率的にノードの間でパーティショニングされる。アプリケーション固有メッセージは、これらのアプリケーション固有メッセージへの関心の登録情報を維持する責任を有する可能性があるパートナのノードだけを介して最終的な宛先に送信される。したがって、インダイレクションは、処理されるメッセージに関する関心の登録情報のグローバル知識を有するパートナノードのみに転送することによって達成される。これは、インダイレクションがすべてのパートナノードに転送することによって達成される第１の機構と対照的である。
【００４６】
第４のフェデレーティング機構は、メッセージを他のピアノードにルーティングするピアノードを含む。この第４の機構は、少なくとも、ノード到着／離脱およびあるアプリケーション固有メッセージへの関心の登録が、すべて、フラッディングされるのではなくルーティングされるという点で、第３の機構とは異なる。ルーティングプロトコルは、アプリケーション固有メッセージとそれらのアプリケーション固有メッセージへの関心を示す登録メッセージとの間のランデブを保証するように設計される。
【００４７】
図２に、パートナへの間接的な要求のルーティングを容易にするコンピューティングアーキテクチャ２００の一例を示す。コンピューティングアーキテクチャ２００は、フェデレーションインフラストラクチャに参加する、潜在的に複数のローカルディスカバリスコープにまたがって広がる複数のタイプのコンピュータおよびデバイスを示す。
【００４８】
ワークステーション２３３は、登録されたＰｎＰプロバイダインスタンスを含むことができる。このＰｎＰプロバイダインスタンスのプレゼンスについてそのパートナに知らせるために、ワークステーション２３３は、フェデレーションインフラストラクチャを介して登録要求２０１をルーティングする。登録要求２０１は、当初に、ラップトップ機２３１にルーティングされ、ラップトップ機２３１は、登録要求２０１をメッセージブローカ２３７に転送し、メッセージブローカ２３７は、登録要求２０１をメッセージゲートウェイ２４１に転送する。メッセージゲートウェイ２４１は、登録要求２０１内の登録情報をデータベースに保存し、成功メッセージ２０４をワークステーション２３３に返す。
【００４９】
その後、別の登録されたプロバイダインスタンス、今回は動作中サービスの登録されたプロバイダインスタンスが、ワークステーション２３３内で活動状態になる。今回は、ノードは、メッセージゲートウェイ２４１が登録の責任を負うことを知っており、登録要求２０５をメッセージゲートウェイ２４１に直接に転送する。メッセージゲートウェイ２４１は、登録要求２０５内の登録情報をデータベースに保存し、成功メッセージ２０６をワークステーション２３３に返す。
【００５０】
その後、プリンタ２３６（例えば、ＵＰｎＰプリンタ）が、電源を入れられ、アナウンスメント２０７を送信する。サーバ２３４は、アナウンスメント２０７を検出し、登録要求２０８をメッセージブローカ２３７にルーティングする。メッセージブローカ２３７は、登録要求２０８をメッセージゲートウェイ２４１に転送する。メッセージゲートウェイ２４１は、登録要求２０８内の登録情報をデータベースに保存し、成功メッセージ２１０をサーバ２３４に返す。
【００５１】
その後、パーソナルコンピュータ２４２が、すべてのデバイスを発見するためにルックアップ要求２１１を発行する。パーソナルコンピュータ２４２は、ルックアップ要求２１１をどこに転送すべきかを知らないので、ワークステーション２４３を介してルックアップ要求２１１をルーティングする。登録要求およびルックアップ要求は、同一の宛先にルーティングされるので、ルーティングプロトコルは、本質的に、この２つの要求の間のランデブを保証し、ワークステーション２４３がファインド要求２１１をメッセージゲートウェイ２４１に転送することをもたらす。メッセージゲートウェイ２４１は、それによって維持される登録情報をルックアップし、ファインド要求２１１をワークステーション２３３とサーバ２３４との両方に転送する。ワークステーション２３３およびサーバ２３４は、それぞれ応答メッセージ２１４および２１６をパーソナルコンピュータ２４２に送信する。
【００５２】
この第４の機構は、要求で指定される登録のグローバル知識を有するノード（メッセージゲートウェイ２４１）に要求をルーティングする（フラッディングではなく）ことによって働く。この第４の機構は、以下でさらに詳細に説明するように、本質的に、ルーティングをＯ（ｌｏｇ Ｎ）ホップで達成できることを保証する。ここで、Ｎは、フェデレーションインフラストラクチャに参加するノードの個数である。この第４の機構は、ノードパートナーシップと登録情報との両方を効率的にパーティショニングするので、非常に大きいネットワークに、インターネットにさえスケーリングされる。
【００５３】
複数のフェデレーション機構を説明したが、この説明を再検討した後に、当業者には、他のフェデレーション機構が可能であることが明白になるであろう。
【００５４】
（フェデレーション内のノードの間の関係）
したがって、フェデレーションは、情報をシステマティックに効率的に散布でき突き止めることができるダイナミックでスケーラブルなネットワークを形成するためにそれら自体の間で協力するノードのセットからなる。ノードは、反射性であり、反対称であり、推移的であり、全体的であり、ノードアイデンティティのドメインにわたって定義されるバイナリ関係を使用して、ソートされたリストとして、フェデレーションに参加するために編成される。ソートされたリストの両端が、結合され、これによってリングを形成する。したがって、リスト内の各ノードは、それ自体を、ソートされたリストの中央にあると見なすことができる（ｍｏｄｕｌｏ演算を使用した結果として）。さらに、このリストは、二重にリンクされ、その結果、任意のノードが、どちらの方向でもこのリストをトラバースできるようになる。
【００５５】
各フェデレートするノードには、０とある固定された上界との間のＩＤの固定されたセットからのＩＤを割り当てることができる（例えば、重複検出を伴う乱数ジェネレータによって）。したがって、固定された上界のＩＤに１を加算することは、０のＩＤをもたらす（すなわち、リンクリストの終りからリンクドリステッドの先頭に戻って移動する。さらに、ノードアイデンティティの値ドメインからノード自体への１：１マッピング関数が、定義される。
【００５６】
図３に、一例としてリンクリスト３０４および対応するリング３０６を示す。そのようなリングを与えられて、次の関数を定義することができる。 
ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｖ，Ｍｓｇ）：ノードアイデンティティの値ドメインからの値Ｖおよびメッセージ「Ｍｓｇ」を与えられて、そのアイデンティティがマッピング関数を使用してＶにマッピングされ得るノードＸにメッセージを送達する。 
Ｎｅｉｇｈｂｏｒｈｏｏｄ（Ｘ，Ｓ）：近傍（Ｎｅｉｇｈｂｏｒｈｏｏｄ）は、Ｓと等しい濃度を有する、ノードＸの両側のノードの集合である。
【００５７】
フェデレーション内のすべてのノードが、リングのグローバル知識を有するときに、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｖ，Ｍｓｇ）は、そのアイデンティティがＶにマッピング関数を適用することによって入手されるノードＸに直接にＭｓｇを送信することによって実施される。その代わりに、ノードが、他のノードの限られた（例えば、直接に隣接するノードのみの）知識を有するときに、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｖ，Ｍｓｇ）は、メッセージが宛先ノードＸに達するまで、そのメッセージをリングに沿って連続するノードに転送することによって実施される。
【００５８】
あるいは（有利なことに）、ノードは、分散バイナリサーチを実行するのに十分な、リングに関する知識を格納することができる（グローバル知識を有するか、直接隣接するノードの間のルーティングを実施する必要なしに）。リング知識の量は、構成可能であり、リング知識の維持が、各ノードに対する十分に小さい影響を有するが、ルーティングホップ数の削減から高められたルーティング性能を可能にするようになっている。
【００５９】
前述のように、ＩＤを、自然数の十分に大きい有界集合（その範囲が、０とある固定された値との間（両端を含む）の数の有限集合にわたることを意味する）にわたって定義される「＜」（未満）関係を使用して割り当てることができる。したがって、フェデレーションに参加するすべてのノードが、０とある適当に選択された上界との間にある（両端を含む）自然数を割り当てられる。この範囲は、狭いものである必要はなく、ノードに割り当てられる数の間にギャップを設けることができる。ノードに割り当てられる数は、リング内でのそのノードのアイデンティティとして働く。マッピング関数は、２つのノードアイデンティティの間に含まれる数を、そのアイデンティティが数値的にその数に最も近いノードにマッピングすることによって、数空間内のギャップを考慮に入れる。
【００６０】
この手法は、複数の利益を有する。各ノードに均一に分布する数を割り当てることによって、リングのすべてのセグメントが均一に占められる尤度が高まる。さらに、後続物、先行物、および近傍の計算を、ｍｏｄｕｌｏ演算を使用して効率的に行うことができる。
【００６１】
いくつかの実施形態で、フェデレートするノードは、２つのノードが同一のＩＤを割り当てられる可能性が非常に低くなるのに十分に大きいＩＤ空間内からＩＤを割り当てられる（例えば、乱数生成が使用されるとき）。例えば、あるノードに、０からｂn-1までの範囲内のＩＤを割り当てることができ、ここで、ｂは、例えば、８または１６と等しく、ｎは、例えば、１２８ビットまたは１６０ビットと同等の桁である。したがって、あるノードに、例えば、０から１６40−１（すなわち、約１．４６１５０２Ｅ４８）までの範囲からＩＤを割り当てることができる。０から１６40−１までの範囲は、例えば、インターネット上のすべてのノードに一意ＩＤを割り当てるのに十分な個数のＩＤをもたらすはずである。
【００６２】
したがって、フェデレーション内の各ノードは、次を有することができる。 
０からｂn-1までの範囲内で均一に分布する数値であるＩＤと、
【００６３】
【表１】
0005498594.tif 000002
【００６４】
からなるルーティングテーブル（すべての演算が、ｍｏｄｕｌｏ ｂnで行われる）。
ここで、ｂは、基数であり、ｎは、桁数単位のフィールドサイズであり、ｕは、近傍範囲であり、ｖは、近傍サイズであり、演算は、ｍｏｄｕｌｏ ｂnで実行される。よいルーティング効率およびフォールトトレランスのために、ｕおよびｖの値を、ｕ＝ｂかつｖ≧ｍａｘ（ｌｏｇ2（Ｎ），４）とすることができ、ここで、Ｎは、フェデレーションに物理的に参加するノードの総数である。Ｎは、例えば、ＩＤの均一な分布があるときに、その長さがｂ以上であるリングセグメントに存在するノードの個数から推定することができる。ｂおよびｎの通常の値は、ｂ＝８または１６であり、ｎ＝１２８ビットまたは１６０ビットと同等の桁である。
【００６５】
したがって、ルーティングノードは、リングにまたがる対数インデックスを形成することができる。リング上のノードの位置に応じて、例えば、ｉｄ±ｂi、ただしｉ＝（１，２，．．．（ｎ−１））の集合内の各数に既存ノードがあるときに、正確な対数インデックスが可能である。しかし、集合内の各数に既存のノードがない場合がある。この場合には、ｉｄ±ｂiに最も近いノードを、ルーティングノードとして選択することができる。結果の対数インデックスは、正確ではなく、集合内のいくつかの数について一意ルーティングノードを欠く場合すらある。
【００６６】
図３をもう一度参照すると、図３は、ソートされたリスト３０４および対応するリング３０６の形の、フェデレーションインフラストラクチャ内のノードの間のバイナリ関係の一例を示す。ソートされたリスト３０４のＩＤ空間は、０から２8−１（すなわち２５５）までの範囲内にある。すなわち、ｂ＝２かつｎ＝８である。したがって、図３に示されたノードは、０から２５５までの範囲のＩＤを割り当てられる。ソートされたリスト３０４は、反射性であり、反対称であり、推移的であり、全体的であり、ノードアイデンティティのドメインにわたって定義されるバイナリ関係を利用する。ソートされたリスト３０４の両端は、結合され、これによってリング３０６が形成される。これは、図３の各ノードが、それ自体をソートされたリスト３０４の中央にあるとみなすことを可能にする。ソートされたリスト３０４は、二重リンクされ、その結果、任意のノードが、どちらの方向でもソートされたリスト３０４をトラバースできるようになる。ソートされたリスト３０４（またはリング３０６）をトラバースするための演算は、ｍｏｄｕｌｏ ２8で実行される。したがって、２５５（すなわちソートされたリスト３０４の終り）＋１＝０（すなわち、リスト３０４の始め）である。
【００６７】
このルーティングテーブルは、ＩＤ６４の後続物がＩＤ７６である（ＩＤ６４から直接に時計回りのＩＤ）ことを示す。後続物は、例えば、新しいノード（例えば、７１のＩＤを有する）が参加するか、既存ノード（例えば、ＩＤ７６）がフェデレーションインフラストラクチャを去るときに、変化し得る。同様に、このルーティングテーブルは、ＩＤ６４の先行物がＩＤ５０である（ＩＤ６４から直接に反時計回りのＩＤ）ことを示す。後続物は、例えば、新しいノード（例えば、５９のＩＤを有する）が参加するか、既存ノード（例えば、ＩＤ５０）がフェデレーションインフラストラクチャを去るときに、変化し得る。
【００６８】
このルーティングテーブルは、さらに、ＩＤ６４に対する近傍ノードのセットが、ＩＤ８３、７６、５０、および４６を有することを示す。近傍ノードのセットは、ＩＤ６４から指定された範囲（すなわち、近傍範囲ｕ）以内にある指定された個数のノード（すなわち、近傍サイズｖ）とすることができる。様々な異なる近傍サイズおよび近傍範囲、例えば、Ｖ＝４およびＵ＝１０を、潜在的に、近傍ノードのセットを識別するのに使用することができる。近傍セットは、例えば、ノードがフェデレーションインフラストラクチャに参加するか去るとき、またはノードの指定された個数もしくは指定された範囲が変更されるときに、変化し得る。
【００６９】
このルーティングテーブルは、さらに、ＩＤ６４が、ＩＤ２、３０、４６、５０、６４、６４、６４、６４、７６、８３、９８、１３５、および２００を有するノードにルーティングできることを示す。このリストは、ｉｄ±２i、ただしｉ＝（１，２，３，４，５，６，７）の集合内の各数に最も近いノードを識別することによって生成される。すなわち、ｂ＝２かつｎ＝８である。例えば、ＩＤ７６を有するノードは、６４＋２3すなわち７２に最も近いノードを計算することから識別することができる。
【００７０】
ノードは、先行ノード、後続ノード、近傍ノードのセット内の任意のノード、または任意のルーティングノードに直接にメッセージ（例えば、リソースへのアクセスに関する要求）をルーティングすることができる。いくつかの実施形態で、ノードは、メッセージをルーティングするために数値ルーティング関数を実施する。したがって、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｖ，Ｍｓｇ）をノードＸで実施して、そのＩＤが数値的にＶに最も近いフェデレーション内のノードＹにＭｓｇを送達し、ノードＹのＩＤをノードＸに返すことができる。例えば、ＩＤ６４を有するノードは、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（２４３，Ｍｓｇ）を実施して、ＩＤ２５０を有するノードにメッセージをルーティングさせることができる。しかし、ＩＤ２５０は、ＩＤ６４のルーティングノードではないので、ＩＤ６４は、このメッセージをＩＤ２（２４３に最も近いルーティングノード）にルーティングすることができる。ＩＤ２を有するノードは、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（２４３，Ｍｓｇ）を実施して、ＩＤ２５０を有するノードにメッセージをルーティングさせる（直接にまたはさらなる仲介ノードを介して）ことができる。したがって、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ関数が再帰的に呼び出され、各呼出しが、メッセージを宛先のより近くにルーティングするかもしれない。
【００７１】
（近接）
有利なことに、本発明の他の実施形態は、１つまたは複数の近接カテゴリ（例えば、地理的境界、ルーティング特性（例えば、ＩＰルーティングホップ数）、管理ドメイン、組織境界など）の複数の近接判断基準に基づく、リングのリングまたはリングのツリーへのリングのパーティショニングを容易にする。リングを、同一タイプの近接判断基準を使用して複数回パーティショニングできることを理解されたい。例えば、あるリングを、大陸近接判断基準および国近接判断基準（両方が地理的境界近接カテゴリの）に基づいてパーティショニングすることができる。
【００７２】
ＩＤを、ＩＤ空間にわたって均一に分布させることができる（乱数生成の結果）ので、円形ＩＤ空間の任意の所与のセグメントが、異なる近接クラスに属するノードを含む（これらのクラスがほぼ同一の濃度を有するならば）ことの高い確率がある。この確率は、意味のある統計的挙動を得るのに十分な個数のノードがあるときに、さらに高まる。
【００７３】
したがって、任意の所与のノードの近傍ノードは、通常、近接の観点からはよく分散されている。パブリッシュされるアプリケーション状態を、近傍ノードの間で複製することができるので、パブリッシュされる情報を、近接の観点から同様によく分散させることができる。
【００７４】
図４に、近接ルーティングを容易にするリングのリング４００を示す。リング４０１は、マスタリングまたはルートリングとみなすことができ、リング４０２、４０３、および４０４のそれぞれのすべてのノードを含む。リング４０２、４０３、および４０４のそれぞれは、指定された近接判断基準に基づいてパーティショニングされた、リング４０１からのノードのサブセットを含む。例えば、リング４０１を、地理的位置に基づいてパーティショニングすることができ、ここで、リング４０２は、北アメリカ内のノードを含み、リング４０３は、欧州内のノードを含み、リング４０４は、アジア内のノードを含む。
【００７５】
６５５３６（２16）個のＩＤを含む数空間内で、ＩＤ５３４５を有する北アメリカノードからＩＤ２３３４５を有するアジアノードへのメッセージのルーティングは、アジアノードの近傍ノードが識別されるまでそのメッセージをリング４０２内でルーティングすることを含むことができる。次に、この近傍ノードが、そのメッセージをそのアジアノードにルーティングすることができる。したがって、単一ホップ（複数ホップではなく）が、北アメリカノードとアジアノードとの間で行われる。したがって、ルーティングは、リソース効率のよい形で実行される。
【００７６】
図５に、近接ルーティングを容易にするリングの一例の近接誘導されたパーティションツリー５００を示す。図示されているように、リングのパーティションツリー５００は、複数のリングを含む。リングのそれぞれは、ソートされたリンクリストの１パーティションを表す。各リングは、ソートされたリンクリスト内のＩＤを有する複数ノードを含む。しかし、明瞭さのために、潜在的ノードの個数に起因して、ノードは、リング上に明示的に図示されてはいない（例えば、パーティションツリー５００のＩＤ空間は、ｂ＝１６かつｎ＝４０である場合がある）。
【００７７】
パーティションツリー５００内で、ルートリング５０１は、判断基準５７１（第１管理ドメイン境界判断基準）に基づいて、サブリング５１１、５１２、５１３、および５１４を含む複数のサブリングにパーティショニングされる。例えば、ＤＮＳ名の各コンポーネントを、近接判断基準と考えることができ、それらの間の半順序は、右から左へ読まれるＤＮＳ名での出現の順序に従って誘導される。したがって、サブリング５１１を、さらに、判断基準５８１（第２管理ドメイン境界判断基準）に基づいて、サブリング５２１、５２２、および５２３を含む複数のサブリングにパーティショニングすることができる。
【００７８】
サブリング５２２を、さらに、判断基準５７２（地理的境界判断基準）に基づいて、サブリング５３１、５３２、および５３３を含む複数のサブリングにパーティショニングすることができる。位置ベースの近接判断基準を、大陸、国、郵便番号などの線に沿って半順序を付けることができる。郵便番号は、それ自体が階層的に編成され、これは、郵便番号を、近接判断基準の半順序を付けられたサブリストをさらに誘導すると見なすことができることを意味する。
【００７９】
サブリング５３１を、さらに、判断基準５７３（第１組織境界判断基準）に基づいて、サブリング５４１、５４２、５４３、および５４４を含む複数のサブリングにパーティショニングすることができる。近接判断基準の半順序を付けられたリストを、部、課、および製品グループなど、所与の会社がどのように組織的に構成されるかの線に沿って誘導することができる。したがって、サブリング５４３を、さらに、判断基準５８３（第２組織境界判断基準）に基づいて、サブリング５５１および５５２を含む複数のサブリングにパーティショニングすることができる。
【００８０】
パーティションツリー５００内で、各ノードは、単一のＩＤを有し、ルートから始まる葉への対応するパーティションパスに沿ったリングに参加する。例えば、サブリング５５２に参加する各ノードは、サブリング５４３、５３１、５２２、および５１１ならびにルート５０１にも参加する。宛先ノード（ＩＤ）へのルーティングは、次のように、ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ関数を実施することによって達成することができる。
【００８１】
ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ（Ｖ，Ｍｓｇ，Ｐ）：ノードアイデンティティのドメインからの値Ｖおよびメッセージ「Ｍｓｇ」を与えられて、近接判断基準Ｐによって同等と考えられるノードの間でそのアイデンティティをＶにマッピングできるノードＹにメッセージを送達する。
【００８２】
したがって、ルーティングを、所与のリング内でルーティングすることによってさらなる進行を行えなくなる（宛先ノードが現行ノードとその後続ノードまたは先行ノードとの間にあるという条件から判定される）まで、そのリング内で宛先ノードのより近くに徐々に移動することによって達成することができる。この点で、現行ノードは、それが参加する次により大きいリング内のパートナノードを介してルーティングを開始する。ルートリングに向かってパーティショニングパスに沿って登ることによって宛先ノードに向かって徐々に移動するこのプロセスは、宛先ノードに最も近いノードに、ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ呼出しで最初に指定された要求された近接コンテキスト内で達するときに、打ち切られる。
【００８３】
ルーティングホップは、宛先ノードがその外に存在するので近傍内でさらなる進行を行えなくなるまで、要求を発したノードの近接近傍内に残ることができる。さらなる進行を行えなくなった点で、近接判断基準は、さらなる進行を行うために近接近傍のサイズを増やすために緩和される。このプロセスは、近接近傍が宛先ノード（ＩＤ）を含むのに十分に拡がるまで繰り返される。近接近傍判断基準の各連続する緩和の後に行われるルーティングホップは、以前のホップと比較して数空間内で相対的により小さいジャンプを行いながら、近接空間内で潜在的により大きいジャンプとすることができる。したがって、絶対に必要な個数のそのような（リング間）ホップだけが、宛先に達する前に行われる。
【００８４】
パブリッシュされるアプリケーションデータが、宛先ノードの近傍ノードの間で複製されるときに、パーティションツリーを下って複製されるので、いくつかのホップが、ルックアップメッセージについて回避されるかもしれない。
【００８５】
近接ルーティングを達成するために、各フェデレーションノードは、それがメンバとして参加するすべてのリング内の後続ノードおよび先行ノード（単一リングに関する後続物および先行物に類似する）すなわち、近接先行物、近接後続物、および近接近傍への参照を維持する。ルーティングを効率的にするために、ノードは、リングのいずれかの半分で指数関数的に増加する距離に最も近い他のノードへの参照を、ルーティングパートナとして維持することもできる（単一リングのルーティングノードに類似する）。いくつかの実施形態で、連続する後続ノードの対の間または連続する先行ノードの対の間にあるルーティングパートナノードは、現行ノードと、それぞれ後続ノード対または先行ノード対の間でそれに数値的に最も近いノードとによって共有される同一の最下位のリングに参加する。したがって、宛先ノードに向かうルーティングホップは、さらなる進行を行うために絶対に必要であるときに限って、緩和された近接判断基準の使用に推移する（すなわち、より上位のリングへの推移）。したがって、メッセージを、対応するフェデレーションノードと効率的にランデブさせることができる。
【００８６】
いくつかの実施形態で、ノードは、同等性判断基準関係に基づいてメッセージをルーティングするために近接ルーティング関数を実施する。したがって、数Ｖおよびメッセージ「Ｍｓｇ」を与えられて、ノードは、近接判断基準Ｐによって同等と考えられるノードの間でそのアイデンティティをＶにマッピングできるノードＹにメッセージを送達するようにＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ（Ｖ，Ｍｓｇ，Ｐ）を実施することができる。近接判断基準Ｐは、それによって近接的に同等と考えられるすべてのノードの共通の先祖であるパーティションツリー内の最下位リングを識別する。これは、パスセパレータ文字「／」によって分離される、ルートリングからそれによって識別されるリングまでの経路に沿って見つかる近接判断基準を連結することによって得られるストリングとして表すことができる。例えば、サブリング５４２を識別する近接判断基準を「Ｐｒｏｘｉｍｉｔｙ：／．ＣＯＭ／Ｃｏｒｐ２／ＬｏｃａｔｉｏｎＡ／Ｄｉｖ２」と表すことができる。パーティションツリー５００内の各リングに、例えば、それを表すストリングをＳＨＡベースのアルゴリズムを用いてハッシュ化することによって、一意の数を割り当てることができる。数０が、ルートリングに予約される場合に、ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｖ，Ｍｓｇ）≡ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ（Ｖ，Ｍｓｇ，０）であると推論することができる。
【００８７】
例えば、サブリング５４４内のノードは、サブリング５３１内のより近い（例えば、サブリング５１３内のノードに）ノードを識別するようにＲｏｕｔｅＰｒｏｘｉｍａｌｌｙを実施することができる。サブリング５３１は、サブリング５２２内のより近いノードを識別するようにＲｏｕｔｅＰｒｏｘｉｍａｌｌｙを実施することができる。同様に、サブリング５２２は、サブリング５１１内のより近いノードを識別するようにＲｏｕｔｅＰｒｏｘｉｍａｌｌｙを実施することができる。同様に、サブリング５１１は、リング５０１内のより近いノードを識別するようにＲｏｕｔｅＰｒｏｘｉｍａｌｌｙを実施することができる。したがって、ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ関数が、再帰的に呼び出され、各呼出しが、宛先のより近くにメッセージをルーティングするかもしれない。
【００８８】
したがって、近接判断基準を考慮に入れるときに、最終的な宛先へのパス上のルーティングホップは、宛先ノードに達するか、あるいは選択された近接判断基準の下でさらなる進行を行うことができなくなる（その点で、近接判断基準は、宛先に向かうさらなる進行を行うのにちょうど十分なだけ緩和される）かのいずれかになるまで、数空間内で起点ノードと宛先ノードとの間で意味のある進行を行いながら、要求を発したノードの近傍内に残ることができる。例えば、近接判断基準を、メッセージをリング５３１からリング５２２までルーティングするのに十分に緩和することなどができる。
【００８９】
近接性への上の手法を利用すると、パブリッシュされる情報を所与のリングに閉じ込めることが可能である。例えば、組織は、組織固有の情報が（１）彼らのドメインの外部のノードへの近接複製の形で暗黙のうちに、または（２）そのような情報に関するルックアップ要求にサービスすることという形で明示的に、のいずれかで、彼らの信頼ドメインの外部のエンティティに使用可能ではないことを保証することを好む可能性がある。第１の態様は、パブリッシュされる情報を、指定されたリング内のターゲットＩＤの近傍のノードの間だけで複製することによって満足される。あるノードが発するすべてのメッセージが、ルートリングに向かってそれが属するリングを連続して登ることによってルーティングされるので、ある組織内で発するすべてのルックアップ要求が、それに閉じ込められたパブリッシュされた情報を突き止めることができ、これによって、暗黙のうちに第２の態様を満足する、高い尤度がある。
【００９０】
また、組織は、ノードが彼らの信頼ドメインの外部のノードと自動的にフェデレートすることを嫌う。これは、例えば、訪問販売員が、彼／彼女のラップトップコンピュータを顧客の建物内のネットワークに接続するときに発生し得る。理想的には、販売員に属するラップトップコンピュータは、そのホームドメイン内でパブリッシュされた情報を突き止め、かつ／またはその最下位の好ましい近接リングから始まるそのホームドメイン内のノードとフェデレートすることを望む。通常、顧客のドメイン内のノードとフェデレートすることは、許可されない。このシナリオをサポートするには、ホームドメイン内のシードノード(seed node)を突き止める能力が必要である。そのようなシードノードは、ホームドメイン内でパブリッシュされた情報を突き止めるのに、ホームフェデレーションに参加するのに、ドメインにまたがってパブリッシュされる情報を選択的にインポートし、エクスポートするのに、および他のノードによって提出された衝突する異常報告をアービトレートする１つの可能な形として、使用することができる。シードノードは、時々、メッセージゲートウェイとも呼ばれる。
【００９１】
他の実施形態では、エンティティは、ルートリング内でシードノードへの参照をパブリッシュする。シードノードは、リングに関連する（ターゲットＩＤとして）一意の数（それを表すストリングをハッシュ化することによって得られる数など）でパブリッシュすることができる。シードノード情報を、さらに、ルートリング内の対応するターゲットＩＤへのパス上にある様々なリング内のノードによってオンデマンドキャッシングすることができる。そのようなオンデマンドキャッシングは、改善された性能と、準静的情報が非常に頻繁にルックアップされるときに発生し得るホットスポットの減少とをもたらす。シードノード情報を、ＤＮＳなどの他の手段を介して入手することもできる。
【００９２】
閉じ込められたパブリッシュされた情報のフォールトトレランス（fault tolerance）を提供するために、各ノードが、それが参加するすべてのリングの近傍ノードのセットを維持することができる。上記を考慮すると、ノードによって維持される状態を、次のように要約することができる。 
・０からｂn−１までの範囲に均一に分布する数値であるＩＤ。
・次からなるルーティングテーブル（すべての演算はｍｏｄｕｌｏ ｂnで行われる）
○ ノードが参加するリングのそれぞれ、例えば、リングｄについて、
【００９３】
【表２】
0005498594.tif 000003
【００９４】
○ 適当にｓd≦ｉｄ＋ｂi≦ｓd+1またはｐd+1≦ｉｄ−ｂi≦ｐdになるｒ±i＝ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ（ｉｄ±ｂi，ｕｐｄａｔｅＭｓｇ，ｄ）になるルーティングノード（ｒ-(n-1)，．．．，ｒ-1，ｒ1，．．．，ｒn-1）
ここで、ｂは、基数であり、ｎは、桁数単位のフィールドサイズであり、ｕは、近傍範囲であり、ｖは、近傍サイズである。
【００９５】
リング「ｄ」内の所与のノードによって維持される近傍ノードのサブセットが、その所与のノードがやはり参加する子リング「ｄ＋１」内の近傍ノードとしてもう一度現れ得ることに留意されたい。したがって、所与のノードが参加するＤ個のリングのすべてにまたがってその所与のノードによって維持される近傍ノードの総数に対する上界を、Ｄ＊ｍａｘ（ｕ，ｖ）／２として導出することができる。これは、所与のノードに対する１つの参照だけが保存されることを考慮したものであり、ワーストケース上界は、バランスのとれたツリーに関する。
【００９６】
リングが、複数の対応する兄弟サブリングにパーティショニングされるときに、指定されたノードが、例えば、エイリアシング(aliasing)を介して、複数の対応する兄弟サブリングのうちの複数に同時に参加することが許可されることに留意されたい。エイリアシングは、例えば、異なるサブリングからの、異なる状態を、指定されたノードに関連付けるために実施することができる。したがって、所与のノードのエイリアスは、同一のＩＤを有するが、各エイリアスは、別個の状態を関連付けられることができる。エイリアスは、指定されたノードが、必ずしもより特定の近接判断基準の共通の先祖ではない別個の近接判断基準を有する複数のリングに参加することを可能にする。すなわち、指定されたノードは、近接ツリーの複数の枝に参加することができる。
【００９７】
例えば、二重ＮＩＣ（有線および無線）ラップトップ機を、そのラップトップ機と同一のＬＡＮセグメントを共有する他の無線ノードと有線ノードとの両方と近接的に同等と考えることができる。しかし、これらの２つの別個の近接判断基準を、例えば、組織メンバシップに基づくものなど、異なるより高い優先順位の近接判断基準の適用の後に限って適用可能なサブ判断基準としてモデル化することができる。そのラップトップ機は、同一の組織に属するので、１）有線ＬＡＮセグメント内のメンバシップおよび、２）無線ＬＡＮセグメント内のメンバシップを表す２つのサブリング内のエイリアス化されたノードは、そのラップトップ機が属する組織を表すリング内の単一のノードにマージされる。ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙが、エイリアシングの存在下でまったく変更なしに期待されたとおりに働くことを理解されたい。
【００９８】
各近接リングを、（潜在的に異なる）リングパラメータに従って構成することができる。リングパラメータは、近傍を定義する（例えば、リングパラメータは、近傍範囲、近傍サイズ、ｐｉｎｇメッセージおよびｄｅｐａｒｔメッセージのタイミング、ならびにｐｉｎｇメッセージおよびｄｅｐａｒｔメッセージの分布パターンを表すことができる）か、特定のフェデレーティング機構を示す（例えば、前述の第１から第４までのフェデレーティング機構の中からまたは他のフェデレーティング機構の中から）か、同一の近接リング内のルーティングパターンの間での通信の詳細を定義するのに使用することができる。一部のリングパラメータは、より一般的とし、複数の異なるフェデレーティング機構に適用することができるが、他のリングパラメータは、より固有であり、特定のタイプのフェデレーティング機構に適用される。
【００９９】
より高いレベルの近接リングを構成するのに使用されるリングパラメータを、いくつかの実施形態で、より低いレベルの近接リングによって継承することができる。例えば、リング５４３が、リング５３１のリングパラメータ（リング５２２から継承されるなど）の一部を継承するかもしれない。したがって、リング５３１に関連する近傍サイズおよび近傍範囲は、リング５４１にも関連する。
【０１００】
しかし、継承されたリングパラメータを変更することができ、および／または、近接リングを異なるリングパラメータに従って個別に構成することができる。例えば、リング５１１が、多数のノードを含む管理ドメイン用であり、したがって、上記第４のフェデレーティング機構が、リング５１１により適当であるかもしれない。その一方で、リング５２１が、比較的少数のノードを有する小さい会社用であり、したがって、上記第２のフェデレーティング機構が、リング５２１により適当であるかもしれない。したがって、リング５２１に関連するリングパラメータに、リング５１１に関連するリングパラメータと異なる値をセットすることができる（あるいは、継承されたパラメータをリング５１１に関連するリングパラメータに変更することができる）。例えば、特定のタイプのフェデレーティング機構を示すリングパラメータを、リング５１１と５２１との間で異なるものにすることができる。同様に、近傍を定義するパラメータを、リング５１１と５２１との間で異なるものにすることができる。さらに、リング５２１を、上記第２のフェデレーティング機構に固有の特定のパラメータに従って構成することができるが、リング５１１は、上記第４のフェデレーティング機構に固有の追加の特定のパラメータに従って構成される。
【０１０１】
したがって、近接リングを、その近接リング内のノードの特性（例えば、個数、含まれるリソースなど）に基づいて柔軟に構成することができる。例えば、管理者は、構成プロシージャを使用して（例えば、ユーザインターフェースを介して）近接リングのリングパラメータを選択することができる。構成プロシージャは、近接リングの間の継承関係の構成ならびに例えば、他の形で継承されるリングパラメータをオーバーライドするためなどの個々の近接リングの構成を容易にすることができる。
【０１０２】
図８に、フェデレーションインフラストラクチャのノードをパーティショニングする方法８００の一例の流れ図を示す。方法８００を、図５のツリー５００のパーティションのリングに関して説明する。方法８００は、フェデレーションインフラストラクチャ内のノードに割り当てられたノードＩＤを含むソートされたリンクリストにアクセスする行為（行為８０１）を含む。例えば、リング５０１によって表されるソートされたリンクリストにアクセスすることができる。ソートされたリンクリストのノードＩＤ（リング５０１に示されたノード）は、フェデレーションインフラストラクチャ（例えば、フェデレーションインフラストラクチャ１００）内のノードを表すことができる。
【０１０３】
方法８００は、ソートされたリンクリストをパーティショニングするための複数の異なる近接判断基準を表す近接カテゴリにアクセスする行為（行為８０２）を含む。例えば、ドメイン境界５６１、地理的境界５６２、および組織境界５６３を表す近接判断基準にアクセスすることができる。しかし、信頼ドメイン境界などの他の近接判断基準も、アクセスされた近接判断基準内で表され得る。近接カテゴリには、近接判断基準の以前に作成された半順序を付けられたリストを含めることができる。リングを、近接判断基準の半順序を付けられたリストに基づいてパーティショニングすることができる。
【０１０４】
方法８００は、第１近接判断基準に基づいて、ソートされたリンクリストを１つまたは複数の第１サブリストにパーティショニングする（１つまたは複数の第１サブリストのそれぞれは、ソートされたリンクリストからのノードＩＤの少なくともサブセットを含む）行為（行為８０３）を含む。例えば、リング５０１を、判断基準５７１に基づいてサブリング５１１、５１２、５１３、および５１４にパーティショニングすることができる。サブリング５１１、５１２、５１３、および５１４のそれぞれが、リング５０１からのノードＩＤの異なるサブセットを含むことができる。
【０１０５】
方法８００は、第２近接判断基準に基づいて、１つまたは複数の第１サブリストの中から選択された第１サブリストを１つまたは複数の第２サブリストにパーティショニングする（１つまたは複数の第２サブリストのそれぞれは、第１サブリストに含まれるノードＩＤの少なくともサブセットを含む）行為（行為８０４）を含む。例えば、サブリング５１１を、判断基準５８１に基づいてサブリング５２１、５２２、および５２３にパーティショニングすることができる。サブリング５２１、５２２、および５２３のそれぞれは、サブリング５１１からのノードＩＤの異なるサブセットを含むことができる。
【０１０６】
図９に、ノードのルーティングテーブルを移植する方法９００の一例の流れ図を示す。方法９００を、図３のソートされたリンクリスト３０４およびリング３０６に関して説明する。方法９００は、先行ノードをルーティングテーブルに挿入する（先行ノードは、ソートされたリンクリストの第１方向で現行ノードに対して現行ノードに先行する）行為（行為９０１）を含む。例えば、ＩＤ５０を有するノードを、ＩＤ６４を有するノード（現行ノード）の先行物としてルーティングテーブルに挿入することができる。時計回りの方向３２１で（ソートされたリンクリスト３０４の終りＡからソートされたリンクリスト３０４の終りＢに向かって）移動すると、ＩＤ５０を有するノードは、ＩＤ６４を有するノードに先行する。先行ノードの挿入は、現行ノードと先行ノードとの間に対称パートナーシップを確立することができ、現行ノードが、先行ノードのパートナになり、先行ノードが、現行ノードのパートナになる。
【０１０７】
方法９００は、後続ノードをルーティングテーブルに挿入する（後続ノードは、ソートされたリンクリストの第１方向で現行ノードに対して現行ノードに後続する）行為（行為９０２）を含む。例えば、ＩＤ７６を有するノードを、ＩＤ６４を有するノード（現行ノード）の後続物としてルーティングテーブルに挿入することができる。反時計回りの方向３２２で移動すると、ＩＤ７６を有するノードは、ＩＤ６４を有するノードに先行する。後続ノードの挿入は、現行ノードと後続ノードとの間に対称パートナーシップを確立することができ、現行ノードが、後続ノードのパートナになり、後続ノードが、現行ノードのパートナになる。
【０１０８】
方法９００は、適当な近傍ノードをルーティングテーブルに挿入する（近傍ノードは、近傍範囲および近傍サイズに基づいて、第１方向と第２の反対の方向との両方で、ソートされたリンクリストから識別される）行為（行為９０３）を含む。例えば、ＩＤ８３、７６、５０、および４６を有するノードを、ＩＤ６４を有するノード（現行ノード）の近傍ノードとしてルーティングテーブルに挿入することができる。２０の近傍範囲および近傍サイズ４に基づいて、ＩＤ８３および７６を有するノードを、時計回りの方向３２１で識別することができ、ＩＤ５０および４６を有するノードを、反時計回りの方向３２２（ソートされたリンクリスト３０４の終りＢからソートされたリンクリスト３０４の終りＡに向かって移動する）で識別することができる。いくつかの環境で、適当な近傍ノードが識別されないかもしれない。近傍ノードの挿入は、現行ノードと近傍ノードとの間に対称パートナーシップを確立することができ、現行ノードが、近傍ノードのパートナになり、近傍ノードが、現行ノードのパートナになる。
【０１０９】
方法９００は、適当なルーティングノードをルーティングテーブルに挿入する（ルーティングノードは、フェデレーションインフラストラクチャのＩＤ空間の基数およびフィールドサイズに基づいて第１方向と第２方向との両方でソートされたリンクリストから識別され、ルーティングノードは、第１方向と第２方向との両方でソートされたリンクリストの対数インデックスを表す）行為（行為９０４）を含む。例えば、ＩＤ２、３０、４６、５０、６４、６４、６４、６４、６４、７６、８３、９８、１３５、および２００を有するノードを、ＩＤ６４を有するノードのルーティングノードとしてルーティングテーブルに挿入することができる。基数２および８のフィールドサイズに基づいて、ＩＤ６４、６４、７６、８３、９８、１３５、および２００を有するノードを、方向３２１で識別することができ、ＩＤ６４、６４、５０、４６、３０、２、および２００を有するノードを、方向３２２で識別することができる。内側リング３０６に示されているように、ルーティングノードは、時計回りの方向３２１と反時計回りの方向３２２との両方でのソートされたリンクリストの対数インデックスを表す。ルーティングノードの挿入は、現行ノードとルーティングノードとの間に対称パートナーシップを確立することができ、現行ノードが、ルーティングノードのパートナになり、ルーティングノードが、現行ノードのパートナになる。
【０１１０】
図７に、近接判断基準を考慮に入れるノードルーティングテーブルを移植する方法７００の一例の流れ図を示す。方法７００を、図５のリングに関して説明する。方法７００は、現行ノードが参加する階層的にパーティショニングされたルーティングリングのそれぞれの先行ノードをルーティングテーブルに挿入する行為（行為７０１）を含む。各先行ノードは、現行ノードが参加する各階層的にパーティショニングされたルーティングリング内で第１方向（例えば、時計回り）で現行ノードに先行する。階層的にパーティショニングされたルーティングリングは、対応する近接判断基準に従ってパーティショニングされ、両方向リンクリストの少なくともサブセット（おそらくは両方向リンクリスト全体）を含む。例えば、指定されたノードが、ルートリング５０１ならびにサブリング５１１、５２２、５２３、５３１、および５４２に参加するかもしれない。したがって、先行ノードは、リング５０１ならびにサブリング５１１、５２２、５２３、５３１、および５４２のそれぞれの中から、指定されたノードについて選択される。
【０１１１】
方法７００は、現行ノードが参加する階層的にパーティショニングされたルーティングリングのそれぞれの後続ノードをルーティングテーブルに挿入する行為（行為７０２）を含む。各後続ノードは、現行ノードが参加する各階層的にパーティショニングされたルーティングリング内で第１方向で現行ノードに後続する。例えば、後続ノードは、リング５０１ならびにサブリング５１１、５２２、５２３、５３１、および５４２のそれぞれの中から、指定されたノードについて選択される。
【０１１２】
方法７００は、現行ノードが参加する階層的にパーティショニングされたルーティングリングのそれぞれの適当な近傍ノードをルーティングテーブルに挿入する行為（行為７０３）を含む。近傍ノードは、現行ノードが参加する階層的にパーティショニングされたルーティングリングから、近傍範囲および近傍サイズに基づいて第１方向（例えば、時計回り）と第２の反対の方向（例えば、反時計回り）との両方で識別することができる。例えば、近傍ノードを、リング５０１ならびにサブリング５１１、５２２、５２３、５３１、および５４２のそれぞれの中から、指定されたノードについて識別することができる。
【０１１３】
方法７００は、現行ノードが参加する階層的にパーティショニングされたルーティングリングのそれぞれの適当なルーティングノードをルーティングテーブルに挿入する行為（行為７０４）を含む。例えば、ルーティングノードを、リング５０１ならびにサブリング５１１、５２２、５２３、５３１、および５４２のそれぞれの中から、指定されたノードについて識別することができる。
【０１１４】
いくつかの実施形態で、適当なルーティングノードが、ノードＹが参加する葉リング（または、エイリアシングを利用する実施形態では複数の葉リング）を除く近接リングｄごとに挿入される。適当なルーティングノードを、次の式に基づいて挿入することができる。 
Ｙ．ｓd．ｉｄ＜Ｙ．ｉｄ＋ｂi＜Ｙ．ｓd+1．ｉｄが真である場合には、リングｄを使用し、あるいは、
Ｙ．ｐd．ｉｄ＜Ｙ．ｉｄ−ｂi＜Ｙ．ｐd+1．ｉｄが真である場合には、リングｄを使用する。
【０１１５】
リングが、前のステップで識別されなかった場合には、リード（例えば、リング５０１）リングをリングｄとして使用する。今や、リングｄは、ノードＹがｚに最も近いルーティングパートナをそこで探さなければならない近接リングである。
【０１１６】
図１０は、メッセージを宛先ノードに向かってルーティングする方法１０００の一例の流れ図を示す。方法１０００を、図３のソートされたリンクリスト３０４およびリング３０６に関して説明する。方法１０００は、受信ノードが宛先を示す数と一緒にメッセージを受信する行為（行為１００１）を含む。例えば、ＩＤ６４を有するノードが、２１２という宛先を示すメッセージを受信することができる。
【０１１７】
方法１０００は、受信ノードが、対応する先行ノードより宛先から数値的に遠いおよび対応する後続ノードより宛先から数値的に遠い、のうちの少なくとも１つであることを判定する行為（行為１００２）を含む。例えば、方向３２２で、ＩＤ６４は、ＩＤ５０より宛先２１２から遠く、方向３２１で、ＩＤ６４は、ＩＤ７６より宛先２１２から遠い。方法１０００は、宛先が受信ノードに対応するノードの近傍セット内にないことを判定する行為（行為１００３）を含む。例えば、ＩＤ６４を有するノードは、宛先２１２が８３、７６、５０、および４６という近傍セット内にないことを判定することができる。
【０１１８】
方法１０００は、受信ノードに対応するルーティングテーブルから、対応するルーティングテーブル内の他のルーティングノードより宛先に数値的に近い中間ノードを識別する行為（行為１００４）を含む。例えば、ＩＤ６４を有するノードは、他のルーティングノードより宛先２１２に数値的に近いものとしてＩＤ２００を有するルーティングノードを識別することができる。方法１０００は、中間ノードにメッセージを送信する行為（行為１００５）を含む。例えば、ＩＤ６４を有するノードは、ＩＤ２００を有するノードにメッセージを送信することができる。
【０１１９】
図１１に、近接判断基準に基づいてメッセージを宛先ノードに向かってルーティングする方法１１００の一例の流れ図を示す。方法１１００を、図４および図５のリングに関して説明する。方法１１００は、受信ノードが宛先を示す数および近接判断基準と一緒にメッセージを受信する行為（行為１１０１）を含む。近接判断基準は、ノードの１つまたは複数のクラスを定義する。受信ノードは、近接判断基準に基づいてノードの１つまたは複数のクラスの中から選択されたノードの現行クラスの一部としてメッセージを受信する。例えば、ＩＤ１７２を有するノードは、２０１という宛先およびこの宛先ノードがリング４０１によって表されるクラスの一部であることを示す近接判断基準を示すメッセージを受信する。ＩＤ１７２を有するノードは、リング４０４の一部としてこのメッセージを受信することができる。
【０１２０】
方法１１００は、受信ノードが、ノードの選択されたクラス内のノードの中で、対応する先行ノードより宛先から数値的に遠いおよび対応する後続ノードより宛先から数値的に遠い、のうちの少なくとも１つであることを判定する行為（行為１１０２）を含む。例えば、リング４０４内で、ＩＤ１７２を有するノードは、時計回りの方向でＩＤ１７４を有するノードより宛先２０１から遠く、反時計回りの方向でＩＤ１５３を有するノードより宛先２０１から遠い。
【０１２１】
方法１１００は、宛先が、近接判断基準によって定義されるノードの１つまたは複数のクラスのいずれかについて受信ノードのノードの近傍セット内にないことを判定する行為（行為１１０３）を含む。例えば、ＩＤ１７２を有するノードは、宛先２０１がリング４０４またはリング４０１内の対応する近傍セット内にないことを判定することができる。
【０１２２】
方法１１００は、受信ノードのルーティングテーブルから、ルーティングテーブル内の他のルーティングノードより宛先に数値的に近い中間ノードを識別する行為（行為１１０４）を含む。例えば、ＩＤ１７２を有するノードは、リング４０４内の他のルーティングノードより宛先２０１に数値的に近いものとして、ＩＤ１９４を有するノードを識別することができる。方法１１００は、中間ノードにメッセージを送信する行為（行為１１０５）を含む。例えば、ＩＤ１７２を有するノードは、受信されたメッセージをＩＤ１９４を有するノードに送信することができる。ＩＤ１７２を有するノードは、近接判断基準の以前に定義された半順序を付けられたリストを尊重するために、受信されたメッセージをＩＤ１９４を有するノードに送信することができる。
【０１２３】
ノード１９４は、リング４０４内でできる限り宛先２０１に近いものとすることができる。したがって、近接を、次のレグ内のリング４０４内で宛先に向かうさらなるルーティングを行うことを可能にするのにちょうど十分に緩和することができる。すなわち、ルーティングは、リング４０４上で宛先に向かうさらなる進行を行えないので、リング４０４からリング４０１に推移される。あるいは、ＩＤ２０１を有するノードが、リング４０１内のＩＤ１９４を有するノードの近傍内にあり、さらなるルーティングをもたらさないかもしれない。したがって、いくつかの実施形態で、次に上位のリングに進むための近接判断基準の緩和は、さらなるルーティングを引き起こすのに十分である。
【０１２４】
しかし、他の実施形態では、次に上位のリングへの推移を引き起こす近接判断基準の増分緩和が、さらなるルーティングを行えるまで（またはルートリングに出会うまで）継続される。すなわち、より上位のリングへの複数の推移が、さらなるルーティング進行を行えるようになる前に発生する。例えば、ここで図５を参照すると、さらなるルーティング進行をリング５３１で行えないときに、近接判断基準を、リング５１１へまたはルートリング５０１へすら推移するのに十分に緩和することができる。
【０１２５】
（ノードフェーズ）
フェデレーションインフラストラクチャに参加するノードは、異なる動作フェーズで動作することができる。あるノードの有効なフェーズ値を、順序付きセットのメンバになるように定義することができる。例えば、{NodeId}.{InstanceIds}.{Phase Value[Phase-State Values: Inserting, Syncing, Routing, Operating].[Phase.Unknown Indication: phase known at time of transmission, phase unknown at time of transmission]}は、フェデレーションインフラストラクチャ内の所与のノードのフェーズ空間を表す１つの可能な順序付きセットを定義する。ノードインスタンスは、ノードフェーズ状態を介してＩｎｓｅｒｔｉｎｇ（挿入中）からＳｙｎｃｉｎｇ（同期中）、次にＲｏｕｔｉｎｇ（ルーティング中）、次にＯｐｅｒａｔｉｎｇ（動作中）の順番で推移する（または前進する）ことができる。さらに、いくつかの実施形態で、ノードインスタンスを、ノードインスタンスが以前のノードフェーズ状態に戻って推移しなくなるように構成することができる。いくつかの実施形態で、ノードは、ノードが発生するたびにそのインスタンスＩＤを進める。
【０１２６】
例えば、ノードインスタンスが、ＲｏｕｔｉｎｇからＳｙｎｃｉｎｇに戻って、（またはＩｎｓｅｒｔｉｎｇに戻って）推移するのを防ぐことができる。したがって、いくつかの実施形態で、所与のノードインスタンス（例えば、（ＮｏｄｅＩｄ，ＩｎｓｔａｎｃｅＩｄ）によって識別される）が、特定のノードフェーズ状態（例えば、Ｏｐｅｒａｔｉｎｇ）に進んだことがわかっているときには、その所与のノードインスタンスが、以前のノードフェーズ状態（例えば、Ｒｏｕｔｉｎｇ、Ｓｙｎｃｉｎｇ、またはＩｎｓｅｒｔｉｎｇ）に戻る可能性が低い（いくつかの実施形態では戻らない）こともわかる。したがって、特定のノードフェーズ状態の前のノードフェーズにある任意のノードインスタンスが、そのノードの新しい（前進した）インスタンスであることのかなりの尤度がある。
【０１２７】
いくつかの実施形態で、フェーズ情報および対応するインスタンスＩｄ（ノードが発生するたびに進む）は、一緒に転送される。したがって、同一インスタンスのより低いノードフェーズ状態はより古いと判定することが可能である。さらに、より新しいノードインスタンスが既知である（任意のフェーズ状態値で）ときに、より古いインスタンスに関するすべての情報が、期限切れと考えられる。
【０１２８】
時々、ノードは、例えば、最初のスタートアップ時、正常な離脱（graceful departure）を介して、または異常終了（クラッシュ）の結果として、リブートするかお互いとの通信を失う可能性がある。したがって、任意のノードフェーズ状態にあるノードが、リブートするか他のノードとの通信を失う可能性がある。例えば、クラッシュが、Ｒｏｕｔｉｎｇフェーズ状態にあるノードにリブートさせる可能性がある。リブートまたは通信の消失の間には、あるノードがどのノードフェーズ状態にあるかを判定する形がない可能性がある。したがって、ノードがリブートしつつあるか、ノードへの通信が失われるときに、［Ｐｈａｓｅ．Ｕｎｋｎｏｗｎ Ｉｎｄｉｃａｔｉｏｎ］をセットして、そのノードのフェーズ状態が現在は未知であることを示すことができる。しかし、そのノードについて以前に表されたかつ／または検出されたフェーズ状態のすべてが、維持され得、失われない。
【０１２９】
［Ｐｈａｓｅ．Ｕｎｋｎｏｗｎ Ｉｎｄｉｃａｔｉｏｎ］は、フェーズ状態値が送信されたときにフェーズ状態が既知であった（例えば、ｐｈａｓｅ．ｕｎｋｎｏｗｎをセットされていないフェーズ値）かどうか、またはフェーズ状態が以前に表されたフェーズ状態であり、フェーズ状態が送信されたときにフェーズ状態が未知であった（例えば、ｐｈａｓｅ．ｕｎｋｎｏｗｎをセットされたフェーズ値）かどうかを示すのに使用することができる。したがって、あるノードのフェーズ（そのフェーズ値）は、フェーズ状態値とｐｈａｓｅ．ｕｎｋｎｏｗｎ表示との両方を使用して表すことができる。
【０１３０】
（参加プロトコル）
時々、ノードは、既存のフェデレーションに参加し、既存フェデレーションから離脱することができる。ノードは、フェデレーションへの参加および離脱のための適当なプロトコルを実施することができる。例えば、ノードは、既存フェデレーションの一部になるためにＪｏｉｎ（）関数を実施することができる。Ｊｏｉｎ（）関数を実施するノードは、最終的な動作フェーズ状態に達する前に、３つの順序付きフェーズ状態すなわち、挿入中フェーズ状態、同期中フェーズ状態、およびルーティング中フェーズ状態を介して推移することができる。他の実施形態では、これらの特定の順序付きフェーズ状態が存在しないが、他のフェーズ状態が定義される場合がある。図１２Ａに、フェデレーションインフラストラクチャ内でメンバシップを確立するノードの一例を示す。図１２Ｂに、メッセージを交換するフェデレーションインフラストラクチャ内のノードの一例を示す。
【０１３１】
挿入フェーズ：ノードＹは、少なくともそのノードＩＤを含み、フェデレーションへの参加アクションを示す参加メッセージを発行することによってこのフェーズ状態に入る。参加メッセージは、そのｄｅｓｔｉｎａｔｉｏｎプロパティに新たに参加するノードのアイデンティティをセットされた、新たに参加するノード（ノードＹ）によって送信されるルーティングされるメッセージとすることができる。このフェーズ状態では、新たに参加するノードは、フェデレーション内でその先行ノードと後続ノードとの間に挿入される。この挿入フェーズ状態は、次のアルゴリズムに従って実施することができる（すべての演算は、ｍｏｄｕｌｏ ｂnで実行される）。
【０１３２】
ＩＰ１Ｙは、既に、参加するノードがそこからフェデレーションに参加することを望む最下位リングの一部である、既存ノードを識別する。これは、静的に構成するか、ＤＨＣＰおよび／またはＤＮＳおよび／またはＷＳ−Ｄｉｓｃｏｖｅｒｙまたは（潜在的に周知の）定数を使用して動的に発見するかのいずれかとすることができる。この既存フェデレーションノードを、Ｅとする。
【０１３３】
ＩＰ２Ｙは、Ｅ．ＲｏｕｔｅＮｕｍｅｒｉｃａｌｌｙ（Ｙ，ｊｏｉｎＭｓｇ）を呼び出して、そのＩＤがノードＹが参加するすべての近接リング内でＹ．ｉｄに数値的に最も近いノードＸを判定する。これには、参加メッセージを複数のノードにルーティングすることを含めることができる。
【０１３４】
ＩＰ３数値的に後続するノード（ｓ）および数値的に先行するノード（ｐ）を判定する（次の挿入を行うのに必要なデータを、参加メッセージおよびその応答内で担持できることに留意されたい。したがって、必要な追加のラウンドトリップはない）。 
ケース１：Ｘ．ｉｄ＞Ｙ．ｉｄ
Ｙ．ｓ＝Ｘ、Ｙ．ｐ＝Ｘ．ｐ、Ｘ．ｐ．ｓ＝Ｙ、およびＸ．ｐ＝Ｙ
ケース２：Ｘ．ｉｄ＜Ｙ．ｉｄ
Ｙ．ｐ＝Ｘ、Ｙ．ｓ＝Ｘ．ｓ、Ｘ．ｓ．ｐ＝Ｙ、およびＸ．ｓ＝Ｙ
【０１３５】
参加メッセージに応答して、ノードＸ（参加メッセージを処理したノード）は、参加応答をノードＹに送り返すことができる。参加応答は、ノードＹの先行ノード（Ｙ．ｐ）および後続ノード（Ｙ．ｓ）を示すことができる。ノードＹは、参加応答を受信し、参加応答を処理して、その先行ノードおよび後続ノードを知ることができる。参加応答を処理した後に、ノードＹは、フェデレーション内の弱いルーティング参加者になることができる。例えば、ノードＹは、単純に、それに送信されたメッセージをその後続ノードまたは先行ノードのいずれかに転送することができる。したがって、ノードＹは、フェデレーションインフラストラクチャに挿入されるが、ルーティングテーブルおよび近傍テーブルは、移植されない。この点に達する前に、ノードＹは、ノードＹのライブネスフェーズが挿入中フェーズ状態であることを示す状況メッセージを送信ノードに返すことによって、それにメッセージを送信する他のノードに、それに送信されたメッセージを異なるノードを介してリダイレクトするように要求する。
【０１３６】
一般に、時々、ノードは、ｓｙｎｃ（同期）要求メッセージおよびｓｙｎｃ応答メッセージを交換することができる。ｓｙｎｃ要求メッセージおよびｓｙｎｃ応答メッセージは、送信側の観点からの他のノードに関するライブネス情報（例えば、ヘッダ）を含むことができる。近傍状態をも、ｓｙｎｃ要求メッセージおよびｓｙｎｃ応答メッセージに含めることができ、近傍のアプリケーションレイヤが、お互いの状態を知るようになる。ｓｙｎｃ要求メッセージおよびｓｙｎｃ応答メッセージが交換されるときの１つの例が、参加するノードの同期化中フェーズ状態中である。しかし、ｓｙｎｃ要求メッセージおよびｓｙｎｃ応答メッセージを、他の動作フェーズ状態中（例えば、Ｏｐｅｒａｔｉｎｇフェーズ状態にいる間）に交換することができる。
【０１３７】
図１６に、メッセージモデルおよび関連する処理モデル１６００の一例を示す。図１６に示されているように、ノードは、ｓｙｎｃ要求メッセージを送信し、受信することができる。例えば、ｓｙｎｃ要求メッセージ１６０１を、新たに挿入されたノード（例えば、ＩＤ１４４を有する図１２Ｂのノード）から、機能レイヤ１６５１で受信することができる。アプリケーションデータ１６０２（例えば、名前空間添字）を、ｓｙｎｃ要求メッセージ１６０１内にピギーバックすることができる。機能レイヤ１６５１は、ｓｙｎｃ要求メッセージ内に含まれるすべてのアプリケーションデータについてアプリケーションレイヤ１６５２に知らせることができる。例えば、機能レイヤ１６５１は、アプリケーションレイヤ１６５２に対して、アプリケーションデータ１６０２を含む近傍状態ｓｙｎｃイベント１６０３を呼び出すことができる。アプリケーションデータ１６０７を含むｓｙｎｃ要求１６３１を、別のノードに送信することもでき、この別のノードは、処理モデル１６００内のｓｙｎｃ要求１６０１に対する処理に似て、ｓｙｎｃ要求１６３１を処理する。
【０１３８】
いくつかの機能レイヤイベント（例えば、ｓｙｎｃ要求メッセージ１６０１、ｓｙｎｃ応答メッセージ１６４１、またはｐｉｎｇメッセージ１６０９）に応答して、機能レイヤ１６５１は、アプリケーションレイヤ１６５２内の近傍状態要求機能１６０４を呼び出すことができる。近傍状態要求１６０４は、近傍内で伝搬される必要がある状態を入手する、アプリケーションレイヤに対する要求である。近傍状態要求１６０４に応答して、アプリケーションレイヤ１６５２は、オプションのアプリケーションデータ１６０７を含む近傍状態１６０６を機能レイヤ１６５１に供給することができる。あるいは、アプリケーションレイヤ１６５２は、オプションのアプリケーションデータ１６０７を含む近傍状態１６０６を、あるアプリケーションレイヤイベントに応答して送信することができる。上記に似た内部機構を使用して、機能レイヤ１６５１は、オプションのアプリケーションデータ１６０７を含むｓｙｎｃ応答メッセージ１６０８を送信して、アプリケーションレイヤ近傍状態を伝搬させることができる。
【０１３９】
同期化フェーズ：参加応答メッセージを処理した後に、ノードＹは、挿入フェーズ状態から同期化中（Ｓｙｎｃｉｎｇ）フェーズ状態に推移する。同期化中フェーズ状態では、新たに挿入されたノードＹは、近傍のノードと情報を同期化する。一般に、ノードＹは、少なくとも挿入フェーズ状態で識別されたその先行ノードおよび後続ノードにｓｙｎｃメッセージを送信することができる。そのｓｙｎｃメッセージを処理するノードは、これらの処理するノードの対応する近傍およびルーティングパートナノードを示すｓｙｎｃ応答を返すことができる。より具体的な例では、同期化中フェーズ状態を、次のアルゴリズムに従って実施することができる（すべての演算は、ｍｏｄｕｌｏ ｂnで実行される）。
【０１４０】
ＳＰ１ノードＹが参加する各近接リング内のＮｅｉｇｈｂｏｒｈｏｏｄ（Ｙ．ｓ）ノードとＮｅｉｇｈｂｏｒｈｏｏｄ（Ｙ．ｐ）ノードとの和集合からＮｅｉｇｈｂｏｒｈｏｏｄ（Ｙ）を計算する。和集合計算は、次のように行うことができる。
【０１４１】
【表３】
0005498594.tif 000004
【０１４２】
ＳＰ２短く図１６を参照すると、近傍状態要求（例えば、近傍状態要求）１６０４を介してＹのローカルアプリケーションレイヤ（例えば、アプリケーションレイヤ１６５２）を照会して、オプションのアプリケーション固有近傍データ（例えば、アプリケーション固有データ１６０７）を入手する。
【０１４３】
ＳＰ３少なくとも近接する後続ノードおよび先行ノードに、少なくともＹの展望からの各近接近傍およびルーティングパートナのライブネス状態情報を含む同期化メッセージを送信する。ＳＰ２を介してアクセスされるすべてのオプションのアプリケーション固有近傍データ（例えば、アプリケーションデータ１６０７）は、ｓｙｎｃ要求１６３１に含まれる。
【０１４４】
ＳＰ４Ｙは、ＳＰ２で送信されたｓｙｎｃメッセージを処理するノードから戻るｓｙｎｃ応答メッセージを受信する。例えば、ノードＹは、その計算された近傍内の１つまたは複数のノードと同期化メッセージ（要求／応答）を交換することができる。同期化メッセージが、ノードＹの近傍ノードのうちの少なくとも１つ、潜在的にはそのすべてと交換された後に、計算された近傍ノードは、同期化されたデータを伝搬させるためにさらなるメッセージを交換することができる。同期化メッセージ（要求または応答）は、例えば、ノード近傍内にある、ターゲットノードとデータを先を見越して同期化するために、あるノードによって送信されるルーティングされないメッセージとすることができる。
【０１４５】
ＳＰ５ＳＰ４でｓｙｎｃ応答メッセージが受信される（例えば、ｓｙｎｃ応答メッセージ１６４１）ときに、これらの受信されたｓｙｎｃ応答メッセージ内に存在するすべてのオプションのアプリケーション固有近傍データ（例えば、アプリケーションデータ１６２２）を、近傍状態ｓｙｎｃイベント１６０３を介してＹのアプリケーションレイヤ１６５２に提供することができる。
【０１４６】
同期化中フェーズ状態の一部として、近接後続ノード（例えば、Ｙ．ｓ）および近接先行ノード（Ｙ．ｐ）は、それらのルーティングテーブルを新たに挿入されたノード（例えば、Ｙ）と交換する。ｓｙｎｃメッセージを受信するノードは、ｓｙｎｃ応答を送信することによって応答することができる。ｓｙｎｃ応答は、応答するノードの展望からのものを除いて同期化メッセージに類似するデータを担持する。ｓｙｎｃメッセージとｓｙｎｃ応答との両方が、アプリケーションデータを担持する（またはピギーバックする）ことができる。したがって、アプリケーションデータを、同期化中フェーズ状態中にノードの間で伝搬させることができる。同期化フェーズ状態が完了したときに、ノードは、そのノード宛のメッセージを後続物または先行物のいずれかに単純に転送するのではなく、そのメッセージを処理することができる。しかし、ノードを、それでも、弱いルーティング参加者と見なすことができる。というのは、そのルーティングテーブルが移植されていないからである。
【０１４７】
ルーティング中フェーズ：同期化中フェーズ状態が完了した後に、ノードは、ルーティング中フェーズ状態に推移する。ルーティング中フェーズ状態では、新たに同期化されたノード（例えば、ノードＹ）は、そのルーティングノードを計算する。ルーティング中フェーズ状態は、次のアルゴリズムに従って実施することができる（すべての演算は、ｍｏｄｕｌｏ ｂnで実行される）。
【０１４８】
ＲＰ１ルーティング中フェーズ状態が、バランシングプロシージャ（後で説明する）の一部として実行されている場合には、後続ノード（Ｙ．ｓ）および先行ノード（Ｙ．ｐ）が、ノードＹが参加するすべての近接リング内でアライブであることを確実にする。いずれかがアライブではない場合には、検討中のリング内の近傍ノードの中から次に最良の後続ノードまたは先行ノードを選択することによって、障害を発生したノード（１つまたは複数）の置換ノードを決定する。 
【０１４９】
ＲＰ２１≦ｉ≦ｎ−１について
ＲＰ２ａ ｚ＝Ｙ．ｉｄ±ｂiを計算する
ＲＰ２ｂ リングｄが最も特定の近接ではない場合には、ノードＹが参加し、条件Ｙ．ｓd．ｉｄ＜Ｙ．ｉｄ＋ｂi＜Ｙ．ｓd+1．ｉｄまたはＹ．ｐd．ｉｄ＜Ｙ．ｉｄ−ｂi＜Ｙ．ｐd+1．ｉｄを満足する近接リングｄを見つける。そうでない場合には、リングｄを最も特定の近接リングにする。リングｄは、ノードＹがｚに最も近いルーティングパートナをその中で探さなければならない近接リングである。Ｑが、Ｙ．ｓd．ｒ±iとＹ．ｐd．ｒ±iとの間でｚに数値的に最も近いノードであるものとする。｜Ｑ．ｉｄ−ｚ｜が、ｂiの構成可能なパーセンテージ（通常は２０％）以内である場合には、単純にＹ．ｒ±i＝Ｑにする。Ｑ．ｉｄが、（Ｙ．ｓd．ｉｄ±ｂi）または（Ｙ．ｐd．ｉｄ±ｂi）のいずれかよりｚに近い場合には、これは、ノードＹが、Ｙ．ｓdまたはＹ．ｐdのいずれかよりよい、近接リングｄ内のノードＱに対するパートナルーティングノードであることを意味する。したがって、ｕｐｄａｔｅＭｓｇがまだ送信されていない場合には、ノードＱがｒ-iでのパートナルーティングノードとしてノードＹを確立できるようにするために、パラメータとしてｉおよびノードＹを供給して、ｕｐｄａｔｅＭｓｇをノードＱに送信する。
【０１５０】
ＲＰ２ｃこのフェーズ状態が、バランシングプロシージャの一部として実行されつつあり、Ｙ．ｓd．ｒ±i．ｉｄ＝＝Ｙ．ｐd．ｒ±i．ｉｄである場合には、（Ｙ．ｓd．ｉｄ±ｂi）と（Ｙ．ｐd．ｉｄ±ｂi）との間の数値範囲内に１つのノードだけがある。そのノードは、後続（または先行）ノードのルーティングノードｒ±iによってポイントされるノードである。したがって、単純にＹ．ｒ±i＝Ｙ．ｓd．ｒ±i・iにする。
【０１５１】
ＲＰ２ｄそうでない場合には、リングｄの近接判断基準にセットされた近接判断基準を用いてノードＱに対してＲｏｕｔｅＰｒｏｘｉｍａｌｌｙを呼び出すことによって、ルーティングパートナＹ．ｒ±iを計算する。これは、Ｙ．ｒ±i＝Ｑ．ＲｏｕｔｅＰｒｏｘｉｍａｌｌｙ（ｚ，ｕｐｄａｔｅＭｓｇ，ｄ）を暗示する。
【０１５２】
ＲＰ３この点で、ノードＹは、それ宛のメッセージを処理できるだけではなく、メッセージをルーティングすることもできる。
【０１５３】
ＲＰ４パートナルーティングノードのエンドポイントＩＤのアプリケーションレイヤから送信されたライブネス通知イベントへのサブスクライブがまだ行われていない場合には、それを行う。また、もはやパートナルーティングノードではないノードについてアプリケーションレイヤを用いて以前に確立されたすべてのライブネスイベントサブスクリプションを取り消す。例えば、サブスクリプション要求および／または取消要求を、対応するアプリケーション（例えば、名前空間アプリケーション）のパブサブロジック（ｐｕｂ−ｓｕｂ ｌｏｇｉｃ）を実施するアプリケーションレイヤ（例えば、アプリケーションレイヤ１２１）へ上に渡すことができる。後続のアプリケーション固有ライブネスメッセージ（例えば、名前空間サブスクリプションから生じるもの）が、アプリケーションレイヤで受信されるときに、通知（イベント）を、処理のために他の下位レイヤ（例えば、他の下位レイヤ１３１）へ下にプッシュすることができる。
【０１５４】
図１７に、機能レイヤ１７５１とアプリケーションレイヤ１７５２との間で発生し得る複数のライブネス相互作用の一例を示す。図１７に示されているように、エンドポイントは、例えば、様々なノードを表すパブリッシュ／サブスクライブトピック（例えば、ＵＲＬまたはＵＲＩによって表される）であり、例えば、フェデレーションインフラストラクチャノードとすることができる。Ｓｕｂｓｃｒｉｂｅ Ｔｏ Ｌｉｖｅｎｅｓｓ Ｅｖｅｎｔ（ライブネスイベントへのサブスクライブ）１７０１は、ライブネスイベント（例えば、パブリッシュ／サブスクライブトピック）にサブスクライブするために機能レイヤ１７５１からアプリケーションレイヤ１７５２に対して呼び出すことができる。Ｒｅｖｏｋｅ Ｌｉｖｅｎｅｓｓ Ｓｕｂｓｃｒｉｐｔｉｏｎ（ライブネスサブスクリプション取消）１７０２は、ライブネスイベントへのサブスクリプションを取り消すために機能レイヤ１７５１からアプリケーションレイヤ１７５２に対して呼び出すことができる。Ｅｎｄ Ｐｏｉｎｔ Ｄｏｗｎ（エンドポイントダウン）１７０３は、エンドポイントがダウンしている可能性があることを示すためにアプリケーションレイヤ１７５２から機能レイヤ１７５１に送ることができ、オプションのｒｅｐｌａｃｅｍｅｎｔ（置換）エンドポイントを機能レイヤ１７５１に与える。Ｅｎｄ Ｐｏｉｎｔ Ｄｏｗｎ ｅｖｅｎｔ １７０３は、以前のサブスクリプション（例えば、Ｓｕｂｓｃｒｉｂｅ Ｔｏ Ｌｉｖｅｎｅｓｓ Ｅｖｅｎｔ １７０１）に基づいて非同期に送ることができる。
【０１５５】
ＮｏｄｅＤｏｗｎ（ノードダウン）１７０４は、機能レイヤ１７５１（またはある他の下位レイヤ）が、障害を発生したノードを検出したことを示し、オプションで置換ノードをアプリケーションレイヤ１７５２に与えるために、機能レイヤ１７５１からアプリケーションレイヤ１７５２に対して呼び出すことができる。アプリケーションレイヤ１７５２は、その後、潜在的に障害を発生しているノードが検出されたことを他の関心を持つ当事者に伝搬させることができる。Ｎｏｄｅ ｄｏｗｎ ｅｖｅｎｔ １７０４は、機能レイヤ１７５１またはある他の下位レイヤが潜在的に障害を発生しているノードを検出したときに、いつでも非同期に送ることができる。Ｓｅｎｄ ｌｉｖｅｎｅｓｓ（ライブネス送信）１７０６は、ノードがダウンしていることをアプリケーションレイヤ１７５２が検出する（例えば、ｎｏｄｅ ｄｏｗｎ ｅｖｅｎｔ １７０４からまたはある他の帯域外機構から）ときに、アプリケーションレイヤ１７５２から機能レイヤ１７５１に対して呼び出すことができる。Ｓｅｎｄ ｌｉｖｅｎｅｓｓ ｅｖｅｎｔ １７０６は、機能レイヤ１７５１にライブネスメッセージを送らせることができる。Ｓｅｎｄ ｌｉｖｅｎｅｓｓ ｅｖｅｎｔ １７０６は、アプリケーションレイヤ１７５２が、ノードがダウンしていることを検出するときにいつでも非同期に呼び出すこともでき、以前に確立されたサブスクリプション（ライブネスへのサブスクライブを介して）のいずれにも依存しない。
【０１５６】
したがって、いくつかの実施形態で、機能レイヤ１７５１は、再帰的に使用される。例えば、機能レイヤ１７５１は、指定されたノード（例えば、上または下の特定のノードである）への関心をアプリケーションレイヤ１７５２に示すことができる。アプリケーションレイヤ１７５２は、指定されたノードに関係する通知に関するアプリケーション固有サブスクリプションを定式化し、その後、機能レイヤ１７５１を再利用して、他のフェデレーションノード内の適当な対応するアプリケーションレイヤ１７５２インスタンスに定式化されたサブスクリプションを通信することができる。例えば、フェデレーションノード内のアプリケーションレイヤ１７５２が、名前空間パブ／サブ（ｐｕｂ／ｓｕｂ）挙動を実施する場合に、機能レイヤ１７５１は、指定されたノードの通知を管理するパブリッシュ／サブスクライブマネージャにサブスクリプションをルーティングすることができ、パブ／サブマネージャは、関係するフェデレーションノード内のアプリケーションレイヤ１７５２の少なくとも一部として実施される。したがって、機能レイヤ１７５１は、機能レイヤ１７５１が生成させたサブスクリプションをルーティングするのに使用される。類似する再帰機構を、アンサブスクライブするか、もはや指定されたノードへの関心がないことを他の形で示すのに使用することもできる。
【０１５７】
動作中フェーズ：ルーティング中フェーズ状態が完了した後に、ノードは、動作中フェーズ状態に推移する。ノードは、ダウンする（例えば、リブートする）まで、動作中フェーズ状態のままであることができる。動作中フェーズ状態では、ノードは、時々ルーティングパートナに更新メッセージを送信することができる。更新メッセージ（更新要求と更新応答との両方）には、送信するノードの近傍ノードライブネス情報（例えば、当該のすべての近接近傍の）を含めることができる。この送信されるライブネス情報には、送信側のライブネス情報のそれをも含めることができる。更新メッセージは、ルーティングパートナノードを周期的に更新するためにノードによって始められるルーティングされるメッセージとすることができる。アプリケーションデータを、更新メッセージにピギーバックすることができ、アプリケーションデータを、ルーティングパートナ更新中に伝搬できるようになる。メッセージ宛先には、所望のルーティングインデックスでの完全なルーティングパートナのアイデンティティがセットされる。このメッセージのＭｅｓｓａｇｅ ＩＤプロパティには、このメッセージを処理するノード（１つまたは複数）が最新のメッセージを判定できるようにするためにアプリケーションシーケンス番号が割り当てられ、このメッセージは、近接的にルーティングされる。
【０１５８】
更新メッセージを受信するノードは、更新応答を応答することができる。更新応答は、データが応答するノードの展望からであることを除いて、更新メッセージと同一のデータを担持する。更新メッセージおよび更新応答の交換を介して、ノードは、ルーティング情報を交換することができる。時々、動作するノードは、ルーティングパートナを更新することができる。
【０１５９】
時々、動作するノードは、ｐｉｎｇメッセージ（例えば、ｐｉｎｇメッセージ１６０９および１６１１）を送信することもできる。ｐｉｎｇメッセージは、ノードのプレゼンスを周期的にアナウンスし、その近傍／ルーティングノードおよび複製（例えば、ピギーバックされた）アプリケーションデータに関してその近傍内で情報を散布するために、ノードによって送信される一方向メッセージである。
【０１６０】
起点ノードは、その直接先行する近傍ノードおよび直接後続する近傍ノードのうちの１つまたは複数にｐｉｎｇメッセージを送信することができる。したがって、ｐｉｎｇ分布パターン（すなわち、どのノードがｐｉｎｇメッセージを送信されるか）に応じて、起点ノードに関係する情報は、リング上で起点ノードの近傍内の他のノードに伝搬される。例えば、起点ノードは、その直接先行ノードおよび直接後続ノードだけにｐｉｎｇメッセージを送信することができ、このｐｉｎｇメッセージは、起点ノードの位置（ノードＩＤ）からリングに沿って両方向で起点の近傍の縁まで外向きに伝搬する。あるいは、起点ノードは、先行物方向と後続物方向との両方でｎ個おきのノードにｐｉｎｇメッセージを送信することができる。
【０１６１】
ｐｉｎｇメッセージを受信する各ノードは、近傍範囲の展望から、そのノードの起点ノードへの関心をチェックする。関心がない場合には、そのノードは、ｐｉｎｇメッセージを破棄する。関心がある場合には、そのノードは、ｐｉｎｇメッセージを処理し、ｐｉｎｇメッセージの転送が起点ノードの近傍に制約されている場合には指定されたｐｉｎｇパターンに従って、ｐｉｎｇメッセージを転送する。例えば、ｐｉｎｇメッセージを処理した後に、受信ノードは、送信ノードおよび起点ノードが先行ノードセット内にある場合には少なくともその後続ノードに、送信ノードおよび起点ノードが後続物セット内にある場合には少なくともその先行ノードに、ｐｉｎｇメッセージを転送することができる。
【０１６２】
したがって、ｐｉｎｇメッセージの外向きの伝搬は、そのメッセージが起点ノードの周囲にセットされた近傍ノードの縁に達するときに停止する。ｐｉｎｇメッセージのＭｅｓｓａｇｅ ＩＤプロパティには、このメッセージを処理するノードが起点ノードからの最新のメッセージを判定し、重複処理を回避するか他の形で不必要な転送を回避することを可能にするために、アプリケーションシーケンス番号が割り当てられる。
【０１６３】
戻って図１６を参照すると、ｐｉｎｇメッセージ１６０９を、近傍ノードから機能レイヤ１６５１で受信することができる。アプリケーションデータ１６１２（例えば、名前空間サブスクリプション）を、ｐｉｎｇメッセージ１６０９内にピギーバックすることができる。機能レイヤ１６５１は、ｐｉｎｇメッセージに含まれるすべてのアプリケーションデータについてアプリケーションレイヤ１６５２に知らせることができる。同様に、機能レイヤ１６５１は、Ｓｙｎｃ要求メッセージに含まれるすべてのアプリケーションデータについてアプリケーションレイヤ１６５２に知らせることができる。移転のこれらのケースの両方を、アプリケーションデータ１６１２を含む近傍状態ｓｙｎｃイベント１６０３をアプリケーションレイヤ１６５２に送ることを介して達成することができる。
【０１６４】
ある機能レイヤイベント（例えば、受信されたｐｉｎｇメッセージ１６０９）に応答して、機能レイヤ１６５１は、近傍状態要求１６０４をアプリケーションレイヤ１６５２に送ることができる。近傍状態要求１６０４は、アプリケーションレイヤ１６５２に対して、オプションで近傍内で伝搬される必要がある状態を入手するために呼び出される。近傍状態要求１６０４に応答して、アプリケーションレイヤ１６５２は、オプションのアプリケーションデータ１６０７を含む近傍状態１６０６を機能レイヤ１６５１に返すことができる。機能レイヤ１６５１は、オプションのアプリケーションデータ１６０７を含むｐｉｎｇメッセージ１６１１を送信して、近傍およびルーティングパートナノードライブネス情報ならびにオプションのアプリケーションレイヤ近傍状態を伝搬させることができる。機能レイヤ１６５１は、オプションのアプリケーションデータ１６０７を含むｓｙｎｃ応答１６０８を送信して、アプリケーション状態を伝搬させることもできる。
【０１６５】
（離脱プロトコル）
ノードがフェデレーションから離脱することが適当であるときに、そのノードは、フェデレーションから正常に除去されるためにＤｅｐａｒｔ関数を実施することができる。ノードは、その直接に近接する先行ノードおよび後続ノードのうちの１つまたは複数と、おそらくは同一の近接近傍内の他のノードとに離脱メッセージを送信することによって既存フェデレーションから離脱する。したがって、離脱分布パターン（すなわち、どのノードが離脱メッセージを送信されるか）に応じて、離脱するノードに関係する情報は、リング上で離脱するノードの近傍内の他のノードに伝搬される。離脱メッセージは、正常に離脱するノードの差し迫った離脱についてその近接近傍のうちの少なくとも１つの中の１つまたは複数の他のノードに知らせるために、その正常に離脱するノードによって始められる一方向メッセージである。離脱するノードは、ｐｉｎｇメッセージの伝搬に似た形で、離脱メッセージを伝搬させる（例えば、近傍内で）。例えば、ＩＤ３０を有するノードは、ＩＤ１７および４０を有するノードに離脱メッセージ１２１９を送信することができる。次に、ＩＤ３０を有するノードは、所与の近接リングの観点から、フェデレーションインフラストラクチャからそれ自体を除去することができる。ノードが、１つの近接近傍からそれ自体を除去するが、それが属する可能性がある他の近接近傍からは除去しないことが可能であることに留意されたい。
【０１６６】
ＩＤ１７および４０を有するノード（すなわち、先行ノードおよび後続ノード）が、ＩＤ３０を有するノードが除去された後にＩＤ３０に最も近いノードになる可能性が高いので、ＩＤ１７および４０を有するノードは、ＩＤ３０を有するノードの離脱を知らされる。したがって、ＩＤ３０に送達されるべき将来のメッセージを、ＩＤ１７および４０を有するノードで適当に処理することができる。ＩＤ１７および４０を有するノードは、ＩＤ３０を有するノードの離脱をリング１２０６上の他のノードに伝搬させることができる。ＩＤ３０を有するノードがない状態で、ＩＤ１７および４０を有するノードは、潜在的にお互いをポイントする、先行物ポインタおよび後続物ポインタを再計算することもできる。
【０１６７】
離脱メッセージのＭｅｓｓａｇｅ ＩＤプロパティは、離脱メッセージを処理するノードが起点ノードによって送信された一連のｐｉｎｇメッセージおよび離脱メッセージの中で最新のメッセージを判定することを可能にするために、Ｐｉｎｇメッセージと同一のアプリケーションシーケンスＩＤを割り当てられる。フェデレーション近接リングからの正常な離脱は、オプションであるが推奨される。しかし、フェデレーションは、ノードが突然に去る場合に自己修復するように設計される。
【０１６８】
（ライブネス）
フェデレーションの寿命中に、ノードは、フェデレーションを維持するためにライブネス情報を交換することができる。ライブネス情報は、ライブネスメッセージヘッダの形で、フェデレーション内で交換される事実上すべてのメッセージに含めることができる。例えば、参加メッセージ、参加応答、ｓｙｎｃメッセージ、ｓｙｎｃ応答、更新メッセージ、更新応答、アプリケーション固有メッセージ、ライブネスメッセージ、およびｐｉｎｇメッセージは、すべてがライブネス情報ヘッダを含むことができる。フェデレーションノードが、メッセージまたは応答を送信するときに、そのノードは、他のノードによる処理のためにライブネス情報を含めることができる。ライブネス情報を、ライブネスメッセージのライブネス情報ヘッダに含めることができる。
【０１６９】
あるノードのライブネス状態を示すライブネス情報は、次のプロパティを使用して表すことができる。 
［Ｎｏｄｅ］：そのライブネス情報が表されているノードを識別する。ノードは、［Ｉｎｓｔａｎｃｅ ＩＤ］をさらに含む［Ｒｅｆｅｒｅｎｃｅ Ｐｒｏｐｅｒｔｉｅｓ］に基づいて識別することができる。 
［Ｒｅｆｅｒｅｎｃｅ Ｐｒｏｐｅｒｔｉｅｓ］：ＷＳ−ａｄｄｒｅｓｓｉｎｇ仕様で指定された要素情報アイテム。ＷＳ−ａｄｄｒｅｓｓｉｎｇは、参照プロパティセット内に含めるために［Ｉｎｓｔａｎｃｅ ＩＤ］参照プロパティを定義する。 
［Ｉｎｓｔａｎｃｅ ＩＤ］：ノードの特定のインスタンスを識別する数。増加するブートカウントを、ノードのインスタンスＩＤとして使用することができる。 
［Ｐｈａｓｅ］：識別されたノードのフェーズを伝える。 
［Ｐｈａｓｅ−Ｓｔａｔｅ Ｖａｌｕｅ］ 示されたノードインスタンスが達成したことがわかっている最高のフェーズ状態（挿入中、同期化中、ルーティング中、動作中）を伝える。 
［Ｐｈａｓｅ．Ｕｎｋｎｏｗｎ Ｉｎｄｉｃａｔｉｏｎ］ 現在のフェーズが既知であるか未知であるかを伝えるインジケータ。 
［Ｆｒｅｓｈｎｅｓｓ］：情報の新しさを伝え、その値は、０からＭａｘＦｒｅｓｈｎｅｓｓまでの範囲にわたる。この値が大きいほど、情報はより新しく、０は、情報がないことを暗示し、ＭａｘＦｒｅｓｈｎｅｓｓは、プロトコル定義の定数である。 
［Ｃｏｌｏｒ］：ノードが属する近接同等性クラスを識別する。同一のカラー値の２つノードは、必ず、近接的に最も近いと考えられる。というのは、それらの両方が、カラー値によって識別される同一の同等性クラスに属するからである。近接同等性クラスの個数は、より多くのノードがフェデレーションに参加するので、経時的に増加する可能性がある。 
［Ｗｅｉｇｈｔ］：ノード機能メトリックを供給し、その値は、０からＭａｘＷｅｉｇｈｔまでの範囲にわたる。これは、高い計算能力、高いネットワーク帯域幅、および長いアップタイムなど、フェデレーションノードの望ましい特性を測定する。この値が大きいほど、ノードの能力が高く、パートナーシップの展望からそのノードがより望ましいものになる。
【０１７０】
いくつかの環境で、あるノードの［Ｎｏｄｅ］プロパティおよび［Ｆｒｅｓｈｎｅｓｓ］プロパティは、［Ｏｒｉｇｉｎ］メッセージヘッダおよび［Ｓｅｎｄｅｒ］メッセージヘッダなどのより大きいスコープ内で暗黙または明示的のいずれかで伝えられ、したがって、ライブネスヘッダへの上記プロパティの包含は、重複になる。例えば、メッセージの送信側は、その現在のフェーズ、カラー、および重み情報をそのＩＤとして伝えることだけが必要であり、Ｉｎｓｔａｎｃｅ Ｉｄは、メッセージアドレッシングヘッダ内で供給され、Ｆｒｅｓｈｎｅｓｓは、暗示される。
【０１７１】
ライブネス状態には、次のように定義される「＜」バイナリ関係に基づいて、少なくとも半順序を付けることができる。 
「Ｌ１＜Ｌ２」は、
１．「Ｌ１．［Ｎｏｄｅ］．［Ｎａｍｅ］＝＝Ｌ２．［Ｎｏｄｅ］．［Ｎａｍｅ］」が真であり、テストがリストされた順序で実行され、省略される状態で次のうちの１つが真である
【０１７２】
【表４】
0005498594.tif 000005
【０１７３】
２．または、「Ｌ１．［Ｃｏｌｏｒ］＝＝Ｌ２．［Ｃｏｌｏｒ］」が真であり、テストがリストされた順序で実行され、省略される状態で次のうちの１つが真である
【０１７４】
【表５】
0005498594.tif 000006
【０１７５】
場合に真である。
【０１７６】
さらに、ライブネス「ダウン」メッセージを、指定されたノードが使用不能になった（例えば、ダウンした）ことが検出されるか疑われるときに、その指定されたノードに送信することができる。例として、アプリケーションレイヤ（例えば、アプリケーションレイヤ１２１）が、別のアプリケーションレイヤ（例えば、アプリケーションレイヤ１２３）またはその別のアプリケーションレイヤをホストするノードがダウンしていることを検出するときに、検出するアプリケーションレイヤは、例えば、メッセージモデルおよび関係する処理モデル１６００および／または１７００に従って、そのノードがダウンしていることを他の下位レイヤ（例えば、他の下位レイヤ１３１）に通知することができる。そのような通知は、例えば、機能レイヤ１６５１などの他の下位レイヤに、ライブネスダウンメッセージを送信させることができる。これは、ライブネスダウンメッセージの生成に関する刺激の１つの例にすぎない。
【０１７７】
ライブネスダウンメッセージは、ルーティングされ、したがって、ダウンしていると疑われるノードに最も近いノードに送達されるので、指定されたノードのライブネスダウンメッセージが指定されたノードに戻って送達される場合には、指定されたノードが一度もダウンしていないか、指定されたノードが異なるインスタンスである（例えば、異なるインスタンスＩＤを有する）かのいずれかである。その一方で、ライブネスダウンメッセージが、別のノードに送達される場合には、これは、指定されたノードがダウンしているように見えることを示す。したがって、ライブネスダウンメッセージを受信するノードが、それ自体を指定されたノードの近接近傍内にあるとみなす場合に、そのノードは、説明されたようにその近接近傍に指定されたノードの離脱メッセージをソーシングすると同時に、指定されたノードがダウンしている可能性があることおよび受信するノードがその置換であることをそのアプリケーションレイヤに（例えば、Ｎｏｄｅ Ｄｏｗｎ １７０４を使用して）示すことができる。指定されたノードのライブネスダウンメッセージを、そのターゲットＩＤにダウンしている可能性があるノードのＩＤをセットして、近接的にルーティングすることができる。
【０１７８】
（バランシングプロシージャ）
本発明の実施形態は、短い期間のうちにフェデレーションに参加し、離脱する多数のノードに対処するように設計されている。そのようなネットワーク内の変化は、様々なノードで維持される対数検索ツリーがアンバランスになる場合にルーティング遅延を引き起こす可能性がある。すなわち、リングの片側に反対側より多数のノードがある場合である。最適のルーティング効率を容易にするために、フェデレーションに参加するノードは、ある判断基準が満足されるときにバランシングプロシージャを実行する。
【０１７９】
例えば、次の条件のいずれかが真であるときに、任意のノードが、最適のルーティング効率のためにバランスをとられたルーティングテーブルを保証するためにバランシングプロシージャを実行することができる。 
・構成された個数の上記ライブネスメッセージが受信された。
・最後の上記ライブネスメッセージの受信以降に構成された長さの時間が経過した。
・いくつかの新しいノードが到着したまたはいくつかの既存ノードが離脱したという意味で近傍が変化した。
【０１８０】
ルーティングテーブルのバランシングは、単純なプロセスである。例えば、アンバランスなルーティングテーブルを有するノードは、参加プロトコルの同期化フェーズ状態およびルーティングフェーズ状態を再実行することができる。
【０１８１】
１）ある数に最も近いルーティングノードを見つけること、２）フェデレーションを正常に去るノードが従う離脱プロトコル、および３）ライブネスメッセージを受信するノードが従うバランシングプロシージャと組み合わされた行為ＲＰ２ｂ、ＲＰ２ｄ、およびＲＰ４は、フェデレートするノードが比較的すばやく多数でネットワークに参加し、離脱するときに、より高速に修復するシステムをもたらす。
【０１８２】
（状況メッセージ）
状況メッセージは、送信側ノードが以前に受信側ノードに転送した相関するメッセージのルーティング成功／失敗を知らせるために送信側ノードによって受信側ノードに送信される、ルーティングされないメッセージである。図１８に、要求−応答メッセージ交換パターンの一部を形成するメッセージがリング上のノードにまたがってどのようにルーティングされるかの一例を示す。状況メッセージは、そのルーティング状況が報告されつつあるオリジナルの相関されたメッセージを識別するヘッダを含むことができる。したがって、状況メッセージをノードの間で使用して、メッセージがあるノードから次のノードに成功してルーティングされたことを示すことができる。例えば、ノード１８０１からノード１８０６への要求メッセージ１８１１のルーティングは、ノード１８０２、１８０３、１８０４、および１８０５を介して要求１８１１を送信することを含む。対応するカスケードする成功状況メッセージ（状況１８１７、１８１８、１９１９、１８２０、および１８２１）を、それぞれ、ノード１８０６からノード１８０５へ、ノード１８０５からノード１８０４へ、ノード１８０４からノード１８０３へ、ノード１８０３からノード１８０２へ、およびノード１８０２からノード１８０１へ送信することができる。要求１８１１に応答して、応答１８１６を、ノード１８０６からノード１８０１へエンドツーエンドで送信することができる。応答１８１６は、オプションであり、一方向メッセージ交換パターンには存在しない場合がある。
【０１８３】
図１３に、ノードがフェデレーションインフラストラクチャに参加する方法１３００の一例の流れ図を示す。方法１３００を、図１２Ａおよび１２Ｂのリング１２０６に関して説明する。方法１３００は、参加メッセージをフェデレーションインフラストラクチャに発行する行為（行為１３０１）を含む。例えば、ＩＤ１４４を有するノードは、リング１２０６を含むフェデレーションインフラストラクチャに参加１２０１を発行することができる。方法１３００は、参加するノードから参加メッセージを受信する行為（行為１３０８）を含む。例えば、リング１２０６を含むフェデレーションインフラストラクチャ内の既存ノードが、参加１２０１を受信することができる。
【０１８４】
方法１３００は、参加メッセージを処理ノードにルーティングする行為（行為１３０９）を含む。処理ノードは、参加メッセージがルーティングされつつあるときにフェデレーションインフラストラクチャ内の他のアクティブノードより参加するノードのＩＤに数値的に近いＩＤを有するノードとすることができる。例えば、参加１２０１を、当初にＩＤ６４を有するノードで受信し、ＩＤ１３５を有するノードにルーティングし、ＩＤ１５１を有するノードにルーティングすることができる。
【０１８５】
方法１３００は、参加するノードの１つまたは複数の先行ノードおよび１つまたは複数の後続ノードを計算する行為（行為１３１０）を含む。例えば、ＩＤ１５１を有するノードが、ＩＤ１４４を有するノードの直接の先行ノードおよび直接の後続ノードを計算することができる。リング１２０６内で、ＩＤ１５１を有するノードは、ＩＤ１３５を有するノードが直接の先行ノードであり、ＩＤ１５１を有するノードが直接の後続ノードであることを計算することができる。類似する計算を、他の近接リングについて行うことができる。
【０１８６】
方法１３００は、参加するノードの１つまたは複数のルーティングノードを計算する行為（行為１３１１）を含む。例えば、ＩＤ１５１を有するノードが、ＩＤ１４４を有するノードのルーティングノードを（ＩＤ１５１を有するノードの展望から）計算することができる。リング１２０６内で、ＩＤ１５１を有するノードが、例えば、ＩＤ２１８および４０を有するノードがＩＤ１４４を有するノードのルーティングノードであることを計算することができる。類似する計算を、他の近接リングについて行うことができる。
【０１８７】
方法１３００は、参加するノードに参加応答を送信する行為（行為１３１２）を含む。参加応答は、フェデレーションインフラストラクチャの現在のビューを与えられて処理ノードによって計算された、参加するノードのすべての先行近傍ノードおよび後続近傍ノードとルーティングパートナノードとを識別することができる。例えば、参加応答１２０２は、少なくともＩＤ１４４を有するノードの直接の先行ノードとしてＩＤ１３５を有するノードを識別することができ、ＩＤ１４４を有するノードの直接の後続ノードとしてＩＤ１５１を有するノードを識別することができ、ノードＩＤ１４４（新たに参加するノード）のためにＩＤ１５１を有するノードで計算されたすべてのルーティングノード（ＩＤ１４４を有するノードの）を識別することができる。
【０１８８】
方法１３００は、参加メッセージを処理したフェデレーションノードから参加応答を受信する行為（行為１３０２）を含む。例えば、ＩＤ１４４を有するノードが、ＩＤ１５１を有するノードから参加応答１２０２を受信することができる。
【０１８９】
方法１３００は、少なくとも直接の近接先行ノードおよび直接の近接後続ノードのそれぞれにｓｙｎｃ要求を送信する行為（行為１３０３）を含む。例えば、ここで図１２Ｂを参照すると、ＩＤ１４４を有するノードは、ＩＤ１３５および１５１を有するノードにｓｙｎｃ要求１２０３を送信することができる。ｓｙｎｃ要求１２０３は、ＩＤ１４４を有するノードのすべての近傍ノードの識別および／またはＩＤ１４４を有するノードのすべてのルーティングパートナの識別を含むことができる。
【０１９０】
ＩＤ１３５および１５１を有するノードは、ｓｙｎｃ要求１２０３を受信することができる。ｓｙｎｃ要求１２０３の受信に応答して、ＩＤ１３５および１５１を有するノードは、対応するルーティングテーブルからその近傍およびルーティングパートナノードを識別することができる。ＩＤ１３５および１５１を有するノードは、その識別された近傍およびルーティングパートナノードのライブネス情報をｓｙｎｃ応答１２０４に含め、送信ｓｙｎｃ応答１２０４をＩＤ１４４を有するノードに送信することができる。
【０１９１】
方法１３００は、近接先行ノードおよび近接後続ノードのそれぞれからｓｙｎｃ応答を受信する行為（行為１３０４）を含む。例えば、ＩＤ１４４を有するノードは、ＩＤ１３５および１５１を有するノードからｓｙｎｃ応答１２０４を受信することができる。ｓｙｎｃ応答１２０４は、フェデレーションインフラストラクチャ内のリング１２０６または他のリング上の１つまたは複数のノードのライブネス情報を含むことができる。ｓｙｎｃ応答１２０４は、ＩＤ１４４を有するノードのすべての見込みのあるルーティングパートナノードを識別することもできる。
【０１９２】
方法１３００は、近傍ノードを計算する行為（行為１３０５）を含む。例えば、ＩＤ１４４を有するノードは、ＩＤ１３５および１５１を有するノードの近傍ノードの和集合に基づいて、対応する近傍ノードを計算することができる。近傍ノードを、参加応答メッセージおよびすべてのｓｙｎｃ応答メッセージの要約されたビューに基づいて計算することができる。
【０１９３】
方法１３００は、ルーティングノードを計算する行為（行為１３０６）を含む。例えば、ＩＤ１４４を有するノードは、リング１２０６のノードの中からルーティングノードを計算することができる。ルーティングパートナを、参加応答メッセージおよびすべてのｓｙｎｃ応答メッセージの要約されたビューに基づいて計算することができる。
【０１９４】
方法１３００は、少なくとも近傍ノード情報を計算されたルーティングパートナと交換する行為（行為１３０７）を含む。例えば、ＩＤ１４４を有するノードおよびＩＤ２１８を有するノード（計算されたルーティングパートナ）は、それらの各々の近傍ノードに対応する状態情報（例えば、インスタンスＩＤ、フェーズ状態など）を交換することができる。これらの交換は、新たに参加するノードが、上のルーティング中フェーズ状態で説明したように少なくとも各一意の計算されたルーティングパートナに更新メッセージをソーシング（ルーティング）することによって達成される。更新メッセージを処理するノードは、新たに参加するノードからの更新メッセージの受信に応答して、対応する更新応答メッセージを送信する。更新応答は、少なくとも、それ自体およびその近傍ノードのライブネス情報を含む。
【０１９５】
方法１３００は、少なくとも１つの近傍ノードへのルーティングテーブルの初期伝搬を開始する行為をも含めることができる。例えば、ＩＤ１４４を有するノードは、ｐｉｎｇメッセージに計算された近傍ノードおよびルーティングパートナノードを含め、そのｐｉｎｇメッセージをＩＤ１７４を有するノード（例えば、計算された近傍ノードのうちの１つ）に送信することができる。ＩＤ１７４を有するノードは、このｐｉｎｇメッセージを受信し、ＩＤ１４４を有するノードで始められたライブネス情報を用いて、対応するルーティングテーブルを更新することができる。ＩＤ１７４を有するノードは、第２のｐｉｎｇメッセージにその対応するルーティングテーブルを含め、ある将来の時点でこの第２のｐｉｎｇメッセージをＩＤ１４４を有するノードに送信することもできる。ＩＤ１４４を有するノードは、この第２のｐｉｎｇメッセージを受信し、この第２のｐｉｎｇメッセージに含まれるライブネス情報内のノード（すなわち、ＩＤ１７４を有するノードのルーティングテーブル内のノード）を用いてその対応するルーティングテーブルを更新することができる。ＩＤ１４４を有するノードは、リング１２０６内の他の近傍ノードに関してｐｉｎｇメッセージの送信を繰り返すことができる。
【０１９６】
新たに参加するノードがフェデレーションに参加するときに、新たに参加するノードが、既存のフェデレーションメンバを見つけることができず、したがって単独のメンバになる場合があることを理解されたい。したがって、新たに参加するノードに割り当てられる先行ノード、後続ノード、または近傍ノードがない場合がある。したがって、この新たに参加するノードは、すべてのケースで最良のルーティングパートナとしてマッピングされる。
【０１９７】
さらに、方法１３００を、単一のリング（リング１２０６）に関して説明したが、いくつかの実施形態で、あるリングに参加するノードが、本質的に、１つまたは複数の他のリングにも参加することを理解されたい。例えば、図５に戻って簡単に参照すると、リング５５１に参加するノードは、本質的に、リング５４３、５３１、５２２、５１１、および５０１にも参加する。したがって、方法１３００を、複数のリングに参加するために実施することができる。他の実施形態では、方法１３００の行為の一部またはすべてを、複数のリングに参加するときに繰り返すことができる。例えば、もう一度図５を参照すると、方法１３００の行為のうちの１つまたは複数を、ノードがリング５５１とリング５１４との両方に参加するときに（例えば、エイリアシング）、繰り返すことができる。どの場合でも、参加するノードのＩＤにアクセスし、これを使用して、ソートされたリンクリストならびに参加するノードが参加しようとしている対応する階層的にパーティショニングされたサブリスト内で、その参加するノードを識別することができる。受信ノードは、ソートされたリンクリストおよび各パーティショニングされたサブリストから識別される。参加メッセージは、ソートされたリンクリストおよび各パーティショニングされたサブリスト内の処理ノードにルーティングされる（例えば、ＩＤに基づいて）。参加応答は、ソートされたリンクリストおよび各パーティショニングされたサブリスト内の処理ノードから受信される。
【０１９８】
図１４に、ノードがフェデレーションインフラストラクチャ内でメンバシップを維持する方法１４００の一例の流れ図を示す。方法１４００を、リング１２０６に関して説明する。方法１４００は、近傍ノードに第１のｐｉｎｇメッセージを送信する行為（行為１４０１）を含む。第１のｐｉｎｇメッセージは、第１のｐｉｎｇメッセージを送信する現行ノードが近傍ノードの近傍であることを示す。第１のｐｉｎｇメッセージは、現行ノードのルーティングパートナおよび近傍ノードの状態をも含むことができる。例えば、ＩＤ１４４を有するノードが、ＩＤ１５１を有するノードにｐｉｎｇメッセージを送信することができる。第１のｐｉｎｇメッセージ受信したときに、ＩＤ１５１を有するノードは、ＩＤ１４１を有するノードがＩＤ１５１を有するノードの近傍であることを知らされる。ノード１５１は、この行為の副次的効果として、ノード１４４からより新しいライブネス情報（リング１２０６上の他のノードの）を発見することもできる。
【０１９９】
ｐｉｎｇメッセージを、例えば、ｐｉｎｇメッセージがそこに送信される近接リングに関連する構成状態に基づいて、指定された頻度で周期的に繰り返すことができる。この頻度は、構成状態に依存して変化し得る。例えば、ＷＡＮについて指定されるｐｉｎｇ頻度を、ＬＡＮについて指定される頻度と異なるものとすることができる。ｐｉｎｇメッセージを、ｐｉｎｇ分布パターンに従って送信することもできる。始めるノードのｐｉｎｇ分布パターンは、ｐｉｎｇメッセージがリング上で両方向で近傍ノードに送信されなければならないことを示すことができる。例えば、ＩＤ１４４を有するノードは、ＩＤ１３５を有するノードの方向とＩＤ１５１を有するノードの方向との両方でｐｉｎｇを送信することができる。ｐｉｎｇ分布パターンおよび頻度は、変更することができる。例えば、近接リングごとに変更することができる。
【０２００】
方法１４００は、近傍ノードから第２のｐｉｎｇメッセージを受信する行為（行為１４０２）を含む。第２のｐｉｎｇメッセージは、少なくとも、第２のｐｉｎｇメッセージを生み出す近傍ノードが現行ノードの近傍であることを現行ノードに示す。第２のｐｉｎｇメッセージは、当該生み出す近傍ノードのルーティングパートナおよび近傍ノードの状態をも含むことができる。例えば、ＩＤ１５１を有するノードが、ＩＤ１４４を有するノードに第２のｐｉｎｇメッセージを送信することができる。この第２のｐｉｎｇメッセージを受信したときに、ＩＤ１４４を有するノードは、ＩＤ１５１を有するノードがＩＤ１４４を有するノードの近傍であることを知らされる。この第２のｐｉｎｇメッセージは、リング１２０６上の他のノードのライブネス情報をも含むことができる。したがって、一般に、ｐｉｎｇメッセージを、近傍内で交換することができ、近傍メンバシップ（近接メンバシップごとに）およびフェデレーション内のノードプレゼンスの近似された共通の近傍ビューを維持するのに使用することができる。
【０２０１】
受信されたｐｉｎｇメッセージを、周期的に繰り返す／ｐｉｎｇが生み出された（生み出すノードによって送信された）近接近傍内の他のノードに転送することができる。転送されるｐｉｎｇメッセージを、ｐｉｎｇ分布パターンに従って送信することもできる。転送するノードのｐｉｎｇ分布パターンは、ｐｉｎｇメッセージが、生み出すノードから離れる方向で近傍ノードに送信されなければならないことを示すことができる。例えば、ＩＤ１５１を有するノードは、ＩＤ１４４を有するノードで生み出すｐｉｎｇをＩＤ１７４を有するノードの方向で転送することができる。ｐｉｎｇ転送分布パターンは、例えば、近接リングごとに変更することができる。
【０２０２】
ノードを、対応するインターバルでｐｉｎｇメッセージを受信するように構成することができる。期待されるｐｉｎｇメッセージが受信されないときに、ノードは、通信障害を解釈し、期待されるが少なくとも遅れたｐｉｎｇメッセージを生み出さなければならなかったノードについて、別のノードのｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎに真をセットすることができる。
【０２０３】
方法１４００は、完全なルーティングノードに更新要求メッセージを近接ルーティングする行為（行為１４０３）を含む。この更新要求メッセージは、そのようなルーティングされた更新要求を受信するルーティングノードに、現行ノードが受信するルーティングノードのルーティングパートナとして参加しようとしていることを示す。この更新要求メッセージは、少なくとも現行ノードの近傍ノードのアイデンティティをも（例えば、ライブネス情報の形で）含む。例えば、ＩＤ１４４を有するノードは、更新メッセージ１２１６を、ＩＤ２０８を有するノード（１４４から６４だけオフセットされた完全なルーティングパートナ）にルーティングすることができる。ノード２１０（以前に計算されたルーティングノード）は、２０８に最も近いので、このルーティングされた更新要求を受信し、処理する。更新メッセージ１２１６を受信したときに、ＩＤ２１０を有するノードは、ＩＤ１４４を有するノードがＩＤ２１０を有するノードのルーティングパートナであることを知らされる（または強化される）。
【０２０４】
方法１４００は、処理する（受信する）ルーティングノードから更新応答メッセージを受信する行為（行為１４０４）を含む。この更新応答は、処理するルーティングノードが現行ノードのルーティングパートナとして参加しようとしていることを現行ノードに示す。この更新応答メッセージは、少なくとも処理するルーティングパートナの近傍ノードのアイデンティティをも含む。例えば、ＩＤ２１０を有するノードは、ＩＤ１４４を有するノードに更新応答１２０７を送信することができる。更新応答１２０７を受信したときに、ＩＤ１４４を有するノードは、ＩＤ２１０を有するノードがＩＤ１４４を有するノードのルーティングパートナであることを知らされる。
【０２０５】
方法１４００は、現行ノードおよび近傍ノードが近傍として参加しようとしていることと、現行ノードおよび近傍ノードがルーティングパートナとして参加しようとしていることとを示すためにノード情報を適宜更新する行為をも含むことができる。例えば、ＩＤ１４４を有するノードは、ＩＤ１４４および１４１を有するノードが（近接）近傍に参加しようとしていることを示すためにＩＤ１５１を有するノードに対応するノード情報を更新することができる。同様に、ＩＤ１４４を有するノードは、ＩＤ１４４および２１０を有するノードがルーティングパートナとして参加しようとしていることを示すために、ＩＤ２１０を有するノードに対応するノード情報を更新することができる。
【０２０６】
いくつかの実施形態で、指定されたノードＸで保存されるアプリケーション状態は、信頼できるフラッディングプロトコルを使用してそのＮｅｉｇｈｂｏｒｈｏｏｄ（Ｘ）ノードの間で複製される。アプリケーション状態内の各アイテムは、割り当てられたオーナーを有し、このオーナーは、そのアイテムを作成したエンドポイントとすることができる。アプリケーション状態内の各アイテムは、そのオーナーによって与えられる関連するタイムスタンプ（別名シーケンス番号）をも有する。タイムスタンプは、次の少なくとも３つのコンポーネントを有する。 
○ 所有するエンティティのインスタンスＩＤ（例えば、未割り当ての整数）。少なくとも単調に（＞１）増加しなければならない
○ オーナーによって生成された特定のシーケンスを識別するシーケンスＩＤ（例えば、ＵＲＩ）。このコンポーネントは、同一のオーナーが複数の独立のシーケンスを生成することを可能にする
○ 識別されたアプリケーションシーケンスＩＤ内のオフセットを識別する序数（例えば、未割り当ての整数）。
【０２０７】
アイテムタイムスタンプは、＜インスタンスＩＤ、シーケンスＩＤ、およびオフセット＞の３つ組を用いて少なくとも半順序を生成するので、複製中に対応するアイテムに関連する最新情報を検出するのに使用される。複製されるアイテムに関連するタイムスタンプは、最新のアイテムを検出するために、ローカルタイムスタンプが存在する場合にそのローカルタイムスタンプと比較される。アイテムタイムスタンプは、作成／更新／削除動作の等羃セマンティックスをサポートするのにも使用される。例えば、あるノードが、アプリケーション状態内の既存アイテムを更新する要求を受信するときに、その更新は、更新要求に関連するタイムスタンプがローカルアイテムに関連するタイムスタンプより新しい場合に限って受け入れられる。ベクトルタイムスタンプに基づく衝突解決技法を、アイテムを単一のオーナーに割り当てることができない場合に利用することができる。アプリケーション状態複製は、フォールトトレランスを実現し、近傍ノードにまたがるロードバランシング要求を容易にする。
【０２０８】
オプションの挙動として、（起点）他のパートナ（ルーティングおよび／またはパートナ）ノードから期待される更新またはｐｉｎｇを検出しない（ある時間期間の後に）ノードは、フェーズ状態を未知と考え、ｐｈａｓｅ．ｕｎｋｎｏｗｎ表示に真をセットし、これをそのようなものとして他のサードパーティノードに報告することができる。言い換えると、更新およびｐｉｎｇの周期的生成を要求することができる。この要件および実際のタイムアウト値は、様々な近接リングの属性とすることができる。例えば、あるリングが、いくつかのサブリング（例えば、ＬＡＮセグメント内）についてより厳密なタイミング要件を有することができ、障害検出／報告は、比較的すばやい。その一方で、あるリングが、他のサブリング（例えば、インターネット上）についてより厳密でないタイミング要件を有することができ（あるいは、タイミング要件を有しないことすらでき）、先を見越したノード障害検出／報告は、比較的長い（または存在しない）。
【０２０９】
図１５に、別のノードのライブネス情報を発見する方法１５００の一例の流れ図を示す。方法１５００を、図１２Ａおよび１２Ｂのリング１２０６に関して説明する。一般に、例えば、ｓｙｎｃ １２０３、ｓｙｎｃ応答１２０４、更新１２１６、更新応答１２０７などの任意のメッセージに、少なくとも１つのライブネスヘッダを含めることができる。いくつかの実施形態で、ライブネスヘッダは、あるノードの＜ノードＩＤ、インスタンスＩＤ、フェーズ［ｐｈａｓｅ−ｓｔａｔｅ ｖａｌｕｅ］．［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、フレッシュネス値、カラー（近接）値、および重み値＞を含む。他の実施形態では、ライブネスヘッダは、＜フェーズ［ｐｈａｓｅ−ｓｔａｔｅ ｖａｌｕｅ］．［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、フレッシュネス値、カラー（近接）値、および重み値＞を含む。これらの他の実施形態では、ライブネスヘッダを使用して、既に送信側および起点ノードのノードＩＤおよびインスタンスＩＤを含むアドレッシングヘッダを増補することができる。アドレッシングヘッダは、既にノードＩＤおよびインスタンスＩＤを含むので、この情報を、ライブネスヘッダから省略することができる。
【０２１０】
方法１５００は、フェデレーションインフラストラクチャに参加するノードの状態情報を表すライブネスヘッダを受信する行為（行為１５０１）を含む。ライブネスヘッダは、少なくとも、受信された参加するノードのＩＤ、受信されたノードのインスタンスＩＤ、受信されたフェーズ値、および受信されたフレッシュネス値を含む。例えば、ＩＤ１４４を有するノードは、ＩＤ１５１を有するノードからｓｙｎｃ応答１２０４内で第１ライブネスヘッダを受信することができる。第１ライブネスヘッダは、ＩＤ１７４を有するノードの＜参加するノードのＩＤ、インスタンスＩＤ、フェーズ値［ｐｈａｓｅ−ｓｔａｔｅ ｖａｌｕｅ］．［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、フレッシュネス値、カラー（近接）値、および重み値＞を含むことができる。フェーズ状態値（例えば、Ｉｎｓｅｒｔｉｎｇ、Ｓｙｎｃｉｎｇ、Ｒｏｕｔｉｎｇ、Ｏｐｅｒａｔｉｎｇ）は、第１フレッシュネス値のときのＩＤ１７４を有するノードの表されたフェーズを識別する。フェーズ値（例えば、フェーズ状態：［Ｉｎｓｅｒｔｉｎｇ，Ｓｙｎｃｉｎｇ，Ｒｏｕｔｉｎｇ，Ｏｐｅｒａｔｉｎｇ］、およびｐｈａｓｅ．ｕｎｋｎｏｗｎ）は、第１フレッシュネス値によって識別されるときのＩＤ１７４を有するノードの表されたおよび／または検出されたフェーズ情報を識別する。
【０２１１】
しかし、フレッシュネス値を、通信遅延に起因して割引して考えることができる。フレッシュネス値が、時間の経過に伴って減衰することもできる。フレッシュネス値の減衰曲線は、異なるフェーズ状態（未知を含む）について異なるものとすることができる（また、線形または対称ではないものとすることができる）。したがって、異なるノードフェーズにまたがって、フレッシュネス値の減衰を、非線形および／または非対称とすることができる。
【０２１２】
方法１５００は、現行ノードで維持される参加するノードの、少なくとも現行インスタンスＩＤ、現行フェーズ値、および現行フレッシュネス値にアクセスする行為（行為１５０２）を含む。例えば、ＩＤ１４４を有するノードは、ＩＤ１７４を有するノードの以前に受信され格納されたインスタンスＩＤ、フェーズ値［ｐｈａｓｅ−ｓａｔｅ ｖａｌｕｅ．］［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、およびフレッシュネス値にアクセスすることができる。
【０２１３】
方法１５００は、少なくとも、受信されたインスタンスＩＤ、受信されたフェーズ値、および受信されたフレッシュネス値を、それぞれ現行ノードにある現行インスタンスＩＤ、現行フェーズ値、および現行フレッシュネス値と比較する行為（行為１５０３）を含む。例えば、ＩＤ１４４を有するノードは、ＩＤ１７４を有するノードの以前に受信され格納されたインスタンスＩＤ、フェーズ値［ｐｈａｓｅ−ｓａｔｅ ｖａｌｕｅ．］［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、およびフレッシュネス値を、ライブネスヘッダ内で受信されたインスタンスＩＤ、フェーズ値［ｐｈａｓｅ−ｓａｔｅ ｖａｌｕｅ．］［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、およびフレッシュネス値と比較することができる。
【０２１４】
ＩＤ１４４を有するノードは、（順番に）第１インスタンスＩＤがＩＤ１７４を有するノードの現在格納されているインスタンスＩＤよりより大きいことに基づいて、第１フェーズ状態値がＩＤ１７４を有するノードの現在格納されているフェーズ状態値より進んでいることに基づいて、または第１フレッシュネス値がＩＤ１７４を有するノードについて現在格納されているフレッシュネス値より大きいことに基づいて、ＩＤ１７４を有するノードの現行状態情報（例えば、ＩＤ１５１を有するノードから受信された）が古いことを判定することができる。ＩＤ１４４を有するノードは、フェーズ状態が検出／送信されたときにフェーズ状態が既知であったことを少なくとも１つのｐｈａｓｅ．ｕｎｋｏｗｎ表示（現在格納されているまたはライブネスヘッダ内で受信された、のいずれか）が示すことを判定することもできる。
【０２１５】
方法１５００は、比較に基づいて、参加するノードの状態情報が現行ノードで更新されなければならないかどうかを判定する行為（行為１５０４）を含む。例えば、ＩＤ１７４を有するノードの値の比較に基づいて、ＩＤ１４４を有するノードは、ＩＤ１７４を有するノードの状態情報を更新しなければならないと判定することができる。ＩＤ１７４を有するノードの古い状態情報の更新には、現在格納されている値（例えば、インスタンスＩＤ、フェーズ状態値、ｐｈａｓｅ．ｕｎｋｎｏｗｎ表示、またはフレッシュネス値）を、ライブネスヘッダ内に含まれる値に置換することを含めることができる。例えば、ＩＤ１４４を有するノードは、ＩＤ１７４を有するノードの状態情報を更新して、ＩＤ１７４を有するノードがより進んだフェーズ状態に推移したことを示すことができる。
【０２１６】
いくつかの実施形態で、参加するノードとの通信が失われている可能性があることを検出することができる。例えば、ＩＤ１４４を有するノードは、ＩＤ１５１を有するノードとの通信が失われたことを検出することができる。図１７を簡潔に参照すると、以前のライブネスイベントに関するサブスクリプション１７０１（ＩＤ１５１を有するノードのエンドポイントを有する）に応答して、アプリケーションレイヤ１７５２は、ｅｎｄｐｏｉｎｔ ｄｏｗｎ ｅｖｅｎｔ １７０３（ＩＤ１５１を有するノードのエンドポイントを有する）を機能レイヤ１７５１に送ることができる。これらの実施形態では、そのような検出されたライブネス条件を、最後の既知のフェーズ状態値と一緒に、真をセットされたＰｈａｓｅ．Ｕｎｋｎｏｗｎインジケータを用いてライブネス情報内で示すことができる。
【０２１７】
方法１５００は、さらに、フェデレーションインフラストラクチャ内の第２の異なるノードから第２のライブネスヘッダを含むメッセージを受信する行為を含むことができる。例えば、ＩＤ１４４を有するノードは、第２のライブネスヘッダを含む状況メッセージを受信することができる（ＩＤ１０３を有するノードまたはリング１２０６の他のノードから）。第２のライブネスヘッダは、ＩＤ１７４を有するノードの＜参加するノードのＩＤ、第２のインスタンスＩＤ、第２のフェーズ値［ｐｈａｓｅ−ｓｔａｔｅ ｖａｌｕｅ］．［ｐｈａｓｅ．ｕｎｋｎｏｗｎ ｉｎｄｉｃａｔｉｏｎ］、第２のフレッシュネス値、第２のカラー（近接）値、および第２の重み値＞を含むことができる。第２のフェーズ値（例えば、フェーズ状態：［Ｉｎｓｅｒｔｉｎｇ，Ｓｙｎｃｉｎｇ，Ｒｏｕｔｉｎｇ，Ｏｐｅｒａｔｉｎｇ］およびｐｈａｓｅ．ｕｎｋｎｏｗｎ表示）は、第２のフレッシュネス値のときのＩＤ１７４を有するノードの表された／検出されたフェーズを識別する。
【０２１８】
あるいは、第１ライブネスヘッダの受信の後に、ＩＤ１４４を有するノードが、ＩＤ１７４を有するノードと直接に通信することを試みることができる。通信が成功である場合には、ＩＤ１７４を有するノードは、アドレッシングヘッダ内にノードＩＤおよび第２インスタンスＩＤを有し、＜第２フェーズ値、第２フレッシュネス値、第２カラー（近接）値、および第２重み値＞を含むライブネスヘッダを有するメッセージ（例えば、ｓｙｎｃ応答）を返すことができる。障害が検出される場合には、ＩＤ１４４を有するノードは、内部ライブネス状態変化を生成し（例えば、フレッシュネス＝最大値およびｐｈａｓｅ．ｕｎｋｎｏｗｎ表示＝真）、その状態変化が別のノードから受信されたかのように、その状態変化を処理する。そのような状態変化は、最大のフレッシュネス値を有する。
【０２１９】
方法１５００は、第２インスタンスＩＤ、第２フェーズ値、および第２フレッシュネス値を、それぞれ現行インスタンスＩＤ、現行フェーズ値、および現行フレッシュネス値と比較する行為（行為１５０６）をも含むことができる。例えば、ＩＤ１０３を有するノードから状況メッセージを受信した後に、ＩＤ１４４を有するノードは、（順番に）第２インスタンスＩＤが第１インスタンスＩＤより大きいこと、第２フェーズが第１フェーズ値より進んでいること、または第２フレッシュネス値が第１フェーズ値より大きいことに基づいて、ＩＤ１５１を有するノードの現行状態情報が古いと判定することができる。
【０２２０】
方法１５００は、比較に基づいて、特定のノードの状態情報を更新しなければならないかどうかを判定する行為をも含むことができる。例えば、ＩＤ１７４を有するノードの値の比較に基づいて、ＩＤ１４４を有するノードが、ＩＤ１７４を有するノードの状態情報を更新しなければならないと判定することができる。ＩＤ１７４を有するノードの古い状態情報の更新には、現在格納されている値（例えば、インスタンスＩＤ、フェーズ状態値、ｐｈａｓｅ．ｕｎｋｎｏｗｎ表示、またはフレッシュネス値）を、第２ライブネスヘッダに含まれる値に置換することを含めることができる。例えば、ＩＤ１４４を有するノードは、ＩＤ１７４を有するノードの状態情報を更新して、ＩＤ１７４を有するノードがより進んだフェーズ状態に推移したことを示すことができる。
【０２２１】
いくつかの実施形態で、フェーズ値は、等しいカラー値(color value)のコンテキスト内で比較される。前述のように、１つのノードが複数の近接リングに参加することができる。複数の近接リングへの参加は、より全般的なリングへの参加を暗示するより特定のリングへの参加（共通の背骨に沿った）の結果として発生し得る。例えば、図５に戻り参照すると、リング５３２へのあるノードの参加は、そのノードがリング５２２、５１１、および５０１に参加することをも暗示する。したがって、より特定のリングのカラーは、すべての親近接リングをも表す。また、前述のように、複数の近接リングへの参加は、あるリング内のノードが１つまたは複数の他のリング（潜在的に異なる背骨に沿った）にエイリアス化されるときに発生し得る。例えば、まだ図５を参照すると、リング５３２に参加するノードを、リング５３１に（または、リング５３１、５２２、５１１、および５０１への参加を暗示するリング５４１にさえ）エイリアス化することができる。したがって、あるリング（例えば、リング５３１）のカラーを、別のリング（例えば、リング５３２）のピアカラー（または近接）と見なすことができる。
【０２２２】
あるノードが、エイリアス化された形で複数の近接リングに参加するときには、そのノードのフェーズ値（例えば、フェーズ状態値および／またはｐｈａｓｅ．ｕｎｋｎｏｗｎ表示）が、異なる近接リングの間で異なる、多少の可能性がある。したがって、別のノードの状態情報を受信するノードは、現行状態情報がそのノードおよびカラーについて更新されなければならないかどうかを判定する前に、状態情報（カラー）について対応する近接リングを識別する。例えば、ＩＤ１４４を有するノードは、受信した状態情報を現行状態情報と比較する前に、ＩＤ１７４を有するノードに対応する受信された状態情報の対応する近接リングを識別する。
【０２２３】
適当な近接リングを識別することは、受信されたカラー値を１つまたは複数の現行カラー値と比較することを含むことができる。受信されたカラー値と現行カラー値とが等しいときには、例えば、現行インスタンスＩＤ、現行フェーズ値、および現行フレッシュネス値などの他の状態情報を、例えば、受信されたインスタンスＩＤ、受信されたフェーズ値、および受信されたフレッシュネス値などの対応する受信された状態情報と比較することができる。その一方で、受信されたカラー値と現行カラー値とが異なるときには、さらなる比較は行われない。
【０２２４】
カラー値の間の等しさは、様々な形で生じることができる。例えば、カラー値の間の等しさは、現行カラー値と受信されたカラー値とが同一の近接リング（例えば、リング５３２）を示すときに、生じる可能性がある。さらに、カラー値の間の等しさは、より特定のカラー値が対応する親カラー値（例えば、同一の背骨に沿った別のリング）と比較されるときに、生じる可能性がある。例えば、リング５３２のカラー値をリング５１１（またはリング５２２もしくは５０１）のカラー値と比較することが、等しさをもたらすことができる。したがって、子近接は、親近接であるが、より特定的である。
【０２２５】
したがって、一般に、フェデレーションインフラストラクチャ内の現在の動作ノードは、他のノードとの通信が失われたように見えるときであっても、それらの他のノードの表されたライブネス状態情報および検出されたライブネス状態情報を交換することができる。
【０２２６】
（ブートストラッピング機構）
一般に、ノードがフェデレーションのアクティブメンバになる（例えば、参加する）ためには、ノードは、既にそれが参加するつもりの葉リングのアクティブメンバである少なくとも１つの他のノードと通信しなければならない。この最初の形の通信が使用可能であることを保証するのを助けるために、フェデレーションは、ブートストラッピング機構を利用することができる。ブートストラッピング機構は、他のタイプの通信が葉リングのアクティブメンバを識別できないか、セキュリティ制約が、新たに参加するノードがシードノードなどの特殊なノードのセットのうちの少なくとも１つと最初に通信することを要求するときに、最後の手段として使用することができる。すなわち、他のタイプの通信が失敗するときまたはセキュリティ要件のゆえに、ブートストラッピング機構を使用して、葉リングのアクティブメンバノードを識別することができる。
【０２２７】
いくつかの実施形態で、シードノードは、フェデレーションとの通信をブートストラップするのに使用される。シードノードは、あるタイプのクロス（インター）近接通信の周知の入口点を提供する。シードノードは、インフラストラクチャ障害／回復および全般的なダイナミズムに起因するリングパーティションを修復するのを助ける。各リングは、フェデレーションに基本的なブートストラッピングプロパティを提供するために、少なくとも１つの動作可能なシードノードを有することができる。
【０２２８】
ピアシードノードは、それら自体の間で通信して、近接の少なくともすべてのアクティブシードノードからなるその近接のリング構造（例えば、二重リンクリスト）を維持する。専用のシードノード同期化プロトコルが、各シードノードに少なくともすべての他のシードノードのプレゼンス（アクティブ）状態の総合的知識を与えるのに使用される。アクティブシードノードは、そのホームである近接葉リングならびにその葉リングのすべての他の先祖リングのメンバノードである。したがって、シードノードは、例えば、そのシードノードの葉リングからルートリングへの、近接リングの背骨全体を表すことができる。したがって、シードノードは、これらの近接リングのそれぞれにおける非常に使用可能であり周知のエントリノードとして機能することができる。その結果、シードノードに関するプレゼンス状態を、フェデレーション内の様々な形の通信（例えば、近接間通信）に有用とすることができる。したがって、シードノードは、例えば、参加するノードの周知の「参加ポイント」として働く、セキュアリングオーソリティとして働く、インフラストラクチャパーティションを修復するのを助ける、およびその近接のそれぞれの安定した「エントリノード」として働くなど、複数の特殊なプロパティを提供することができる。
【０２２９】
プレゼンスデータを提供するために、シードノードの到着および秩序だった離脱を、その近接のそれぞれのランデブポイントで安定したエントリノードとして登録することができる。例えば、登録メッセージを、その宛先ＩＤがストリング「Ｐｒｏｘｉｍｉｔｙ：／」のＳＨＡ−１ハッシュである固定ＵＲＩにルーティングすることができる。一実施形態で、安定したエントリノードとして働くシードノードは、この形でそれら自体を登録するが、選択された非シードノードも同一の形で、シードノードについて本明細書で説明するものと同一であるか類似するプロトコルを用いてそれら自体を登録できる、他の実施形態がある。安定したエントリノード（シードノードなど）が登録するときに、安定したエントリノードは、それがそのメンバである各リングを示すことができる。したがって、この固定ＵＲＩによって識別されるランデブポイントで維持される情報は、本質的に、安定したエントリノードおよびそれに対応するリングメンバシップのリストである。したがって、すべてのノードが、使用可能な安定したエントリノードおよびそのリングメンバシップのリストを入手するために、この固定ＵＲＩによって識別されるランデブポイントを参照することができる。
【０２３０】
一実施形態で、安定したエントリノードは、これらの到着イベントおよび離脱イベントを直接に登録する。もう１つの実施形態で、安定したエントリノードは、これらのイベントをその直接の近接リング内のランデブポイントで直接に登録し、そのランデブポイントは、安定したエントリノードの登録／登録解除が属する残りの近接リングのそれぞれでのすべての他の適当なランデブポイントの更新を透過的に容易にする（直接または間接に）。フェデレーションのアプリケーション状態シーケンシングプロパティおよびアプリケーション状態伝搬プロパティを使用して、この安定したエントリノード登録情報を維持し、伝搬させることができる。例えば、信頼できるフラッディングプロトコルを使用して、あるノードの近傍ノードの間で、保存されたアプリケーション状態を複製することができる。
【０２３１】
安定したエントリノードのプレゼンスデータのルートリングに向かう昇進は、フェデレーション内の他のノードがすべての近接内の少なくとも１つのエントリノードをルックアップすることを可能にする。エントリノードルックアップは、ノードルックアップメッセージを、ルックアップを実行するノードの葉リングおよび所望の近接リングの最下位共通先祖リング(Lowest Common Ancestor Ring、「ＬＣＡＲ」）内の上で判定されたランデブポイントに向かってルーティングすることによって容易にすることができる。例えば、図５を参照すると、リング５４１内のノードが、リング５３３内のノードと通信することを望む場合がある。しかし、リング５４１内のノードは、リング５３３内のどのノードの直接の知識も有しない可能性がある。したがって、リング５４１内のノードは、ノードルックアップメッセージをリング５２２（リング５４１およびリング５３３のリングのＬＡＣＲ）に送信することができる。エントリノードプレゼンス情報（例えば、そのエントリノードによって始められた登録メッセージのゆえにシステム内に存在するようにされた）を処理するリング５２２内のランデブポイントノードは、少なくともリング５３３内の登録された安定したエントリノードの連絡情報を伴うルックアップ応答メッセージを返すことができる。
【０２３２】
いくつかの実施形態で、安定したエントリノードは、様々な近接のプレゼンスデータを維持する安定したエントリノードとして特に構成されたシードノードである。他の実施形態では、他のタイプのノードが、様々な近接のプレゼンスデータを維持する安定したエントリノードとして機能することもでき、他の動作を実行するようにも構成され得る。例えば、ある種の他のタイプのノードを、高度に利用可能であり、したがって安定したエントリノードとして適切である（すなわち、上で説明されたように登録される）ものとして構成する（例えば、管理者によって）ことができる。しかし、他のタイプのノードが、追加のシードノード機能性を含まない場合がある（例えば、セキュリティリングオーソリティとしては信頼されない場合がある）。いくつかの実施形態で、その直接近接のエントリノードプレゼンス状態を維持するランデブポイントは、それら自体を１つまたは複数の先祖リング内の安定したエントリノードとして登録することができる。
【０２３３】
（ノード監視）
図１９Ａに、あるノードが別のノードを監視することを容易にする一例のリングアーキテクチャ１９００を示す。図示されているように、リングアーキテクチャは、少なくともリング１９０１（および任意の個数の他のより高いおよび／またはより低いレベルのリング（図示せず））を含む。リング１９０１を、図３のリング３０６に類似して構成することができる。しかし、監視は、図４、５、１２Ａ、および１２Ｂのリングのいずれをも含む、ノードの任意のリングで発生し得る。図１９Ａは、対象ノード１９０２（ＩＤ＝８３を有する）およびモニタノード１９０３（ＩＤ＝２を有する）の拡大図を示す。図示の環境では、モニタノード１９０３は、対象ノード１９０２を監視する。しかし、リング１９０１上の任意のリングを、リング１９０１上の任意の他のノードを監視するように構成することができる。
【０２３４】
図２０に、あるノードが別のノードを監視する方法２０００の一例の流れ図を示す。方法２０００を、図１９Ａに示されたデータおよびコンポーネントに関して説明する。
【０２３５】
方法２０００は、対象ノードが対象ノードの監視に使用される対象側タイムトゥリブ（ｔｉｍｅ−ｔｏ−ｌｉｖｅ）持続時間値を生成する行為（行為２００１）を含む。例えば、対象ノード１９０２は、タイムトゥリブ（ＴＴＬ）持続時間値１９１３を確立することができる。ＴＴＬ持続時間値１９１３は、対象ノード１９０２が、モニタノード１９０３との監視関係がアクティブであると仮定できる持続時間を示す。
【０２３６】
方法２０００は、対象ノードが確立要求をモニタノードに送信する行為（確立要求は、モニタノードが対象ノードを監視することを対象ノードが要求することを示し、確立要求は、対象側タイムトゥリブ持続時間値を含む）（行為２００２）を含む。例えば、対象ノード１９０２は、ＴＴＬ持続時間値１９１３を含む確立要求１９２２をモニタノード１９０３に送信することができる。
【０２３７】
方法２０００は、対象ノードが、対象側タイムトゥリブ持続時間値および確立要求が送信された時刻に基づいて既存対象側タイムトゥダイ（ｔｉｍｅ−ｔｏ−ｄｉｅ）時間を確立する行為（モニタノードからの確立許可の受信の前に既存対象側タイムトゥダイ時間に達する対象ノードクロックは、対象ノードが障害状態に推移しなければならないことの表示である）（行為２００３）を含む。例えば、対象ノード１９０２は、ＴＴＬ持続時間値１９１３と確立要求１９２２がモニタノード１９０３に送信された時刻とに基づいて対象側タイムトゥダイ時間１９１７を確立することができる。対象側タイムトゥダイ時間１９１７は、対象ノード１９０２に対する相対的な時間とすることができる。対象ノード１９０２のクロックが、モニタノード１９０３からの確立許可の受信の前に対象側タイムトゥダイ時間１９１７に達する場合に、対象ノード１９０２は、障害状態に推移しなければならない。いくつかの実施形態で、対象ノード１９０２のクロックが、モニタノード１９０３からの確立許可の受信の前に対象側タイムトゥダイ時間１９１７に達するときに、障害状態が引き起こされる。他の実施形態では、他のアクティビティが、対象ノード１９０２を障害状態に推移させるために発生する。
【０２３８】
方法２０００は、モニタノードが、対象ノードから確立要求を受信する行為（確立要求は、監視ノードが対象ノードを監視することを対象ノードが要求することを示し、確立要求は、少なくとも対象側タイムトゥリブ持続時間値を含み、対象側タイムトゥリブ持続時間値は、対象ノードで対象側タイムトゥダイ時間を決定するのに使用され、モニタノードからの確立許可の受信の前に対象側タイムトゥダイ時間に達する対象ノードクロックは、対象ノードが障害状態に推移しなければならないことの表示である）（行為２００４）を含む。例えば、モニタノード１９０３は、ＴＴＬ持続時間値１９１３を含む確立要求１９２２を対象ノード１９０２から受信することができる。ＴＴＬ持続時間値１９１３は、対象ノード１９０２で対象側タイムトゥダイ時間１９１７を確立するのに使用される。
【０２３９】
方法２０００は、モニタノードが対象側タイムトゥリブ持続時間値からモニタ側タイムトゥリブ持続時間値を導出する行為（行為２００５）を含む。例えば、モニタノード１９０３は、ＴＴＬ持続時間値１９１３を使用してＴＴＬ持続時間値１９１９を導出することができる。いくつかの実施形態で、モニタノード１９０３は、ＴＴＬ持続時間値１９１３をコピーして、ＴＴＬ持続時間値１９１９を導出する。これらの実施形態では、ＴＴＬ値持続時間１９１３とＴＴＬ持続時間値１９１９とが等しい。他の実施形態では、モニタノード１９０３は、ＴＴＬ持続時間値１９１３を変更して、ＴＴＬ持続時間値１９１９を導出する。これら他の実施形態では、ＴＴＬ持続時間値１９１３とＴＴＬ持続時間値１９１９とが異なる。例えば、モニタノード１９０３は、ＴＴＬ持続時間値１９１３の値を増やして、ＴＴＬ持続時間値１９１９がＴＴＬ持続時間値１９１３より長くなるようにＴＴＬ持続時間値１９１９を導出することができる。
【０２４０】
方法２０００は、モニタノードが、モニタ側タイムトゥリブ持続時間値および確立要求が受信された時刻に基づいてモニタ側タイムトゥダイ時間を確立する行為（対象ノードからの更新要求の受信の前にモニタ側タイムトゥダイ時間に達するモニタノードクロックは、対象ノードの疑われる障害を示す）（行為２００６）を含む。例えば、モニタノード１９０３は、ＴＴＬ持続時間値１９１９と時確立要求１９２２が受信された時刻とに基づいてモニタ側タイムトゥダイ時間１９１４を確立する。モニタ側タイムトゥダイ時間１９１４は、モニタノード１９０３に対する相対的な時間とすることができる。モニタノード１９０３のクロックが、対象ノード１９０２からの更新要求の受信の前にモニタ側タイムトゥダイ時間１９１４に達する場合に、モニタノード１９０３は、障害について対象ノード１９０２を疑う。
【０２４１】
方法２０００は、モニタノードが、モニタノードが対象ノードを監視することに合意したことを対象ノードに示すために、確立許可を対象ノードに送信する行為（行為２００７）を含む。例えば、モニタノード１９０３は、確立許可１９２３を対象ノード１９０２に送信することができる。方法２０００は、対象ノードが、監視ノードから確立許可を受信する行為（確立許可は、モニタノードが対象ノードを監視することを示す）（行為２００８）を含む。例えば、対象ノード１９０２は、モニタノード１９０３から確立許可１９２３を受信することができる。一般に、確立許可１９２３は、モニタノード１９０３が対象ノード１９０２を監視することに合意したことを示す。いくつかの実施形態で、確立許可メッセージは、モニタ側ＴＴＬ持続時間値を含むことができる。例えば、確立許可１９２３がＴＴＬ持続時間値１９１９を含むかもしれない。
【０２４２】
その代わりに、モニタノードは、モニタノードが対象ノードを監視することに合意しなかったことを対象ノードに示すために、対象ノードに確立拒否を送信することができる。例えば、確立要求１９２２の受信に応答して、モニタノード１９０３は、その代わりに（破線によって示されるように）確立拒否１９３１を対象ノード１９０２に送信することができる。対象ノードは、モニタノードから送信された確立拒否を受信することができる。例えば、対象ノード１９０２は、モニタノード１９０３から確立拒否１９３１を受信することができる。確立拒否１９３１は、一般に、モニタノード１９０３が対象ノード１９０２を監視することに合意しなかったことを対象ノード１９０２に示す。
【０２４３】
時々（および、リングアーキテクチャ１９９０内の他の動作の実行の間に混ぜ合わされて）、対象ノードが、監視ノードとの確立された監視合意を更新することができる。一般に、対象ノードは、新しい許可が受信されるまで、既存の合意を有効なままにする（現行対象側タイムトゥダイ時間）。しかし、対象ノードは、新しいＴＴＬ持続時間値を生成し、更新されたタイムトゥダイがどうなるかを導出することができる。次に、対象ノードは、新しいＴＴＬ持続時間値をモニタノードに送信する。モニタノードは、新しいＴＴＬ持続時間値を受信する。適当なときに、モニタノードは、更新要求を許可し、更新許可を対象に送り返す。対象ノードは、更新許可を受信する。更新許可の受信に応答して、対象は、新しい現行タイムトゥダイ時間として更新されたタイムトゥダイ時間を使用して、更新合意を実施する。確立された監視合意の更新の例は、方法２０００の残りの行為で説明する。
【０２４４】
方法２０００は、対象ノードが、対象ノードクロックが対象側タイムトゥダイ時間に達する前に、モニタノードに更新要求を送信する行為（行為２００９）を含む。例えば、対象ノード１９０２は、対象ノード１９０２のクロックが対象側タイムトゥダイ時間１９１７に達する前に、ＴＴＬ持続時間値１９１３を含む更新要求１９１５をモニタノード１９０３に送信することができる。いくつかの実施形態で、更新要求１９１５は、対象側ＴＴＬ持続時間値を含まない。これらの実施形態では、ＴＴＬ持続時間値１９１３の継続される使用を推論することができる。他の実施形態では、ＴＴＬ持続時間値１９１３が、更新要求１９１５に明示的に含まれる。もう１つの実施形態では、異なる対象側ＴＴＬ持続時間値が、更新要求１９１５に含まれる。新しい対象側ＴＴＬ持続時間値を、対象ノード１９０２の構成変更および／またはリング１９０１内の他所での更新変更（例えば、変更されたネットワーク条件）に応答して、対象ノード１９０２によって生成し、使用することができる。
【０２４５】
ノード１９０２は、更新要求１９１５に応答する対応する更新許可が受信される場合に、更新された対象側タイムトゥダイ時間がどうなるかを計算することもできる。この計算は、少なくとも、更新要求１９１５が送信された時刻と、更新要求１９１５に関係付けられるかこれに関連する対象側ＴＴＬ持続時間値とに基づくものとすることができる。
【０２４６】
方法２０００は、モニタノードが、確立許可メッセージの送信の後、モニタノードクロックがモニタ側タイムトゥダイ時間に達する前に、対象ノードから更新要求を受信する行為（更新要求は、対象ノードが障害を発生していないことを示す）（行為２０１０）を含む。例えば、モニタノード１９０３は、確立許可１９２３の送信の後、モニタノード１９０３のクロックがモニタ側タイムトゥダイ時間１９１４に達する前に、更新要求１９１５を受信することができる。更新要求１９１５の受信は、対象ノード１９０２が障害を発生していないことをモニタノード１９０３に示すことができる。
【０２４７】
方法２０００は、モニタノードが対象ノードに更新要求を許可する行為をも含むことができる。例えば、モニタノード１９０３は、更新要求１９１５を許可することができる。
【０２４８】
方法２０００は、モニタノードが、少なくとも更新要求が受信されたことに応答し、その時刻に基づいて、更新されたモニタ側タイムトゥダイ時間を確立する行為（対象ノードからのもう１つの更新要求の前に更新されたモニタ側タイムトゥダイ時間に達するモニタノードクロックは、対象ノードの疑われる障害を示す）（行為２０１２）を含む。例えば、モニタノード１９０３は、更新要求１９１５が受信されたことに応答し、その時刻と、更新要求１９１５に関係付けられまたはこれに潜在的に含まれる暗示されまたは示されたモニタＴＴＬ持続時間値とに基づいて、更新されたモニタ側タイムトゥダイ時間１９２１を確立することができる。更新されたモニタ側タイムトゥダイ時間１９２１は、モニタノード１９０３に対する相対的な時間とすることができる。更新されたモニタ側タイムトゥダイ時間１９２１を、モニタ側タイムトゥダイ時間１９１４の後とすることができる。しかし、モニタ側タイムトゥダイ時間１９１４が、更新されたモニタ側タイムトゥダイ時間１９２１を確立する前に発生したという要件はない。したがって、更新されたモニタ側タイムトゥダイ時間１９２１が、実際にモニタ側タイムトゥダイ時間１９１４の前（またはこれと同一）であることも可能である。モニタノード１９０３のクロックが、対象ノード１９０２から別の更新要求を受信する前に更新されたモニタ側タイムトゥダイ時間１９２１に達する場合には、モニタノード１９０３は、障害について対象ノード１９０２を疑う。
【０２４９】
対象側ＴＴＬ持続時間値が、更新要求１９１５に含まれない（したがって、ＴＴＬ持続時間値１９１３が推論される）場合、または更新要求がＴＴＬ持続時間値１９１３を明示的に含む場合に、モニタノード１９０３は、ＴＴＬ持続時間値１９１９を使用して、更新されたモニタ側タイムトゥダイ時間１９２１を確立することもできる。その一方で、ＴＴＬ持続時間値１９１３以外の対象側ＴＴＬ持続時間値が、更新要求１９１５内に明示的に含まれる場合には、モニタノード１９０３は、その、他の明示的に含まれる対象側ＴＴＬ持続時間値を使用して、新しいモニタ側ＴＴＬ持続時間値を導出することができる。次に、新しいモニタ側ＴＴＬ持続時間値から、モニタノード１９０３は、更新されたモニタ側タイムトゥダイ時間１９２１を確立することができる。
【０２５０】
方法２０００は、モニタノードが、モニタノードが対象ノードの監視を継続することに合意したことを対象ノードに示すために、対象ノードに更新許可を送信する行為（行為２０１３）を含む。例えば、モニタノード１９０３は、更新許可１９２７を対象ノード１９０２に送信することができる。方法２０００は、対象ノードが、対応する更新要求の送信の後、対象ノードクロックが対象側タイムトゥダイ時間に達する前に、モニタノードから更新許可を受信する行為（更新許可メッセージは、モニタノードが対象ノードの監視を継続することを示す）（行為２０１４）を含む。例えば、対象ノード１９０２は、更新要求１９１５の送信の後、対象ノード１９０２のクロックが対象側タイムトゥダイ時間１９１７に達する前に、モニタノード１９０３から更新許可１９２７を受信することができる。一般に、更新許可１９２７は、モニタノード１９０３が対象ノード１９０２の監視を継続することに合意することを示す。
【０２５１】
その代わりに、モニタノードは、モニタノードが対象ノードの監視にもはや合意しないことを対象ノードに示すために、対象ノードに更新拒否を送信することができる。例えば、更新要求１９１５の受信に応答して、モニタノード１９０３は、その代わりに（破線によって示されるように）更新拒否１９３３を対象ノード１９０２に送信することができる。対象ノードは、モニタノードから送信された更新拒否を受信することができる。例えば、対象ノード１９０２は、モニタノード１９０３から更新拒否１９３３を受信することができる。更新拒否１９３３は、一般に、モニタノード１９０３が対象ノード１９０２の監視にもはや合意しないことを対象ノード１９０２に示す。
【０２５２】
方法２０００は、対象ノードが、更新許可の受信に応答して、以前に計算された更新された対象側タイムトゥダイ時間に推移すること（モニタノードからのもう１つの更新許可の受信の前に更新された対象側タイムトゥダイ時間に達する対象ノードクロックは、対象ノードが障害状態に推移しなければならないことの表示である）（行為２０１５）を含む。例えば、対象ノード１９０２は、対応する更新許可メッセージが受信されるときに、更新された対象側タイムトゥダイ時間１９５２に推移することができる。更新された対象側タイムトゥダイ時間１９５２は、更新要求１９１５がモニタノード１９０３に送信された時刻付近に計算済みとすることができる。更新された対象側タイムトゥダイ時間１９５２は、対応する更新要求１９１５が送信された時刻と、更新要求１９１５に関係付けられまたは関連するＴＴＬ持続時間とに基づいて計算済みとすることができる。更新された対象側タイムトゥダイ時間１９５２は、対象ノード１９０２に対する相対的な時間（例えば、対象側タイムトゥダイ時間１９１７の後、前、またはこれと等しい）とすることができる。
【０２５３】
ＴＴＬ値１９１３が、それでも適当なＴＴＬ値である場合に、対象ノード１９０２は、ＴＴＬ持続時間値１９１３を使用して、更新された対象側タイムトゥダイ時間１９５２を確立することもできる。もう１つのＴＴＬ持続時間値が生成された場合には、対象ノード１９０２は、そのもう１つの生成されたＴＴＬ持続時間値を使用して、更新された対象側タイムトゥダイ時間１９５２を確立することもできる。
【０２５４】
現行対象側タイムトゥダイ時間（１９１７または１９５２のいずれか）の確立の後に、対象ノード１９０２のクロックが、モニタノード１９０３からもう１つの更新許可を受信する前に現行対象側タイムトゥダイ時間に達するかもしれない。これは、対象ノード１９０２とモニタノード１９０３との間の通信エラーから生じる可能性がある。例えば、対象ノード１９０２が、更新許可１９２７を受信した後、対象ノード１９０２のクロックが更新された対象側タイムトゥダイ時間１９５２に達する前に、もう１つの更新要求を送信する場合がある。しかし、通信障害に起因して、そのもう１つの更新要求は、モニタノード１９０３に到達しない。その代わりに、そのもう１つの更新要求が、モニタノード１９０３で受信される可能性があるが、モニタノード１９０３からの対応する更新許可が、通信エラーに起因して対象ノード１９０２に到達しない。どちらの場合でも、対象ノード１９０２のクロックは、そのもう１つの更新要求に応答する対応する更新許可を受信する前に、現行対象側タイムトゥダイ時間に達する可能性がある。
【０２５５】
その代わりに、対象ノード１９０２が誤動作している可能性があり、対象ノード１９０２が、対象ノード１９０２のクロックが更新された対象側タイムトゥダイ時間１９５２に達する前にモニタノード１９０３にもう１つの更新要求を送信できなくなる。
【０２５６】
しかし、更新要求が送信されようとされまいと、更新許可が、対象ノード１９０２のクロックが現行の対象側タイムトゥダイ時間１９５２に達する前に受信されない場合には、対象ノード１９０２は、障害状態に推移する。
【０２５７】
戻ってモニタノード１９０３を参照すると、モニタノード１９０３のクロックが、もう１つの更新要求を対象ノード１９０２から受信する前に（対象ノード１９０２での誤動作またはリング１９０１での通信エラーのいずれかに起因して）モニタ側タイムトゥダイ時間（１９１４または１９２１のいずれか）に達するかもしれない。その結果、モニタノード１９０３は、障害について対象ノード１９０２を疑う。モニタノード１９０３は、別のノードでの疑われる障害の検出を示すタイムアウト状態に推移することができる。
【０２５８】
他の実施形態では、ノードの対が、お互いを監視することができる。したがって、第１ノードが第２ノードを監視することができ、第２ノードも第１ノードを監視することができる。例えば、各ノードは、他方のノードとの通信を介して、対象ノード側とモニタノード側との両方の方法２０００を実施することができる。
【０２５９】
図１９Ｂに、２つのノードがお互いを監視するのを容易にする一例のリングアーキテクチャ１９００を示す。
【０２６０】
ノード１９７１は、ノード１９７１を監視するのに使用されるＴＴＬ持続時間値１９２９を生成することができる。ノード１９７１は、ＴＴＬ持続時間値１９２９を含む確立要求１９６２をノード１９７２に送信することができる。ノード１９７１は、ＴＴＬ持続時間値１９２９に基づいて対象側タイムトゥダイ時間１９７３を確立することもできる。ノード１９７２は、ＴＴＬ持続時間値１９２９を含む確立要求１９６２をノード１９７１から受信することができる。ノード１９７２は、ＴＴＬ持続時間値１９２９からＴＴＬ持続時間値１９４９を導出することができる。ノード１９７２は、ＴＴＬ持続時間値１９４９に基づいてモニタ側タイムトゥダイ時間１９３９を確立することができる。ノード１９７２は、確立許可１９７４をノード１９７１に送信することができる。ノード１９７１は、ノード１９７２から確立許可１９７４を受信することができる。
【０２６１】
並行して、ノード１９７２は、ノード１９７２を監視するのに使用されるＴＴＬ持続時間値１９７５を生成することができる。ノード１９７２は、ＴＴＬ持続時間値１９７５を含む確立要求１９２６をノード１９７１に送信することができる。ノード１９７２は、ＴＴＬ持続時間値１９７５に基づいて対象側タイムトゥダイ時間１９３５を確立することもできる。ノード１９７１は、ＴＴＬ持続時間値１９７５を含む確立要求１９２６をノード１９７２から受信することができる。ノード１９７１は、ＴＴＬ持続時間値１９７５からＴＴＬ持続時間値１９５３を導出することができる。ノード１９７１は、ＴＴＬ持続時間値１９５３に基づいてモニタ側タイムトゥダイ時間１９３７を確立することができる。ノード１９７１は、許可メッセージ１９７６をノード１９７２に送信することができる。ノード１９７２は、ノード１９７１から許可メッセージ１９７６を受信することができる。
【０２６２】
その代わりに、ノード１９７１および１９７２のいずれかが、他方のノードからの確立要求を拒否することができる。例えば、ノード１９７１が、確立要求１９６２を拒否することができる。同様に、ノード１９７２が、確立要求１９２６を拒否することができる。いずれかのノードが確立要求を拒否するときに、そのノードは、他方のノードに確立拒否（例えば、確立拒否１９３１に似た）を送信することができる。これは、他方のノードに、監視合意が確立されなかったことを示す。
【０２６３】
その後、ノード１９７１およびノード１９７２は、前述のように更新要求および更新許可（ならびに更新拒否１９３３に似た更新拒否）を交換することができる。したがって、ノード１９７１およびノード１９７２のそれぞれが、対象ノードとモニタノードとの両方である。図１９Ｂに示されたＴＴＬ持続時間値およびタイムトゥダイ時間に基づいて、様々なイベントが、監視関係が確立されている間および／またはその後に発生し得る。
【０２６４】
ノード１９７１のクロックが、ノード１９７２から更新許可を受信する前に対象側タイムトゥダイ時間１９７３に達する場合に、ノード１９７１は、障害状態に推移する。ノード１９７２のクロックが、ノード１９７１から更新要求を受信する前にモニタ側タイムトゥダイ時間１９３９に達する場合に、ノード１９７２は、障害についてノード１９７１を疑う。
【０２６５】
ノード１９７２のクロックが、ノード１９７１から更新許可を受信する前に対象側タイムトゥダイ時間１９３５に達する場合に、ノード１９７２は、障害状態に推移する。ノード１９７１のクロックが、ノード１９７２から更新要求を受信する前にモニタ側タイムトゥダイ時間１９３７に達する場合に、ノード１９７１は、障害についてノード１９７２を疑う。
【０２６６】
（ノード障害のアービトレーション）
様々な異なるタイプの通信エラーおよびノード誤動作に起因して、ノードの対の各ノードが他方のノードの障害を疑う可能性が存在する。さらに、各ノードは、それが正しく機能していることを疑うことができる。
【０２６７】
いくつかのリングアーキテクチャで、リソースの諸部分は、単一のノードが所与の瞬間にあるリソースを制御するように構成される。さらに、いくつかのリソースの必要な可用性も、あるノードによる本質的に一定の制御が必要になるように高くすることができる。したがって、あるノードが障害を発生するときに、様々なリソースの制御を、別のノードに転送する必要がある場合がある。したがって、ノードの対の１つのノードが、障害について他方のノードを疑うときに、アービトレーション機構を使用して、少なくとも、どちらのノードが障害を有したまたは有するに違いないかを判定することができる。
【０２６８】
例えば、対の各ノードが、障害について他方のノードを疑うときに、各ノードは、タイムアウト状態に推移し、その疑いをアービトレーションファシリティに報告することができる。タイムアウト状態であるときに、各ノードでのある種の他の処理を、アービトレーションの結果が受け取られるまでサスペンドさせることができる。アービトレーションファシリティは、ノードに戻って報告して、そのノードがアクティブのままになるべきであるかどうかを示すことができる。例えば、アービトレーションファシリティは、アクティブのままになるべき報告するノードに、受入メッセージを送信することができる。アービトレーションファシリティは、障害状態に推移すべき報告するノードに、否定メッセージを送信することができる。受入メッセージを受信するノードは、アクティブのままであることができる。受入メッセージを受信しない（例えば、ネットワーク条件に起因して）ノードまたは否定メッセージを受信するノードは、障害状態に推移する。
【０２６９】
図１９Ｃに、相互に監視するノードが、他方のノードが障害について疑われることをそれぞれ報告できるときのアービトレーションを容易にする例のリングアーキテクチャ１９００を示す。図１９Ｃは、ノード１９８１（ＩＤ＝９８を有する）、モニタノード１９８２（ＩＤ＝６４を有する）、およびアービトレータ１９８３の拡大図を示す。
【０２７０】
いくつかの実施形態で、アービトレータ１９８３は、リング１９０１のメンバでもある。他の実施形態では、アービトレータ１９８３は、リング１９０１の先祖のメンバであるが、リング１９０１のメンバではない。さらなる実施形態では、アービトレータ１９８３は、リング１９０１を含むリング階層の外部にある。例えば、アービトレータ１９８３を、ノードの別々のアービトレーションフェデレーションリングに含めることができる。アービトレーションフェデレーション内のノードを、リング１９０１およびその先祖のノードのアービトレータとして構成することができる。
【０２７１】
いくつかの実施形態で、アービトレータ１９８３は、ノード１９８１および１９８２についてアービトレートするためにノード１９７１およびノード１９８２によって相互に合意される。他の実施形態で、アービトレータ１９８３は、別のエンティティによって、ノード１９８１および１９８２についてアービトレートするために割り当てられる。この別のエンティティは、リング１９０１を含むリング階層の内部のノード（例えば、シードノード）または例えば、人間の管理者とすることができる。例えば、この他のノードを、リング１９０１のメンバとするか、リング１９０１の先祖のメンバであるがリング１９０１のメンバではないものとすることができる。その代わりに、この別のエンティティを、リング１９０１を含むリング階層の外部とすることができる。例えば、この別のエンティティを、別々のアービトレーションフェデレーションリングのメンバであるノードとすることができる。
【０２７２】
アービトレータ１９８３は、リング１９０１を含むリング階層の変化する知識を有することができる。例えば、アービトレータ１９８３は、リング１９０１を含むリング階層のグローバル知識を有することができる。その代わりに、アービトレータ１９８３が、リング１９０１を含むリング階層に含まれるリングのあるサブセットの知識を有することができる。他の実施形態では、アービトレータ１９８３は、ノード１９８１および１９８２を含む（潜在的にはこれらだけを含む）リング１９０１内のノードのサブセットの知識を有する。
【０２７３】
アービトレータ１９８３を、ノード１９８１および１９８２を含むがこれらに限定はされない任意の個数のノード対についてアービトレートするように構成することができる。いくつかの実施形態で、アービトレーション機構は、疑われるノード障害の報告の受信の前に、それがアービトレートするノードの知識を有しない。したがって、ノードの対が、アービトレータ１９８３を使用することに合意した、またはアービトレータ１９８３がノードの対に関してアービトレートするために割り当てられたが、アービトレータ１９８３は、ノードの対の１つのノードに関する疑われるノード障害の報告を受信する前に、合意または割り当てをまったく知らない場合がある。
【０２７４】
アービトレーションは、衝突する障害報告を提示するノードの間でアービトレートすることを含むことができる。例えば、第１ノードが第２ノードを監視しており、第２ノードも第１ノードを監視しているときに、各ノードが、他方のノードが障害について疑われると報告するかもしれない。疑われる障害は、本明細書において既に説明したものを含む事実上すべての障害検出機構を使用して検出することができる。
【０２７５】
障害発生ノードリスト１９４７は、疑われる障害を発生したノードとして報告されたノードのリストを含むことができる。ノードは、他のノードを疑われる障害を発生したノードとしてアービトレータ１９８３に報告することができ、適当なときに、アービトレータ１９８３は、報告されたノードを障害発生ノードリスト１９４７に含めることができる。アービトレータ１９８３は、適当な時間期間の後（例えば、継続される衝突の可能性が不可能である将来のとき）に、障害を発生したノードを障害発生ノードリスト１９４７から除去することができる。例えば、障害発生ノードリスト１９４７のエントリを、それらが障害発生ノードリスト１９４７に挿入された後のリカバリタイムインターバル１９４２に除去することができる。リカバリタイムインターバル１９４２は、障害を発生していると言われたノードが実際に障害を発生することを保証するのに十分に長くすることができる。
【０２７６】
図２１は、疑われるノード障害の衝突する報告の間でアービトレートする方法２１００の一例の流れ図を示す。方法２１００を、図１９Ｃに示されたコンポーネントおよびデータに関して説明する。
【０２７７】
方法２１００は、第１ノードが、第２ノードが障害について疑われることの報告をアービトレーションファシリティに送信する行為（行為２１０１）を含む。例えば、ノード１９８１が、報告１９３４をアービトレータ１９８３に送信することができる。方法２１００は、アービトレータが、第２ノードが障害について疑われることの報告を第１ノードから受信する行為（行為２１０２）を含む。例えば、アービトレータ１９８３が、ノード１９８１から報告１９３４を受信することができる。
【０２７８】
方法２１００は、アービトレータが、第１ノードからの報告の受信の前の指定されたリカバリタイムインターバル内に、他のノードが障害について第１ノードを疑わなかったことを判定する行為（行為２１０３）を含む。例えば、アービトレータ１９８３は、リカバリタイムインターバル１９４２内（その後には、アービトレータ１９８３が、いずれにせよ障害発生ノードリスト１９４７からノード１９８１を除去しているはずである）に他のノードが障害についてノード１９８１を疑わなかったことを判定することができる。
【０２７９】
方法２１００は、アービトレータが、第２ノードが障害状態であることをリストに記録する行為（行為２１０５）を含む。例えば、アービトレータ１９８３は、ノード１９８２（ＩＤ＝６４）が障害状態であることを障害発生ノードリスト１９４７に記録することができる。
【０２８０】
方法２１００は、アービトレータが、最大応答タイムインターバル以内に第１ノードに受入メッセージを送信する行為（受入メッセージは、その後に第２ノードが障害状態に推移することが保証される時間期間を示す障害時間値を含む）（行為２１０４）を含む。例えば、アービトレータ１９８３は、報告１９３４の受信から最大応答タイムインターバル１９４３以内に、ノード１９８１に受入メッセージ１９８４を送信することができる。受入メッセージ１９８４は、ノード１９８２が障害状態に推移済みであることが保証されるときを示す障害タイムインターバル１９３６を含む。一般に、最大応答タイムインターバルは、その後に、アービトレーションファシリティ（アービトレータ１９８３）がアービトレーションの要求（例えば、報告１９３４または１９３８）に回答しないとリクエスタ（例えば、ノード１９８１または１９８２）が仮定するとき点を表す。最大応答タイムインターバルが、アービトレーションの要求を送信した後にリクエスタで満了するときに、そのリクエスタは、明示的な否定メッセージが受信された場合に実行される動作に類似する（潜在的に同一の）動作を実行する。
【０２８１】
方法２１００は、第１ノードが、最大応答タイムインターバル以内にアービトレーションファシリティから受入メッセージを受信する行為（受入メッセージは、その後に第２ノードが障害状態に推移することが保証される時間期間を示す時間値を含む）（行為２１０６）を含む。例えば、ノード１９８１は、障害タイムインターバル１９３６を含む受入メッセージ１９８４をアービトレータ１９８３から受信することができる。障害タイムインターバル１９３６は、ノード１９８２が障害状態に推移済みであることが保証される時間を示す。したがって、障害タイムインターバル１９３６の満了の後に、ノード１９８１は、以前にノード１９８２によって制御された１つまたは複数のリングリソースの制御を請求することを試みることができる。
【０２８２】
方法２１００は、第１ノードが、時間期間の満了の後に、以前に第２ノードによって制御された１つまたは複数のリングリソースの制御を請求する行為（行為２１０７）を含む。例えば、ノード１９８１は、障害タイムインターバル１９３６の満了の後に、以前にノード１９８２によって制御されたリング１９０１内の１つまたは複数のリングリソースの制御を請求することができる。
【０２８３】
請求されるリングリソースは、障害状態への推移の前にノード１９８２によって制御されたリングリソースに応じて変化し得る。例えば、ノード１９８１は、ノード１９８２のメッセージルーティング責任（例えば、リング１９０１上のアイデンティティの範囲に向けられたメッセージを受信する責任）、ノード１９８２のすべてのシードノード責任、ノード１９８２のすべてのアービトレーション責任などを引き受けることができる。
【０２８４】
第１ノードが第２ノードを報告したときまたはその後に、第２ノードも、障害について第１ノードを疑う場合がある。例えば、ノード１９８２も、障害についてノード１９８１を疑うかもしれない。
【０２８５】
方法２１００は、第２ノードが、第１ノードが障害について疑われることの報告をアービトレーションファシリティに送信する行為（行為２１０８）を含む。例えば、ノード１９８２が、ノード１９８１が障害について疑われることの報告１９３８をアービトレータ１９８３に送信することができる。方法２１００は、アービトレータが、第１ノードが障害について疑われることの報告を第２ノードから受信する行為（第２ノードからの報告は、第１ノードからの報告の受信の後の指定されたリカバリタイムインターバル以内に受信される）（行為２１０９）を含む。例えば、アービトレータ１９８３は、報告１９３４の受信からリカバリタイムインターバル１９４２以内に、ノード１９８１が障害について疑われることの報告１９３８をノード１９８２から受信することができる。
【０２８６】
方法２１００は、アービトレータが、第２ノードが障害状態に推移すべきであることを判定するためにリストを参照する行為（行為２１１０）を含む。例えば、アービトレータ１９８３は、ノード１９８２（ＩＤ＝６４）が障害状態に推移すべきであることを判定するために、障害発生ノードリスト１９４７を参照することができる。
【０２８７】
方法２１００は、第２ノードに障害状態に推移させるために第２ノードに否定メッセージを送信する行為（行為２１１１）を含む。例えば、アービトレータ１９８３は、ノード１９８２に障害状態に推移させるためにノード１９８２に否定メッセージ１９８５を送信することができる。方法２１００は、第２ノードがアービトレーションファシリティから否定メッセージを受信する行為（行為２１１２）を含む。例えば、ノード１９８２は、アービトレータ１９８３から否定メッセージ１９８５を受信することができる。
【０２８８】
方法２１００は、第２ノードが障害状態に推移する行為（行為２１１３）を含む。例えば、ノード１９８２は、否定メッセージ１９８５の受信に応答して障害状態に推移することができる。障害発生の後に、ノード１９８２は、その後、リング１９０１への再参加を試みることができる。
【０２８９】
（キャッシングされた合意に従うルーティング）
いくつかの実施形態で、メッセージは、キャッシングされたルーティング合意に従ってルーティングされる。例えば、リングの隣接ノードは、隣接ノードの間の非占有識別子の範囲に関する責任の分割に合意することができる。識別子は、任意の個数の理由から非占有とすることができる。例えば、識別子は、その識別子が未割り当て（すなわち、ノードに割り当てられていない識別子）なので非占有である場合がある。割り当てられた識別子（すなわち、ノードに割り当てられている識別子）について、識別子は、対応するノードが故意にシャットダウンされたので、あるいは、ノードが、例えば、通信障害またはノード障害に起因してなどの理由で他の形で到達不能なので、非占有である場合がある。
【０２９０】
ノードの間のルーティング合意は、隣接ノードの責任になるべき非占有識別子のいずれかに関するメッセージを受け入れ、その非占有識別子に関するメッセージを送達することをノードが許可される前に、確立し、キャッシングすることができる。キャッシングされたルーティング合意への参照は、そうでなければどのノードが特定の非占有識別子の責任を負うかを判定するために発生する可能性がある（潜在的に）隣接するノードの間のすべての通信を大幅に減らす。
【０２９１】
キャッシングされたルーティング合意は、構成可能なルールに従ってまたは固定された方法論に従って、任意の形で非占有識別子の範囲を分割することができる。いくつかの実施形態で、あるリング上の隣接ノードの間の識別子の範囲は、本質的に半分に分割される。これは、非占有識別子が、その非占有識別子の責任を負うノードからより遠くなる尤度を下げる。
【０２９２】
隣接ノードの間に偶数個の非占有識別子があるときには、隣接ノードの間の中点は、非占有識別子の間にある。したがって、非占有識別子の責任を、隣接ノードの中点で分割することができる。したがって、各隣接ノードに、等しい個数の非占有識別子の責任を割り当てることができる。
【０２９３】
その一方で、隣接ノードの間に奇数個の非占有識別子があるときには、隣接ノードの間の中点は、非占有識別子にある。したがって、非占有識別子の責任を、中点である非占有識別子のいずれかの側で分割することができる。したがって、一方の隣接ノードに、他方の隣接ノードより１つ多い非占有識別子の責任を割り当てることができる。
【０２９４】
例えば、ここで図２２Ａを参照すると、図２２Ａは、ノード間のキャッシングされた２ウェイ合意によるメッセージのルーティングを容易にする一例のリングアーキテクチャ２２００を示す。図示されているように、ノード２２０１、２２０２、２２０３、２２６１、２２６２、および２２６３を含む（これらに限定はされない）様々なノード（リング２２５０上の正方形として図示）が、リング２２５０に含まれる。各ノードは、リング２２５０上でのその位置を示す、対応するＩＤ（括弧内に図示）を有する。例えば、ノード２２０１はＩＤ＝６４を有し、ノード２２０２はＩＤ＝３０を有する。
【０２９５】
図示されたノードの間に、非占有識別子の複数の範囲がある。例えば、非占有識別子範囲２２１１は、ノード２２０２と２２０１との間の非占有識別子３１から６３までを表す。
【０２９６】
図示されているように、ノード２２０１および２２０２は、２ウェイ合意２２２３を確立し、キャッシングしている。例えば、以前の通信を介して、ノード２２０１および２２０２は、ＩＤ＝６４とＩＤ＝３０との間に現在散在する他のノードがないと判定することができる。したがって、ノード２２０１および２２０２は、さらに、これらがリング２２５０上で互いに隣接すると判定することができる。したがって、ノード２２０１および２２０２は、ノード２２０２が非占有識別子範囲２２１１のある部分の責任を負い、ノード２２０１が非占有識別子範囲２２１１の残りの部分の責任を負うように、非占有識別子範囲２２１１（すなわち、非占有識別子３１から６３まで）の責任を分割することができる。各ノードは、それに割り当てられたＩＤの責任をも負う。すなわち、ノード２２０２は、ＩＤ＝３０の責任を負い、ノード２２０１は、ＩＤ＝６４の責任を負う。
【０２９７】
したがって、責任境界２２１３（非占有識別子４７と非占有識別子４８との間）によって示されているように、ノード２２０２（ＩＤ＝３０）は、それ自体ならびに非占有識別子３１から４７までの責任を負い、ノード２２０１（ＩＤ＝６４）は、それ自体ならびに非占有識別子４８から６３までの責任を負う。ノード２２０１と２２０２との間の中点は、非占有識別子４７であるが、ノード２２０２は、各非占有識別子が単一ノードの責任になるように、非占有識別子４７の責任を割り当てられる。したがって、前述のように、責任境界が非占有識別子に位置するときには、隣接ノードのうちの１つに、その非占有識別子の単独の責任を割り当てることができる。
【０２９８】
図２４に、キャッシングされた２ウェイ合意に従ってメッセージをルーティングする方法２４００の一例の流れ図を示す。方法２４００を、図２２Ａのリングアーキテクチャ２２００に示されたノードおよびメッセージに関して説明する。
【０２９９】
方法２４００は、受信ノードがノードのリング上の宛先を示す宛先識別子と一緒にメッセージを受信する行為（宛先識別子は、受信ノードと直接近傍ノードのうちの１つとの間に位置する）（行為２４０１）を含む。例えば、ノード２２０１が、ＩＤ＝５５への送達について示されたメッセージ２２５１を受信することができる。その代わりに、ノード２２０１が、ＩＤ＝３９への送達について示されたメッセージ２２５２を受信することができる。メッセージ２２５１および２２５２は、リング２２５０内の別のノードから（イントラリング通信）、リングアーキテクチャ２２００の別のリング内のノードから（インターリング通信）、または非リング通信を介して受信することができる。
【０３００】
方法２４００は、受信ノードが、メッセージを受信すべき次の適当なノードを判定するために受信ノードと直接近傍ノードとの間のキャッシングされた２ウェイ合意を参照する行為（行為２４０２）を含む。２ウェイ合意は、少なくとも、受信ノードと直接近傍ノードとの間の識別子空間の責任の分割を暗示する。例えば、ノード２２０１が、キャッシングされた２ウェイ合意２２２３を参照して、メッセージ２２５１を処理すべき次の適当なノードを判定することができる。キャッシングされた２ウェイ合意２２２３は、ノード２２０１（ＩＤ＝６４）が非占有識別子５５の責任を負うことを示すので、ノード２２０１は、それがメッセージ２２５１を処理すべき適当なノードであると判定する。同様に、ノード２２０１は、キャッシングされた２ウェイ合意２２２３を参照して、メッセージ２２５２を処理すべき次の適当なノードを判定することができる。キャッシングされた２ウェイ合意２２２３は、ノード２２０２（ＩＤ＝３０）が非占有識別子３９の責任を負うことを示すので、ノード２２０１は、ノード２２０２が、メッセージ２２５２を処理すべき次の適当なノードであると判定する。
【０３０１】
方法２４００は、次の適当なノードの判定に基づいて、次の適当なコンポーネントにメッセージを送信する行為（行為２４０３）を含む。例えば、ノード２２０１は、キャッシングされた２ウェイ合意２２２３が、ノード２２０１が非占有識別子５５の責任を負うことを示すので、非占有識別子５５に対応するそのリソースハンドラインスタンスにメッセージ２２５１を供給することができる。その代わりに、ノード２２０１は、キャッシングされた２ウェイ合意２２２３が、ノード２２０２が非占有識別子３９の責任を負うことを示すので、ノード２２０２にメッセージ２２５２を供給することができる。その後、ノード２２０２は、非占有識別子３９に対応するそのリソースハンドラインスタンスにメッセージ２２５２を供給することができる。
【０３０２】
識別子が、キャッシングされた２ウェイ合意に含まれないときには、ノードは、宛先に向かう進行を行うためにルーティングテーブル（例えば、図３に示された）を参照することができる。例えば、ノード２２０１は、ＩＤ＝２０３への送達について示されたメッセージ２２５３を、ノード２２６１（ＩＤ＝２００）に送信することができる。次に、ノード２２６１は、その隣接ノードに関するすべてのキャッシングされた２ウェイ合意を参照して、識別子２０３の責任を負うノードを判定することができる。
【０３０３】
いくつかの実施形態で、複数の２ウェイ合意が、所与のノードの展望から、所与のノードと、その所与のノードの直接先行ノードと、その所与のノードの直接後続ノードとの間の３ウェイ合意を本質的に表すことができる。図２２Ｂに、複数のキャッシングされた２ウェイ合意によるメッセージのルーティングを容易にする例のリングアーキテクチャ２２００を示す。
【０３０４】
前述のように、ノード２２０１および２２０２は、キャッシングされた２ウェイ合意２２２３を確立することができる。同様に、ノード２２０１および２２０３は、非占有識別子範囲２２１２（すなわち、非占有識別子６５から１０１まで）の責任を分割するためにキャッシングされた２ウェイ合意２２２４を確立することができる。したがって、以前の通信を介して、ノード２２０１および２２０３は、ＩＤ＝６５とＩＤ＝１０１との間に現在散在する他のノードがないと判定することができる。したがって、ノード２２０１および２２０３は、さらに、リング２２５０上でお互いに隣接すると判定することができる。したがって、ノード２２０１および２２０３は、ノード２２０３が非占有識別子範囲２２１２の一部の責任を負い、ノード２２０１が非占有識別子範囲２２１２の残りの部分の責任を負うように非占有識別子範囲２２１２を分割することができる。したがって、２ウェイ合意２２２４内に示されているように、ノード２２０１（ＩＤ＝６４）は、それ自体ならびに非占有識別子６５から８２までの責任を負い、ノード２２０３（ＩＤ＝１０１）は、それ自体ならびに非占有識別子８３から１００までの責任を負う。
【０３０５】
ノード２２０１の展望から、キャッシングされた２ウェイ合意２２２３とキャッシングされた２ウェイ合意２２２４との組合せは、本質的に３ウェイ合意２２７３を表す。すなわち、ノード２２０１は、ノード２２０１とノード２２０２との間の識別子空間の一部の責任を負い、ノード２２０１とノード２２０３との間の識別子空間の一部の責任を負う。識別子の括弧で括られた範囲は、ノード２２０１のいずれかの側でのキャッシングされた２ウェイ合意２２２３および２２２４からの責任の範囲（すなわち、４７から６４までおよび６４から８２まで）を示す。
【０３０６】
図２５に、複数のキャッシングされた２ウェイ合意に従ってメッセージをルーティングする方法２５００の一例の流れ図を示す。方法２５００を、図２５Ｂのリングアーキテクチャ２２００に示されたノードおよびメッセージに関して説明する。
【０３０７】
方法２５００は、受信ノードがノードのリング上の宛先を示す宛先識別子と一緒にメッセージを受信する行為（行為２５０１）を含む。例えば、ノード２２０１は、それぞれＩＤ＝５５、ＩＤ＝３９、ＩＤ＝２０３、ＩＤ＝７４、およびＩＤ＝９４への送達について示されたメッセージ２２５１、２２５２、２２５３、２２５４、および２２５６のいずれをも受信することができる。メッセージ２２５１、２２５２、２２５３、２２５４、および２２５６は、リング２２５０内の別のノードから（イントラリング(intra-ring)通信）、リングアーキテクチャ２２００内の別のリング内のノードから（インターリング(inter-ring)通信）、または非リング通信を介して受信することができる。
【０３０８】
方法２５００は、受信ノードが、メッセージを受信すべき次の適当なノードを判定するために先行ノードとの第１のキャッシングされた２ウェイ合意および後続ノードとの第２のキャッシングされた２ウェイ合意を参照する行為（行為２５０２）を含む。第１および第２のキャッシングされた２ウェイ合意は、少なくとも、先行ノードと後続ノードとの間の識別子空間に関する責任の分割を暗示する。例えば、ノード２２０１は、メッセージ２２５１、２２５２、２２５３、２２５４、および２２５６のいずれかを受信すべき次の適当なノードを判定するために、キャッシングされた３ウェイ合意２２２３および２２２４を参照することができる。
【０３０９】
キャッシングされた２ウェイ合意２２２３は、ノード２２０２（ＩＤ＝３０）が非占有識別子３９の責任を負うことを示すので、ノード２２０１は、ノード２２０２がメッセージ２２５２を処理すべき次の適当なノードであると判定する。キャッシングされた２ウェイ合意２２２３は、ノード２２０１（ＩＤ＝６４）が非占有識別子５５の責任を負うことを示すので、ノード２２０１は、それがメッセージ２２５１を処理すべき次の適当なノードであると判定する。キャッシングされた２ウェイ合意２２２４は、ノード２２０１（ＩＤ＝６４）が非占有識別子７４の責任を負うことを示すので、ノード２２０１は、それがメッセージ２２５４を処理すべき次の適当なノードであると判定する。キャッシングされた２ウェイ合意２２２４は、ノード２２０３（ＩＤ＝１０１）が非占有識別子９４の責任を負うことを示すので、ノード２２０１は、ノード２２０３がメッセージ２２５６を処理すべき次の適当なノードであると判定する。
【０３１０】
方法２５００は、次の適当なノードの判定に基づいて、次の適当なコンポーネントにメッセージを送信する行為（行為２５０３）を含む。例えば、ノード２２０１は、メッセージ２２５１、２２５２、２２５３、２２５４、および２２５６を処理すべき次の適当なノードの判定に基づいて、リング２２５０上の次の適当なコンポーネントにメッセージ２２５１、２２５２、２２５３、２２５４、および２２５６を送信することができる。
【０３１１】
例えば、ノード２２０１は、キャッシングされた２ウェイ合意２２２３が、ノード２２０２が非占有識別子３９の責任を負うことを示すので、メッセージ２２５２をノード２２０２に供給することができる。その後、ノード２２０２は、非占有識別子３９に対応するそのリソースハンドラインスタンスにメッセージ２２５２を供給することができる。ノード２２０１は、キャッシングされた２ウェイ合意２２２３が、ノード２２０１が非占有識別子５５の責任を負うことを示すので、非占有識別子５５に対応するそのリソースハンドラインスタンスにメッセージ２２５１を供給することができる。ノード２２０１は、キャッシングされた２ウェイ合意２２２４が、ノード２２０１が非占有識別子７４の責任を負うことを示すので、非占有識別子７４に対応するそのリソースハンドラインスタンスにメッセージ２２５４を供給することができる。ノード２２０１は、キャッシングされた２ウェイ合意２２２４が、ノード２２０３が非占有識別子９４の責任を負うことを示すので、メッセージ２２５６をノード２２０３に供給することができる。その後、ノード２２０３は、非占有識別子９４に対応するそのリソースハンドラインスタンスにメッセージ２２５６を供給することができる。
【０３１２】
識別子が、複数のキャッシングされた２ウェイ合意のキャッシングされたいずれにも含まれないときには、ノードは、宛先に向かう進行を行うためにルーティングテーブル（例えば、図３に示された）を参照することができる。例えば、ノード２２０１は、ＩＤ＝２０３への送達について示されたメッセージ２２５３を、ノード２２６１（ＩＤ＝２００）に送信することができる。次に、ノード２２６１は、その先行ノードおよび／または後続ノードに関するすべてのキャッシングされた２ウェイ合意を参照して、メッセージ２２５３を受信すべき次の適当なコンポーネントを判定することができる。
【０３１３】
（キャッシングされた合意の定式化）
リングを、時々、例えば、新しいノードがリングに参加するときまたは既存ノードがリングから離脱するときに（例えば、正常な除去を介して、ノード監視の結果として、アービトレータへの参照を介してなど）、再構成することができる。ノードが、リングの構成が変化したことを検出するときに、そのノードは、隣接ノードとのキャッシングされたルーティング合意を再定式化することができる。合意再定式化中に、ノードは、合意を再定式化するためのメッセージを除いて、すべての受信されたメッセージをキューイングすることができる。合意の定式化が完了した後に、ノードは、その合意に従ってメッセージを処理することができる。
【０３１４】
リングの再構成は、複数のルーティング合意を再定式化させる可能性がある。例えば、ノードがリングを離脱するときに、離脱するノードの両側の直接に隣接するノードは、以前には離脱するノードの責任であった非占有識別子の範囲の合意を形成することができる（したがって、潜在的に追加の非占有識別子の責任を得る）。この再定式化は、離脱するノードからの非占有識別子の範囲の一部の責任を、各直接に隣接するノードの非占有識別子の範囲に結合する。すなわち、各直接に隣接するノードは、離脱するノードの非占有識別子の範囲および離脱するノードの識別子の一部の責任を得る。
【０３１５】
図２３Ａから２３Ｄに、キャッシングされた２ウェイ合意を定式化するのを容易にする例のリングアーキテクチャ２３００を示す。図２３Ａに示されているように、ノード２３０１および２３０２は、責任境界２３１３（非占有識別子４７と非占有識別子４８との間）で非占有識別子範囲２３１２（すなわち、非占有識別子３１から６３まで）の責任を分割するキャッシングされた２ウェイ合意２３２３を定式化している。同様に、ノード２３０２および２３６２は、責任境界２３３３（非占有識別子１４と１５との間）で非占有識別子範囲２３１１（すなわち、非占有識別子２５５から２９まで）の責任を分割するキャッシングされた２ウェイ合意２３４３を定式化している。
【０３１６】
キャッシングされた２ウェイ合意２３２３および２３４３の定式化の後のあるときに、ノード２３０２は、リング２３５０を去ることができる（例えば、正常な除去を介して、ノード監視の結果として、アービトレータからの命令に基づいてなど）。ここで図２３Ｂを参照すると、ノード２３０２がリング２３５０を去った後に、以前にノード２３０２の責任であった非占有識別子の責任を負うノードはない。非占有識別子範囲２３１３（現在は非占有の識別子３０を含む、非占有識別子１５から４７まで）は、ノード２３０２がリング２３５０を去る前に責任を負っていた非占有識別子の範囲を表す。
【０３１７】
ノード２３０２がリング２３５０を去ることに応答して、ノード２３０１および２３６２は、新しい直接近傍ノードを識別することを試みる。ノード２３６２は、新しい直接後続ノード（すなわち、ノード２３６２に対して相対的にノード２３０２と同一の方向での直接近傍ノード）を識別することを試みる。ノード２３０１は、新しい直接先行ノード（すなわち、ノード２３０１に対して相対的にノード２３０２と同一の方向での直接近傍ノード）を識別することを試みる。図２３Ｂでは、ノード２３６２は、その新しい直接後続物としてノード２３０１を識別し、ノード２３０１は、その新しい直接先行物としてノード２３６２を識別する。
【０３１８】
新しい直接近傍ノードを識別したときに、ノード２３６２および２３０１は、非占有識別子範囲２３１４（現在は非占有の識別子３０を含む、非占有識別子２５５から６３まで）の責任を分割するキャッシングされた２ウェイ合意２３６３を定式化する。非占有識別子範囲２３１４は、非占有識別子範囲２３１３を含み、この非占有識別子範囲２３１３は、以前にはノード２３０２の責任であった。したがって、非占有識別子範囲２３１３の一部を、ノード２３０２がリング２３５０から離脱した後に、ノード２３６２またはノード２３０１のいずれかの責任にすることができる。
【０３１９】
したがって、責任境界２３５３（非占有識別子３１と非占有識別子３２との間）によって示されるように、ノード２３６２（ＩＤ＝２５４）およびノード２３０１（ＩＤ＝３０）は、キャッシングされた２ウェイ合意２３６３を定式化する。キャッシングされた２ウェイ合意２３６３に従って、ノード２３６２（ＩＤ＝２５４）は、それ自体ならびに非占有識別子２５５から３１までの責任を負い、ノード２３０１（ＩＤ＝６４）は、それ自体ならびに識別子範囲３２から６３までの責任を負う。ノード２３０１と２３６２との間の中点は、非占有識別子３１であるが、ノード２３６２は、各非占有識別子が単一のノードの責任になるように、非占有識別子３１の責任を割り当てられる。
【０３２０】
ノード２３０２の離脱とキャッシングされた２ウェイ合意２３６３の定式化との間の時間中に、ノード２３０１および２３６２は、２５５と６３との間の範囲内の識別子への送達について示されたメッセージを処理しない。そうではなく、ノード２３０１および２３６２は、キャッシングされた２ウェイ合意２３６３の定式化に関するメッセージを除いて、すべてのメッセージをキューイングする。キャッシングされた２ウェイ合意２３６３の定式化が完了した後に、ノード２３０１および２３６２は、キャッシングされた２ウェイ合意２３６３に従ってそれらのメッセージを処理することができる。
【０３２１】
新しいノードが２つの既存ノードの間でリングに参加するときには、各既存ノードは、新しいノードとのルーティング合意を定式化することができる（したがって、潜在的に、非占有識別子の一部の責任を放棄する）。この定式化は、本質的に、既存ノードが責任を負う非占有識別子の範囲を、参加するノードと既存ノードとの間で分割することができる。すなわち、各既存ノードは、潜在的に、参加するノードに、既存ノードの非占有識別子の一部の責任を与える。
【０３２２】
ここで図２３Ｃを参照すると、キャッシングされた２ウェイ合意２３６３の定式化の後のあるときに、ノード２３０４（ＩＤ＝４４）が、リング２３５０に参加することができる。ノード２３０４がリング２３５０に参加した後に、ノード２３６２は、その直接後続物としてノード２３０４を検出することができる。同様に、ノード２３０１は、その直接先行物としてノード２３０４を検出することができる。検出のそれぞれに応答して、非占有識別子範囲２３１４が、本質的に、非占有識別子範囲２３１５（非占有識別子２５５から４３まで）および非占有識別子範囲２３１６（非占有識別子４５から６３まで）に分割される。その後、新しいキャッシングされた２ウェイ合意を定式化して、非占有識別子範囲２３１５および２３１６の責任を分割することができる。
【０３２３】
ここで図２３Ｄを参照すると、新しい直接後続ノードとしてノード２３０４を識別した後に、ノード２３６２およびノード２３０４は、非占有識別子範囲２３１５（非占有識別子２５５から４３まで）の責任を分割するキャッシングされた２ウェイ合意２３９４を定式化する。非占有識別子範囲２３１５は、非占有識別子範囲２３１４の一部を含み、非占有識別子範囲２３１４は、以前にはノード２３６２の責任であったが、このケースでは、非占有識別子範囲２３１４の一部が、ノード２３０１の責任であった。したがって、非占有識別子範囲２３１４のうちでノード２３６２またはノード２３０１のいずれかの責任であった部分を、ノード２３０４がリング２３５０に参加するときにノード２３０４の責任にすることができる。
【０３２４】
したがって、責任境界２３９３（非占有識別子２３と非占有識別子２４との間）によって示されるように、ノード２３６２（ＩＤ＝２５４）およびノード２３０４（ＩＤ＝４４）は、キャッシングされた２ウェイ合意２３９４を定式化する。キャッシングされた２ウェイ合意２３９４に従って、ノード２３６２（ＩＤ＝２５４）は、それ自体ならびに非占有識別子２５５から２３までの責任を負い、ノード２３０４（ＩＤ＝４４）は、それ自体ならびに非占有識別子２４から４３までの責任を負う。ノード２３０４と２３６２との間の中点は、非占有識別子２３であるが、ノード２３６２は、各非占有識別子が単一のノードの責任になるように、非占有識別子２３の責任を割り当てられる。
【０３２５】
同様に、新しい直接先行ノードとしてノード２３０４を識別したときに、ノード２３０１および２３０４は、非占有識別子範囲２３１６（非占有識別子４５から６４まで）の責任を分割するキャッシングされた２ウェイ合意２３８３を定式化する。非占有識別子範囲２３１６は、以前にはノード２３０１の責任であった非占有識別子範囲２３１４の一部を含む。したがって、非占有識別子範囲２３１４のうちでノード２３０１の責任であった部分を、ノード２３０４がリング２３５０に参加するときにノード２３０４の責任にすることができる。
【０３２６】
したがって、責任境界２３７３（非占有識別子５４と非占有識別子５５との間）によって示されるように、ノード２３０４（ＩＤ＝４４）およびノード２３０１（ＩＤ＝６４）は、キャッシングされた２ウェイ合意２３８３を定式化する。キャッシングされた２ウェイ合意２３８３に従って、ノード２３０４（ＩＤ＝４４）は、それ自体ならびに非占有識別子４５から５４までの責任を負い、ノード２３０１（ＩＤ＝６４）は、それ自体ならびに識別子範囲５５から６３までの責任を負う。ノード２３０１と２３０４との間の中点は、非占有識別子５４であるが、ノード２３０４は、各非占有識別子が単一のノードの責任になるように、非占有識別子５４の責任を割り当てられる。
【０３２７】
ノード２３０４の参加とキャッシングされた２ウェイ合意２３９４の定式化との間の時間中に、ノード２３６２および２３０４は、２５５と４３との間の範囲内の識別子への送達について示されたメッセージを処理しない。そうではなく、ノード２３６２および２３０４は、キャッシングされた２ウェイ合意２３９４の定式化に関するメッセージを除くすべてのメッセージをキューイングする。キャッシングされた２ウェイ合意２３９４の定式化が完了した後に、ノード２３６２および２３０４は、キャッシングされた２ウェイ合意２３９４に従ってこれらのメッセージを処理することができる。
【０３２８】
同様に、ノード２３０４の参加とキャッシングされた２ウェイ合意２３８３の定式化との間の時間中に、ノード２３０４および２３０１は、４５と６３との間の範囲内の識別子への送達について示されたメッセージを処理しない。そうではなく、ノード２３０４および２３０１は、キャッシングされた２ウェイ合意２３８３の定式化に関するメッセージを除くすべてのメッセージをキューイングする。キャッシングされた２ウェイ合意２３８３の定式化が完了した後に、ノード２３０４および２３０１は、キャッシングされた２ウェイ合意２３８３に従ってこれらのメッセージを処理することができる。
【０３２９】
ノード２３０４の展望から、キャッシングされた２ウェイ合意２３９４とキャッシングされた２ウェイ合意２３８３との組合せは、本質的に、ノード２３０４とノード２３６２と２３０１との間の対応する３ウェイ合意（図示せず）を表すことができる。ノード２３０４の展望から、対応する表される３ウェイ合意は、ＩＤ＝２５４を含み、これからＩＤ＝６４まででこれを含む（割当済みおよび非占有）識別子の責任を定義する。
【０３３０】
図２６に、２ウェイ合意に参加する方法２６００の一例の流れ図を示す。方法２６００を、図２３Ａから２３Ｄまでのノードおよび合意に関して述べる。
【０３３１】
方法２６００は、現行ノードが、ノードのリングの構成が変化したことの表示にアクセスする行為（この表示は、少なくとも現行ノードと直接近傍ノードとの間のそのリング上の非占有識別子に関する責任を分割する２ウェイ合意を定式化する必要を示す）（行為２６０１）を含む。例えば、図２３Ａおよび２３Ｂを参照すると、ノード２３０１および／またはノード２３６２は、例えば、ノード２３０２から、ノード２３０２の監視を介して、またはアービトレータから、ノード２３０２がリング２３５０から離脱したことの表示にアクセスすることができる。ノード２３０２がリング２３５０から離脱することの表示は、ノード２３０１および／またはノード２３６２に、非占有識別子範囲２３１４（非占有識別子２５５から６３まで）の責任を分割する２ウェイ合意を定式化する必要を示す。
【０３３２】
その代わりに、図２３Ｃおよび２３Ｄを参照すると、ノード２３０１は、ノード２３０４がリング２３５０に参加することの表示（例えば、ノード２３０４の参加プロセスの一部として送信される）にアクセスすることができる。ノード２３０４がリング２３５０に参加することの表示は、ノード２３０１に、非占有識別子範囲２３１６（非占有識別子４５から６３まで）の責任を分割する２ウェイ合意を定式化する必要を示す。同様に、ノード２３６２は、ノード２３０４がリング２３５０に参加したことの表示（例えば、ノード２３０４の参加プロセスの一部として送信される）にアクセスすることができる。ノード２３０４がリング２３５０に参加することの表示は、ノード２３６２に、非占有識別子範囲２３１５（非占有識別子２５５から４３まで）の責任を分割する２ウェイ合意を定式化する必要を示す。
【０３３３】
方法２６００は、現行ノードおよび直接近傍ノードが、現行ノードと直接近傍ノードとの間の責任境界に合意するすなわち、現行ノードと直接近傍ノードとの間の非占有識別子の責任を分割する行為（行為２６０２）を含む。現行ノードと責任境界との間の非占有識別子は、現行ノードの責任であり、責任境界と直接近傍ノードとの間の非占有識別子は、直接近傍ノードの責任である。
【０３３４】
例えば、図２３Ｂを参照すると、ノード２３０１およびノード２３６２は、責任境界２３５３に合意することができ、責任境界２３５３は、本質的に非占有識別子３１と３２との間にある。したがって、ノード２３０１と責任境界２３５３との間の非占有識別子（すなわち、非占有識別子３２から６３まで）は、ノード２３０１の責任である。同様に、責任境界２３５３とノード２３６２との間の非占有識別子（すなわち、非占有識別子２５５から３１まで）は、ノード２３６２の責任である。
【０３３５】
図２３Ｄを参照すると、ノード２３０１およびノード２３０４は、責任境界２３７３に合意することができ、責任境界２３７３は、本質的に非占有識別子５４と５５との間にある。したがって、ノード２３０１と責任境界２３７３との間の非占有識別子（すなわち、識別子５５から６３まで）は、ノード２３０１の責任である。同様に、責任境界２３７３とノード２３０４との間の非占有識別子（すなわち、非占有識別子４５から５４まで）は、ノード２３０４の責任である。
【０３３６】
引き続き図２３Ｄを参照すると、ノード２３０４およびノード２３６２は、責任境界２３９３に合意することができ、責任境界２３９３は、本質的に非占有識別子２３と２４との間にある。したがって、ノード２３０４と責任境界２３９３との間の識別子（すなわち、非占有識別子２４から４３まで）は、ノード２３０４の責任である。同様に、責任境界２３９３とノード２３６２との間の非占有識別子（すなわち、非占有識別子２５５から２３まで）は、ノード２３６２の責任である。
【０３３７】
図６および次の議論は、本発明を実施できる適切なオペレーティング環境の短い全般的な説明を提供することを意図されたものである。必要ではないが、本発明を、プログラムモジュールなど、コンピュータシステムによって実行されるコンピュータ実行可能命令の全般的な文脈で説明する。一般に、プログラムモジュールは、特定のタスクを実行するか特定の抽象データ型を実施するルーチン、プログラム、オブジェクト、コンポーネント、データ構造、および類似物を含む。コンピュータ実行可能命令、関連するデータ構造、およびプログラムモジュールは、本明細書で開示される方法の行為を実行するプログラムコード手段の一例を提示する。
【０３３８】
図６を参照すると、本発明を実施する一例のシステムは、処理ユニット６２１、システムメモリ６２２、およびシステムメモリ６２２を含む様々なシステムコンポーネントを処理ユニット６２１に結合するシステムバス６２３を含むコンピュータシステム６２０の形の汎用コンピューティングデバイスを含む。処理ユニット６２１は、本発明の特徴を含む、コンピュータシステム６２０の特徴を実施するように設計されたコンピュータ実行可能命令を実行することができる。システムバス６２３は、メモリバスもしくはメモリコントローラ、周辺バス、および様々なバスアーキテクチャのいずれかを使用するローカルバスを含む複数のタイプのバス構造のいずれにもすることができる。システムメモリは、読み取り専用メモリ（「ＲＯＭ」）６２４およびランダムアクセスメモリ（「ＲＡＭ」）６２５を含む。スタートアップ中などにコンピュータシステム６２０内の要素の間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム（「ＢＩＯＳ」）６２６を、ＲＯＭ６２４に格納することができる。
【０３３９】
コンピュータシステム６２０には、磁気ハードディスク６３９から読み取り、これに書き込む磁気ハードディスクドライブ６２７、リムーバブル磁気ディスク６２９から読み取り、またはこれに書き込む磁気ディスクドライブ６２８、例えば、ＣＤ−ＲＯＭまたは他の光学媒体などのリムーバブル光学ディスク６３１から読み取り、またはこれに書き込む光ディスクドライブ６３０をも含めることができる。磁気ハードディスクドライブ６２７、磁気ディスクドライブ６２８、および光ディスクドライブ６３０は、それぞれハードディスクドライブインターフェース６３２、磁気ディスクドライブインターフェース６３３、および光ドライブインターフェース６３４によってシステムバス６２３に接続される。ドライブおよびそれらに関連するコンピュータ可読媒体は、コンピュータシステム６２０のコンピュータ実行可能命令、データ構造、プログラムモジュール、および他のデータの不揮発性ストレージをもたらす。本明細書で説明する例の環境は、磁気ハードディスク６３９、リムーバブル磁気ディスク６２９、およびリムーバブル光学ディスク６３１を使用するが、磁気カセット、フラッシュメモリカード、デジタル多用途ディスク、ベルヌーイカートリッジ、ＲＡＭ、ＲＯＭ、および類似物を含む、データを格納するための他のタイプのコンピュータ可読媒体を使用することができる。
【０３４０】
オペレーティングシステム６３５、１つまたは複数のアプリケーションプログラム６３６、他のプログラムモジュール６３７、およびプログラムデータ６３８を含む１つまたは複数のプログラムモジュールを含むプログラムコード手段を、ハードディスク６３９、磁気ディスク６２９、光学ディスク６３１、ＲＯＭ６２４、またはＲＡＭ６２５に格納することができる。ユーザは、キーボード６４０、ポインティングデバイス６４２、または例えばマイクロホン、ジョイスティック、ゲームパッド、スキャナ、もしくは類似物などの他の入力デバイス（図示せず）を介してコンピュータシステム６２０にコマンドおよび情報を入力することができる。上記および他の入力デバイスを、システムバス６２３に結合された入出力インターフェース６４６を介して処理ユニット６２１に接続することができる。入出力インターフェース６４６は、例えば、シリアルポートインターフェース、ＰＳ／２インターフェース、パラレルポートインターフェース、Ｕｎｉｖｅｒｓａｌ Ｓｅｒｉａｌ Ｂｕｓ（「ＵＳＢ」）インターフェース、または電気電子技術者協会（「ＩＥＥＥ」）１３９４インターフェース（すなわち、ＦｉｒｅＷｉｒｅインターフェース）などの様々な異なるインターフェースのいずれかを論理的に表し、あるいは、異なるインターフェースの組合せを論理的に表すことすらできる。
【０３４１】
モニタ６４７または他のディスプレイデバイスも、ビデオインターフェース６４８を介してシステムバス６２３に接続される。スピーカ６６９または他のオーディオ出力デバイスも、オーディオインターフェース６４９を介してシステムバス６２３に接続される。例えば、プリンタなどの他の周辺出力デバイス（図示せず）をコンピュータシステム６２０に接続することもできる。
【０３４２】
コンピュータシステム６２０は、例えば、オフィス全体または企業全体のコンピュータネットワーク、ホームネットワーク、イントラネット、および／またはインターネットなどのネットワークに接続可能である。コンピュータシステム６２０は、そのようなネットワークを介して、例えば、リモートコンピュータシステム、リモートアプリケーション、および／またはリモートデータベースなどの外部リソースとデータを交換することができる。
【０３４３】
コンピュータシステム６２０は、ネットワークインターフェース６５３を含み、このネットワークインターフェース６５３を介して、コンピュータシステム６２０は、外部ソースからデータを受信し、かつ／または外部ソースにデータを送信する。図６に示されているように、ネットワークインターフェース６５３は、リンク６５１を介するリモートコンピュータシステム６８３とのデータの交換を容易にする。ネットワークインターフェース６５３は、例えば、ネットワークインターフェースカードおよび対応するネットワークドライバインターフェース仕様（「ＮＤＩＳ」）スタックなど、１つまたは複数のソフトウェアおよび／またはハードウェアモジュールを論理的に表すことができる。リンク６５１は、ネットワークの一部（例えば、イーサネット（登録商標）セグメント）を表し、リモートコンピュータシステム６８３は、ネットワークのノードを表す。
【０３４４】
同様に、コンピュータシステム６２０は、入出力インターフェース６４６を含み、この入出力インターフェース６４６を介して、コンピュータシステム６２０は、外部ソースからデータを受け取り、かつ／または外部ソースにデータを送る。入出力インターフェース６４６は、リンク６５９を介してモデム６５４（例えば、標準モデム、ケーブルモデム、またはデジタル加入者回線（「ＤＳＬ」）モデム）に結合され、このモデム６５４を介して、コンピュータシステム６２０は、外部ソースからデータを受信し、および／または外部ソースにデータを送信する。図６に示されているように、入出力インターフェース６４６およびモデム６５４は、リンク６５２を介するリモートコンピュータシステム６９３とのデータの交換を容易にする。リンク６５２は、ネットワークの一部を表し、リモートコンピュータシステム６９３は、ネットワークのノードを表す。
【０３４５】
図６は、本発明に適切なオペレーティング環境を表すが、本発明の原理は、必要な場合に適切な変更を伴って本発明の原理を実施できるすべてのシステムで使用することができる。図６に示された環境は、例示的にすぎず、決して、本発明の原理を実施できる様々な環境の小さい部分すら表さない。
【０３４６】
本発明によれば、ノード、アプリケーションレイヤ、および他の下位レイヤ、ならびにルーティングテーブルおよびノードＩＤを含む関連するデータを、コンピュータシステム６２０に関連するコンピュータ可読媒体のいずれにも格納し、それからアクセスすることができる。例えば、そのようなモジュールの諸部分および関連するプログラムデータの諸部分を、システムメモリ６２２での格納のために、オペレーティングシステム６３５、アプリケーションプログラム６３６、プログラムモジュール６３７、および／またはプログラムデータ６３８に含めることができる。
【０３４７】
例えば磁気ハードディスク６３９などの大容量記憶デバイスが、コンピュータシステム６２０に結合されるときに、そのようなモジュールおよび関連するプログラムデータを、その大容量記憶デバイスに格納することもできる。ネットワーク化された環境では、コンピュータシステム６２０に関係して図示されたプログラムモジュールまたはその諸部分を、リモートコンピュータシステム６８３および／またはリモートコンピュータシステム６９３に関連するシステムメモリおよび／または大容量記憶デバイスなどのリモートメモリストレージデバイスに格納することができる。そのようなモジュールの実行を、前述のように分散環境内で実行することができる。
【０３４８】
（ノードのリングの参加および離脱）
図２７に、本発明の原理を使用できるリングアーキテクチャ２７００を示す。リングアーキテクチャ２７００は、ノードのリング２７０５を含む。いくつかの実施形態で、ノードのリング２７０５は、上記図２３Ｃのリング２３５０に類似するかこれと同一とすることができる。ノードのリング２７０５は、参加するノード２７１０を含むことができ、この参加するノード２７１０は、直接に隣接するノード１（２７２０）と直接に隣接するノード２（２７３０）との間でリングに参加することを試みている可能性がある。いくつかの実施形態で、参加するノード２７１０は、図２３Ｃで説明したものに類似する形でノードのリング２７０５に参加することができ、図２３Ｃでは、参加するノードは、ノード２３０１と２３６２との間でキャッシングされた合意に基づいて識別子範囲を判定する。ノードの参加中にリング一貫性を維持する方法を、下でおよび図２７のノードおよびデータアイテムを参照してさらに詳細に説明する。
【０３４９】
図２８に、参加するノードがノードのリングに参加するときのリング一貫性を維持する方法２８００の一例の流れ図を示す。いくつかの実施形態で、方法２８００は、複数のサブ方法を組み込み、各サブ方法は、異なるノードの観点から生じる。これから、方法２８００を、環境２７００のコンポーネントおよびデータならびに図３０の状態図３０００を頻繁に参照して説明する。
【０３５０】
方法２８００は、参加するノードが、リング上の複数の他のノードの近傍を検出する行為（近傍は、少なくとも直接に隣接する先行ノードおよび直接に隣接する後続ノードを含む）（行為２８０５）を含む。いくつかの場合に、参加するノード２７１０は、リング２７０５上の複数の他のノードの近傍を検出し、かつ／または確立することができ、ここで、近傍は、直接に隣接するノード２７２０および他の直接に隣接するノード２７３０を含む。状態図３０００内など、いくつかの実施形態で、参加するノード３００５は、ステップ１で導入メッセージ（例えば、導入３００６）を送信することによって近傍を確立する。そのような導入メッセージを受信する各ノードは、状態図のステップ２で肯定応答（ＡＣＫ）メッセージ（例えば、ＡＣＫ ３００７）を応答することができる。導入３００６は、参加するノードを識別するのに使用される情報の１つまたは複数の部分を含み、参加するノード３００５がリング２７０５に参加するつもりであることを示すことができる。
【０３５１】
参加するノードを、参加するノード３００５によって戻って受信されるＡＣＫメッセージから、どのノードがリング上でそれに最も近いかを判定するように構成することができる。例えば、各ＡＣＫメッセージは、リング上のノード位置を示す識別子範囲および／または位置識別子と、ノードが責任を有する範囲とを含むことができる。したがって、状態図３０００で、参加するノード３００５は、直接に隣接するノード３（３０１０）が、参加するノードの直接に隣接する先行ノードであり、直接に隣接するノード５（３０１５）が、参加するノードの直接に隣接する後続ノードであることを判定することができる。さらに、参加するノード３００５は、隣接ノード１（３０２０）および隣接ノード２（３０２５）が、参加するノードと同一リング上にあるが、必ずしも参加するノードの直接に最も近いノードではないことを判定することができる。したがって、近傍確立３０５０を、例示的状態図３０００に従って達成することができる。
【０３５２】
方法２８００は、参加するノードが、直接に隣接する先行ノードおよび直接に隣接する後続ノードの中から選択された直接に隣接するノードのうちの１つに、参加するノードが参加するノードと選択された直接に隣接するノードとの間のｉｄ区間の一部のｉｄ区間オーナーシップをとる意図を示す行為（行為２８１０）を含む。例えば、参加するノード２７１０は、直接に隣接するノード１（２７２０）および直接に隣接するノード２（２７３０）の中から選択された直接に隣接するノード１（２７２０）に、参加するノード２７１０が、参加するノード２７１０と選択された直接に隣接するノード２７２０との間のｉｄ空間の一部のｉｄ空間オーナーシップをとる意図を示すことができる。上記のように、ｉｄ空間は、所与のノードが責任を負う識別子範囲（非占有または他の）を含むことができる。例えば、ｉｄ空間は、所与のノードが責任を負うノード識別子の数値範囲を含むことができる。
【０３５３】
状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、直接に隣接する先行ノードおよび直接に隣接する後続ノードの中から選択された直接に隣接するノードのうちの１つに、参加するノードが参加するノード３００５と選択された直接に隣接するノード３０１０との間のｉｄ区間の一部のｉｄ区間オーナーシップをとる意図を示す行為は、直接に隣接する先行ノード３０１０および直接に隣接する後続ノード３０１５の中から選択された直接に隣接するノード３０１０に、トークン要求３０３１を送信する行為を含み、このトークン要求は、そのノード識別子を有するノードだけが応答できるようにするノード識別子と、第１タイムトゥリブ持続時間値３０３１とを含み、第１タイムトゥリブ持続時間値は、参加するノード３００５が、選択された直接に隣接するノードとの監視関係がアクティブであると仮定できる持続時間を示す。
【０３５４】
いくつかの場合に、トークン要求メッセージ３０３１は、参加するノード３００５の期待されるオーナーシップ範囲の更新された状況を示すマーカーを含む。タイムトゥリブ値（ＴＴＬ）および関係監視は、実質的に図２０の方法２０００で説明したものと同一とすることができる。
【０３５５】
方法２８００は、参加するノードが、選択された直接に隣接するノードを監視する意図を示す行為（行為２８１５）を含む。例えば、参加するノード２７１０が、監視表示２７１２で示された直接に隣接するノード１（２７２０）を監視する意図を示すことができる。そのような監視関係では、参加するノード２７１０は、ある範囲のノード識別子を監視することに合意することができる。いくつかの場合に、範囲は、直接に隣接するノード２７２０と直接に隣接するノード２７３０との識別子の間の識別子を含むことができる。図２７には示されていないが、いくつかの実施形態で、監視表示２７１２およびｉｄ空間オーナーシップ表示を、単一のメッセージに組み合わせることができる。
【０３５６】
方法２８００は、第１の選択された直接に隣接するノードが、参加するノードが参加するノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップをとる意図を示す表示を参加するノードから受信する行為（行為２８２０）を含む。例えば、直接に隣接するノード１（２７２０）は、参加するノード２７１０が、参加するノードとノード２７２０との間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノード２７１０の意図を示す表示（例えば、ｉｄ空間オーナーシップ表示２７１１）を参加するノード２７１０から受信することができる。
【０３５７】
方法２８００は、第１の選択された直接に隣接するノードが、参加するノードの、選択された直接に隣接するノードを監視する意図の表示を参加するノードから受信する行為（行為２８２５）を含む。例えば、直接に隣接するノード１（２７２０）は、参加するノードの、直接に隣接するノード２７２０を監視する意図の表示（例えば、監視表示２７１２）を参加するノード２７１０から受信することができる。
【０３５８】
方法２８００は、第１の選択された直接に隣接するノードが、参加するノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノードの意図の受入を示す表示を参加するノードに送信する行為（行為２８３０）を含む。例えば、直接に隣接するノード１（２７２０）は、参加するノード２７１０と直接に隣接するノード２７２０との間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノードの意図の受入を示すｉｄ空間オーナーシップ受入２７７３（例えば、ｉｄ空間オーナーシップ受入２７７３）を送信することができる。
【０３５９】
方法２８００は、第１の選択された直接に隣接するノードが、選択された直接に隣接するノードを監視することの参加するノードの意図の受入を示す第２表示を参加するノードに送信する行為（行為２８３１）を含む。例えば、直接に隣接するノード１（２７２０）は、選択された直接に隣接するノード２７２０を監視することの参加するノード２７１０の意図の受入を示す監視受入２７８３を送信することができる。
【０３６０】
方法２８００は、第１の選択された直接に隣接するノードが、参加するノードを監視することの第１の選択された直接に隣接するノードの意図を示す第３表示を参加するノードに送信する行為（行為２８３２）を含む。例えば、直接に隣接するノード１（２７２０）は、参加するノード２７１０を監視することの第１の選択された直接に隣接するノード２７２０の意図を示す監視表示２７９３を参加するノード２７１０に送信することができる。いくつかの実施形態で、第１、第２、および第３の表示を、単一の表示に組み合わせることができる。それに加えてまたはその代わりに、第１、第２、および第３の表示の任意の組合せを、単一の組合せに組み合わせることができる（例えば、第１および第３または第２および第３）。
【０３６１】
方法２８００は、参加するノードが、参加するノードと選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノードの意図の受入を示す第１表示を選択された直接に隣接するノードから受信する行為（行為２８３５）を含む。例えば、参加するノード２７１０は、参加するノード２７１０と直接に隣接するノード２７２０との間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノードの意図の受入を示すｉｄ空間オーナーシップ受入２７７３を直接に隣接するノード１（２７２０）から受信することができる。
【０３６２】
方法２８００は、参加するノードが、選択された直接に隣接するノードを監視することの参加するノードの意図の受入を示す第２表示を選択された直接に隣接するノードから受信する行為（行為２８３６）を含む。例えば、参加するノード２７１０は、選択された直接に隣接するノード２７２０を監視することの参加するノードの意図の受入を示す監視受入２７８３を選択された直接に隣接するノード２７２０から受信することができる。
【０３６３】
方法２８００は、参加するノードが、参加するノードを監視することの第１の選択された直接に隣接するノードの意図を示す第３表示を選択された直接に隣接するノードから受信する行為（行為２８３７）を含む。例えば、参加するノード２７１０は、参加するノード２７１０を監視することの選択された直接に隣接するノードの意図を示す監視表示２７９３を選択された直接に隣接するノード２７２０から受信することができる。いくつかの場合に、第１、第２、および第３の表示を、単一の表示に組み合わせることができる。それに加えてまたはその代わりに、第１、第２、および第３の表示の任意の組合せを、単一の組合せに組み合わせることができる。
【０３６４】
状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、参加するノードと選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップをとることの参加するノードの意図の受入を示し、参加するノード３００５を監視することの選択された直接に隣接するノード３０１０の意図を示す表示を選択された直接に隣接するノード３０１０から受信する行為は、選択された直接に隣接するノード３０１０から第１トークン転送３０３２を受信する行為を含み、第１トークン転送は、参加するノード３００５と選択された直接に隣接するノード３０１０との間のノードのリング内の非占有ノード識別子の参加するノードのオーナーシップ範囲と、第２タイムトゥリブ持続時間値３０３２（選択された直接に隣接するノードが、参加するノード３００５との監視関係がアクティブであると仮定できる持続時間を示す）と、選択された直接に隣接するノード３０１０が参加するノードを監視することを示す第１確立許可とを含む。
【０３６５】
方法２８００は、参加するノードが、参加するノードを監視することの選択された直接に隣接するノードの意図の受入を示す行為（行為２８４０）を含む。例えば、参加するノード２７１０は、参加するノード２７１０を監視することの第１の選択された直接に隣接するノード１（２７２０）の意図の受入を監視合意２７１４で示すことができる。状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、参加するノード３００５を監視することの選択された直接に隣接するノード３０１０の意図の受入を示す行為は、参加するノード３００５を監視することの選択された直接に隣接するノードの意図を肯定応答する肯定応答メッセージ３０３３を選択された直接に隣接するノード３０１０に送信する行為を含む。
【０３６６】
もう一度図２７および２８を参照すると、方法２８００は、第１の選択された直接に隣接するノードが、参加するノード２７１０を監視することの第１の選択された直接に隣接するノードの意図の受入を示す表示を参加するノード２７１０から受信する行為（行為２８４５）を含む。例えば、直接に隣接するノード２７２０は、直接に隣接するノード２７２０との一方向監視関係への参加に合意することの合意（例えば、監視合意２７１４）を参加するノード２７１０から受信することができる。
【０３６７】
いくつかの実施形態で、選択された直接に隣接するノード２７２０は、それに加えてまたはその代わりに、第２の選択された直接に隣接するノードとのすべての監視関係を終了することの第１ノードの意図を第２の選択された直接に隣接するノードに示す行為と、第１の選択された直接に隣接するノードとのすべての監視関係を終了することの第２ノードの意図を示す表示を第２の選択された直接に隣接するノードから受信する行為と、第２のノードの終了する意図を肯定応答する行為とを実行することができる。例えば、直接に隣接するノード１（２７２０）は、直接に隣接するノード２（２７３０）に、ノード２（２７３０）とのすべての監視関係を終了することのノード１の意図を示すことができる。直接に隣接するノード１（２７２０）は、ノード１とのすべての監視関係を終了することのノード２の意図を示す表示をノード２（２７３０）から受信することもできる。直接に隣接するノード１（２７２０）は、ノード２の終了する意図を肯定応答することもできる。
【０３６８】
状態図３０００内などのいくつかの場合に、直接に隣接するノード３（３０１０）を、状態図のステップ５（３０３４）でノード５（３０１５）とのすべての監視関係を終了することのノード３の意図を直接に隣接するノード５（３０１５）に示すように構成することができる。直接に隣接するノード３（３０１０）は、状態図のステップ６（３０３５）で、ノード３とのすべての監視関係を終了することのノード５の意図を示す表示をノード５（３０１５）から受信することもできる。これは、いくつかの実施形態で３０３４を肯定応答するように働くこともできる。直接に隣接するノード３（３０１０）は、状態図のステップ７（３０３６）で、ノード５の終了する意図を肯定応答することもできる。状態図３０００のステップ（１〜８）が、直列にまたは並列に発生し得ることに留意されたい。したがって、いくつかの実施形態で、例えば（５）というラベルを付けられたすべてのステップが、同時に発生することができ、他のステップが、直列に発生することができる。直列または並列に実行されるステップの任意の組合せが可能である。
【０３６９】
いくつかの実施形態で、方法２８００は、参加するノードから導入メッセージ（参加するノードによって所有されるものとして示されるノード識別子の期待されるオーナーシップ範囲を含む）を受信するオプションの行為と、参加するノードに肯定応答メッセージ（参加するノードによって識別されるノード識別子の範囲が、選択された隣接するノードのノード識別子の範囲と一貫することの表示を含む）を送信するオプションの行為とをも含む。いくつかの場合に、ノード識別子の範囲は、導入メッセージおよび肯定応答メッセージのどちらにも含まれないものとすることができる。そうではなく、ノード識別子の範囲を、メッセージを送信したか受信したノードによる受信または送信のときに計算することができる。
【０３７０】
方法２８００は、直接に隣接する先行ノードおよび直接に隣接する後続ノードの中から選択された他の直接に隣接するノードが、参加するノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを参加するノードに示す行為（行為２８５０）を含む。例えば、直接に隣接するノード１（２７２０）および直接に隣接するノード２（２７３０）の中から選択された直接に隣接するノード２（２７３０）は、参加するノード２７１０と直接に隣接するノード２７３０との間のｉｄ空間の一部のｉｄ空間オーナーシップを表示するｉｄ空間オーナーシップ表示２７８４を参加するノード２７１０に示すことができる。
【０３７１】
方法２８００は、他の直接に隣接するノードが、参加するノードを監視することの、他の直接に隣接するノードの意図を示す行為（行為２８５１）を含む。例えば、直接に隣接するノード２（２７３０）が、参加するノード２７１０を監視することのノード２の意図（２７９４）を示すことができる。
【０３７２】
方法２８００は、参加するノードが、参加するノードと他の直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを示す表示を他の直接に隣接するノードから受信する行為（行為２８５５）を含む。例えば、参加するノード２７１０は、参加するノード２７１０と直接に隣接するノード２７３０との間のｉｄ空間の一部のｉｄ空間オーナーシップを示すｉｄ空間オーナーシップ表示２７８４を直接に隣接するノード２（２７３０）から受信することができる。
【０３７３】
方法２８００は、参加するノードが、参加するノードを監視することの他の直接に隣接するノードの意図を示す表示を他の直接に隣接するノードから受信する行為（行為２８５６）を含む。例えば、参加するノード２７１０は、参加するノード２７１０を監視することの他の直接に隣接するノードの意図を示す監視表示２７９４を他の直接に隣接するノード２７３０から受信することができる。
【０３７４】
状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、参加するノード３００５と他の直接に隣接するノード３０１５との間のｉｄ空間の一部のｉｄ空間オーナーシップを示す表示および参加するノードを監視することの他の直接に隣接するノードの意図を示す表示を他の直接に隣接するノード３０１５から受信する行為は、第３タイムトゥリブ持続時間値３０３７を受信する行為を含み、第３タイムトゥリブ持続時間値は、他の直接に隣接するノード３０１５が、参加するノード３００５との監視関係がアクティブであると仮定できる持続時間を示す。いくつかの実施形態で、参加するノードは、ステップ６で他の直接に隣接するノード３０１５から第２トークン転送３０３７を受信し、第２トークン転送は、参加するノード３００５と他の直接に隣接するノード３０１５との間の非占有ノード識別子の参加するノードのオーナーシップ範囲を含む。他の場合に、オーナーシップ範囲は、参加するノードまたは他の直接に隣接するノードのいずれかまたはこの両方によって計算することができる。
【０３７５】
もう一度図２７および２８を参照すると、方法２８００は、参加するノードが、参加するノードと他の直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノードの意図を他の直接に隣接するノードに示す行為（行為２８６０）を含む。例えば、参加するノード２７１０は、参加するノード２７１０と直接に隣接するノード２７３０との間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノード２７１０の意図を直接に隣接するノード２（２７３０）に示す（例えば、ｉｄ空間オーナーシップ表示２７２１で）ことができる。
【０３７６】
状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、参加するノード３００５と他の直接に隣接するノード３０１５との間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノードの意図を他の直接に隣接するノード３０１５に示す行為は、参加するノード３００５と他の直接に隣接するノード３０１５との間で第２オーナーシップ範囲を確立する確立要求（ステップ７の３０３８）を送信する行為を含み、確立要求３０３８は、第４タイムトゥリブ持続時間３０３８（参加するノード３００５が、他の直接に隣接するノード３０１５との監視関係がアクティブであると仮定できる持続時間を示す）と、参加するノードが他の直接に隣接するノード３０１５を監視することを示す第３確立許可とを含む。いくつかの実施形態で、確立要求３０３８は、参加するノード３００５と他の直接に隣接するノード３０１５との間の第２オーナーシップ範囲の表示を表すこともできる。他の場合に、上記のように、この範囲を、ノードのリング２７０５上のノードの任意の直接に隣接する対によって計算することができる。
【０３７７】
方法２８００は、参加するノードが、他の直接に隣接するノードを監視する意図を表示する行為（行為２８６５）を含む。例えば、参加するノード２７１０は、直接に隣接するノード２（２７３０）を監視する意図を表示する（例えば、監視表示２７２２を介して）ことができる。状態図３０００内などのいくつかの実施形態で、参加するノード３００５が、参加するノード３００５と他の直接に隣接するノード３０１５との間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノードの意図を他の直接に隣接するノード３０１５に示す行為は、参加するノード３００５と他の直接に隣接するノード３０１５との間の第２オーナーシップ範囲を確立する確立要求３０３８を送信する行為を含み、確立要求３０３８は、参加するノードと他の直接に隣接するノードとの間の第２オーナーシップ範囲と、第４タイムトゥリブ持続時間３０３８（参加するノードが、他の直接に隣接するノードとの監視関係がアクティブであると仮定できる持続時間を示す）と、参加するノードが他の直接に隣接するノードを監視することを示す第３確立許可３０３８とを含む。
【０３７８】
方法２８００は、他の直接に隣接するノードが、参加するノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノードの意図の表示を受信する行為（行為２８７０）を含む。例えば、直接に隣接するノード２（２７３０）は、参加するノード２７１０と直接に隣接するノード２７３０との間のｉｄ空間の一部のｉｄ空間オーナーシップを確立することの参加するノードの意図を示すｉｄ空間オーナーシップ表示２７２１を受信することができる。
【０３７９】
方法２８００は、他の直接に隣接するノードが、第１の選択された直接に隣接するノードを監視することの参加するノードの意図の表示を受信する行為（行為２８７５）を含む。例えば、直接に隣接するノード２（２７３０）は、直接に隣接するノード２７３０を監視することの参加するノードの意図を示す監視表示２７２２を受信することができる。
【０３８０】
方法２８００は、他の直接に隣接するノードが、参加するノードを監視する、その他のノードの意図を参加するノードに示す行為（行為２８８０）を含む。例えば、直接に隣接するノード２（２７３０）は、参加するノード２７１０を監視することの直接に隣接するノードの意図を参加するノード２７１０に示す（例えば、監視表示２７９４を介して）ことができる。
【０３８１】
いくつかの場合に、直接に隣接するノード２（２７３０）は、それに加えてまたはその代わりに、第１の選択された直接に隣接するノードとのすべての監視関係を終了することの第２ノードの意図を示す表示を第２の選択された直接に隣接するノードから受信する行為と、第２の選択された直接に隣接するノードとのすべての監視関係を終了することの第１ノードの意図を第２の選択された直接に隣接するノードに示す行為と、第１ノードの終了する意図を肯定応答する肯定応答を受信する行為とを実行することができる。他の直接に隣接するノードは、第２の選択された直接に隣接するノードからの表示を肯定応答することもできる。例えば、直接に隣接するノード２（２７３０）は、直接に隣接するノード１（２７２０）から、ノード２とのすべての監視関係を終了することのノード１の意図を示す表示を受信することができる。ノード２（２７３０）は、ノード２の終了する意図を肯定応答する肯定応答（状態図３０００の３０３６）を受信することもできる。ノード２（２７３０）は、ノード１（２７２０）からの表示を肯定応答することもできる。
【０３８２】
方法２８００は、参加するノードが、参加するノードを監視することの他の直接に隣接するノードの意図を示す表示を他の直接に隣接するノードから受信する行為（行為２８８５）を含む。例えば、参加するノード２７１０は、参加するノード２７１０を監視することの他の直接に隣接するノードの意図を示す監視表示２７９４を直接に隣接するノード２（２７３０）（例えば、監視）から受信することができる。状態図３０００内などのいくつかの実施形態で、参加するノードが、参加するノードを監視することの他の直接に隣接するノードの意図を示す表示を他の直接に隣接するノードから受信する行為は、確立要求に関する第４確立許可（例えば、ステップ８の３０３９）を受信する行為を含み、第４確立許可は、他の隣接するノード３０１５が参加するノード３００５を監視することを示す。
【０３８３】
さらに、参加するノード２７１０は、リング上のノードのうちの少なくとも１つ（例えば、直接に隣接するノード１（２７２０））から否定応答（ＮＡＫ）メッセージを受信する場合があり、ここで、ＮＡＫメッセージは、ＮＡＫ送信側の、リングのビューの表示を含む。ＮＡＫ送信側の、近傍のビューを使用することによって、参加するノード２７１０は、ＮＡＫ送信側の、リングのビューに基づいて、その近傍のビューを更新することができる。
【０３８４】
図２９に、リービングノードがノードのリングを去るときにリング一貫性を維持する方法２９００の一例の流れ図を示す。方法２９００を、環境２７００のコンポーネントおよびデータならびに図３１の状態図３１００を頻繁に参照して説明する。
【０３８５】
方法２９００は、第１の選択された直接に隣接するノードが、ノードのリングを去るというリービングノードの行為の表示を受信する行為（行為２９１０）を含む。例えば、直接に隣接するノード３（３１１０）は、リング上の任意のノードから（例えば、リービングノード４（３１０５）から）、ノードのリングを去るというリービングノード３１０５の行為を示す表示を受信することができる。いくつかの場合に、リービングノード３１０５は、表示が受信されるときにノードのリングを既に去っている場合がある。あるいは、リービングノード３１０５が、去る過程にあるまたはノードのリングを去ることを計画しているのいずれかである場合がある。いくつかの実施形態で、第１の選択された直接に隣接するノード３１１０が、リービングノード３１０５がノードのリングを去ろうとしていることの表示を受信する行為は、第１の選択された直接に隣接するノード３１１０が、リービングノード３１０５から離脱メッセージ３１２１を受信すること（状態図３１００のステップ１）を含み、この離脱メッセージは、リービングノード３１０５によって所有されるものとして示されたノード識別子のオーナーシップ範囲を含むことができる。他の実施形態では、直接に隣接するノード３１１０は、基礎になるバスおよび／またはネットワークなど、ノードのリングの外のノードから表示（例えば、去る表示３１２１）を受信することができる。
【０３８６】
方法２９００は、第１の選択された直接に隣接するノードが、リービングノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のリービングノードのｉｄ空間オーナーシップを引き受ける意図を示す表示を第２の選択された直接に隣接するノードに送信する行為（行為２９２０）を含む。例えば、直接に隣接するノード３（３１１０）は、リービングノード３１０５と直接に隣接するノード３１１０との間のｉｄ空間の一部のリービングノードのｉｄ空間オーナーシップを引き受ける意図を示す表示（例えば、確立およびＴＴＬ３１２２）を直接に隣接するノード５（３１１５）に送信することができる。
【０３８７】
方法２９００は、第１の選択された直接に隣接するノードが、第１の選択された直接に隣接するノードと第２の選択された直接に隣接するノードとの間での少なくとも一方向監視関係の確立を示す表示を第２の選択された直接に隣接するノードに送信する行為（行為２９２５）を含む。例えば、直接に隣接するノード３（３１１０）は、直接に隣接するノード３（３１１０）と直接に隣接するノード５（３１１５）との間での少なくとも一方向監視関係の確立を示す表示（例えば、確立およびＴＴＬ３１２２）を直接に隣接するノード５（３１１５）に送信することができる。
【０３８８】
状態図３１００内などのいくつかの実施形態では、第１の選択された直接に隣接するノードが、リービングノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のリービングノードのｉｄ空間オーナーシップを引き受ける意図を示す表示を第２の選択された直接に隣接するノードに送信する行為は、第１の選択された直接に隣接するノード３１１０が、第１の選択された直接に隣接するノード３１１０と第２の選択された直接に隣接するノード３１１５との間でオーナーシップ範囲を確立するために第１確立要求３１２２を（例えば、状態図３１００のステップ２で）第２の選択された直接に隣接するノード３１１５に送信する行為（第１確立要求は、第１タイムトゥリブ持続時間３１２２を含み、第１タイムトゥリブ持続時間は、第１の選択された直接に隣接するノード３１１０が、第２の選択された直接に隣接するノード３１１５との監視関係がアクティブであると仮定できる持続時間を示す）と、第１隣接ノード３１１０が、第１確立要求３１２２の第１確立許可３１２３を（例えば、状態図３１００のステップ３で）受信する行為（第１確立許可３１２３は、第２隣接ノード３１１５が第１の選択された直接に隣接するノード３１１０を監視することを示す）とを含む。
【０３８９】
方法２９００は、第１の選択された直接に隣接するノードが、リービングノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを引き受けることの第１ノードの意図の受入を示す表示を第２の選択された直接に隣接するノードから受信する行為（行為２９３０）を含む。例えば、直接に隣接するノード３（３１１０）は、リービングノード３１０５と第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを引き受けることの直接に隣接するノード５の意図の受入を示す表示（例えば、確立およびＴＴＬ３１２４）を直接に隣接するノード５（３１１５）から受信することができる。
【０３９０】
方法２９００は、第１の選択された直接に隣接するノードが、第２の選択された直接に隣接するノードと第１の選択された直接に隣接するノードとの間での一方向監視関係の確立を示す表示を第２の選択された直接に隣接するノードから受信する行為（行為２９３５）を含む。例えば、直接に隣接するノード３１１０は、直接に隣接するノード３１１５と直接に隣接するノード３１１０との間の一方向監視関係の確立を示す。
【０３９１】
状態図３１００内などのいくつかの実施形態では、第１の選択された直接に隣接するノードが、リービングノードと第１の選択された直接に隣接するノードとの間のｉｄ空間の一部のｉｄ空間オーナーシップを引き受ける第１ノードの意図の受入を示し、第２の選択された直接に隣接するノードと第１の選択された直接に隣接するノードとの間の一方向監視関係の確立を示す表示を第２の選択された直接に隣接するノードから受信する行為は、第１隣接ノード３１１０が、第１隣接ノード３１１０と第２隣接ノード３１１５との間でオーナーシップ範囲を確立するために第２隣接ノード３１１５から第２確立要求を受信する（例えば、状態図３１００のステップ２で）行為（第２確立要求は、第２タイムトゥリブ持続時間３１２４を含み、第２タイムトゥリブ持続時間は、第２隣接ノード３１１５が、第１隣接ノード３１１０との監視関係がアクティブであると仮定できる持続時間を示す）と、第１隣接ノード３１１０が、第２確立要求の第２確立許可３１２３を送信する（例えば、状態図３１００のステップ３で）行為（第２確立許可は、第１隣接ノード３１１０が第２隣接ノード３１１５を監視することを示す）とを含む。
【０３９２】
（データ一貫性）
図３２に、本発明の原理を使用できるリングアーキテクチャ３２００を示す。リングアーキテクチャ３２００は、ノードのリング３２０５を含む。いくつかの実施形態で、ノードのリング３２０５は、上記、図２３Ｃのリング２３５０および／または図２７のリング２７０５に類似するか同一とすることができる。データ一貫性を維持する方法を、図３２のノードおよびデータアイテムに関して下でさらに詳細に説明する。
【０３９３】
図３３に、フェデレーションインフラストラクチャ内の複製セット内でデータアクセストランザクションを実行する方法３３００の流れ図を示す。方法３３００を、これから、環境３２００のコンポーネントおよびデータを頻繁に参照して説明する。
【０３９４】
いくつかの実施形態で、方法３３００は、ノードの複製セット内の複数のノードの中からプライマリノードを選ぶ行為（行為３３１０）を含む。例えば、プライマリノード３２１１を、ノードの複製セット３２１０内の複数のノードの中から選ぶことができる。データ一貫性を維持するのを助けるために、複製セットを作成して、データの１つまたは複数の部分を複製するか写しを作ることができる。したがって、ノードがリングを去る（障害または滑らかな離脱のいずれかによって）ときに、他のノードは、離脱するノードによって保持された情報をも含む。いくつかの場合に、複製セット内の各ノードは、１）複製セットのアイデンティティ、２）構成シーケンス番号（ＣＳＮ）、３）複製セットのメンバシップおよびプライマリノードがどれであるか、４）最後に使用されたシーケンス番号（ＬＳＮ）、および５）複製セットに格納されたデータを含むことができる。１〜３で表される状態情報を、複製セットの「構成状態」と呼ぶことができ、４〜５で表される状態情報を、複製セットに「格納されるデータ」と呼ぶことができる。
【０３９５】
ルーティング一貫性およびリング一貫性に関して上で提供された原理、記述、および説明が、リーダー選出（すなわち、プライマリノードを選ぶこと）に関して適用可能であることに留意されたい。例えば、リング内でｉｄ空間オーナーシップを維持する原理を、本明細書で述べるようにプライマリノードおよびセカンダリノードに適用することができる。一般に、プライマリノードおよびセカンダリノードのプロパティは、上のセクションで説明された他のノードのいずれかまたはすべてと一貫する。
【０３９６】
いくつかの実施形態で、複製セット３２１０を、そのプライマリ（プライマリノード３２１１）として働く単一のノードを用いて作成することができる。プライマリノード３２１１は、そのＬＳＮおよびＣＳＮを０に初期化し、メンバとしてそれ自体のみを含む複製メンバシップを初期化することができる。その後、複製セット３２１０を、下でより詳細に説明する様々な再構成アルゴリズムを使用してノードを複製セットに追加することによって、所望のサイズまで拡大することができる。いくつかの場合に、複製セット内の、プライマリノードではないすべてのノードを、セカンダリノードと称する。ＬＳＮを、書き込み動作と再構成動作との両方の間で全順序を作成するために増分することができる。ＣＳＮは、複製セット内の最新の構成変化をポイントすることができる。したがって、この場合に、ＣＳＮは、ＬＳＮシーケンスを共有する。ＬＳＮシーケンス内のギャップは、通常、データ消失を示し、したがって、回避されなければならない。
【０３９７】
方法３３００は、プライマリノードがノードの複製セット内の複数のノードの中から選ばれているかどうかを判定する行為（プライマリノードは、クライアントデータアクセス要求を受け入れ、処理するように構成され、複製セットは、選ばれたプライマリノードと１つまたは複数のセカンダリノードとを含む）（行為３３２０）を含む。例えば、プライマリノード３２１１は、それがノードの複製セット３２１０内の複数のノードの中から選ばれていることを判定することができ、プライマリノード３２１１は、クライアントデータアクセス要求３２１５を受け入れ、処理するように構成され、複製セット３２１０は、プライマリノード３２１１とセカンダリノード３２１２とを含む。
【０３９８】
いくつかの場合に、フォールトトレランスを高めるために複数のセカンダリノード（すなわち、同一データを格納するより多くのセカンダリノード）を追加することが望ましい場合がある。追加されるセカンダリノードの個数は、許容できる同時障害の最大個数に基づいて決定することができる。したがって許容できる同時障害の最大個数が、例えば３である場合に、少なくとも４つのセカンダリノードを有し、その結果、少なくとも１つのノードが、３つの他のノードが障害を発生した後であってもまだ複製セットの一部になるようにすることが望ましい場合がある。いくつかの場合に、複製セットのメンバになるセカンダリノードの個数は、プライマリノードの近傍内のメンバの個数に対応する。
【０３９９】
いくつかの場合に、許容可能な同時障害のこの最大個数を、セカンダリノードの閾値個数に関係付けることができる。そのようなセカンダリノードの閾値個数を、クォーラムと称する場合がある。データアクセス要求３２１５がデータ書き込み要求であるときに、セカンダリノードの閾値個数を、書き込みクォーラムと称する場合がある。同様に、データアクセス要求３２１５がデータ読み取り要求であるときに、セカンダリノードの閾値個数を、読み取りクォーラムと称する場合がある。したがって、読み取りクォーラムおよび書き込みクォーラムは、所与の個数の許容可能な同時障害について完全なフォールトトレランスを提供するのに必要なノードの最小限の閾値個数を表すことができる。
【０４００】
方法３３００は、プライマリノードが１つまたは複数のクライアントデータアクセス要求を受信する行為（各データアクセス要求は、複製セット内のセカンダリノードのうちの少なくとも１つでアクセスされるべきデータの少なくとも一部を示す）（行為３３３０）を含む。例えば、プライマリノード３２１１は、クライアント３２５０からクライアントデータアクセス要求３２１５を受信することができ、要求３２１５は、複製セット３２１０内のセカンダリノード３２１２でアクセスされるべきデータの少なくとも一部を示す。データアクセス要求３２１５は、例えば、複製セット内のノードのうちの少なくとも１つに書き込まれるファイルを含む。それに加えてまたはその代わりに、データアクセス要求３２１５は、複製セット内のノードのうちの少なくとも１つから読み取られ、取り出されるファイルの名前を含むことができる。プライマリノード３２１１は、着信データ要求を管理し、複製セットに対応する構成状態情報を含む適当な情報をセカンダリノード３２１２に送信する。データの部分は、ノードのデータシーケンス番号（ＤＳＮ）、ＬＳＮ、ＣＳＮ、プライマリノードアイデンティティ、またはセカンダリノードアイデンティティを含む、複製セット自体に関する制御情報のセットを含むこともできる。
【０４０１】
方法３３００は、プライマリノードが、クライアントデータアクセス要求が受信された順序で状態を変化させるクライアントデータアクセス要求のそれぞれにデータシーケンス番号（ＤＳＮ）を割り当てる行為（データシーケンス番号は、複製セット内のノードのそれぞれが従う線形化された処理順序を含む）（行為３３４０）を含む。例えば、プライマリノード３２１１は、要求が受信された順序で状態を変化させる各クライアントデータアクセス要求３２１５にＤＳＮを割り当てることができる。ＤＳＮは、複製セット３２１０内のノードのそれぞれが従う線形化された処理順序を含むことができる。いくつかの場合に、線形化された処理順序を、図３５に示されているように、動作のシーケンス３５０１と称する場合がある。要求が状態を変化させない場合には、プライマリノード３２１１は、クライアントデータアクセス要求へのデータシーケンス番号の割り当てを省略することができる。
【０４０２】
動作のシーケンス３５０１は、データシーケンス番号（ＤＳＮ３５０５）に従って、それらが受信された順序で配置された複数の動作を含むことができる。例えば、プライマリノード３２１１は、第１動作を表すためにＯＰ1を、第２動作を表すためにＯＰ2を、およびＯＰnによって表されるように完全に、割り当てることができる。ＯＰn+1は、最後に使用されたシーケンス番号（ＬＳＮ３５１５）を表すことができる。上で述べたように、ＬＳＮ３５１５を増分して、書き込み動作と再構成動作との両方の間で全順序を作成することができる。ＣＳＮ３５１０は、複製セット３２１０内の最新の構成変化をポイントすることができる。いくつかの場合に、ＣＳＮ３５１０は、ＬＳＮシーケンスを共有することができる。ＬＳＮシーケンス内のギャップは、動作のシーケンス３５０１が従われなかったことを示し、これは、しばしばデータ消失をもたらす。
【０４０３】
方法３３００は、プライマリノードが、対応するデータシーケンス番号を含むクライアントデータアクセス要求のうちの少なくとも１つをセカンダリノードのうちの少なくとも１つに送信する行為（行為３３５０）を含む。例えば、プライマリノード３２１１は、すべての割り当てられたＤＳＮ３２１６を含むクライアントデータアクセス要求３２１５をセカンダリノード３２１２に送信することができる。いくつかの場合に、クライアントデータアクセス要求を、書き込みクォーラム(quorum)または読み取りクォーラムなどのクォーラムに送ることができる。クォーラムは、期待される情報およびさらにプライマリノードが知らない他のデータアクセス要求の表示を応答することができる。例えば、セカンダリノードは、プライマリノード３２１１が選ばれる前に他のトランザクションを処理済みである場合があり、あるいは、プライマリが知らないあるトランザクションを割り当てられている場合がある。したがって、この情報を、プライマリノード３２１１に送信することができ、この情報は、プライマリノードの動作のシーケンス３５０１を更新するのに使用することができる。いくつかの場合に、このプロセスは、下でさらに詳細に説明するように、複製セット再構成中にのみ発生する。
【０４０４】
方法３３００は、プライマリノードが、少なくとも閾値個数のセカンダリノードから、クライアントデータアクセス要求の受信を示す肯定応答を受信する行為（行為３３６０）を含む。例えば、プライマリノード３２１１は、閾値個数のセカンダリノード（例えば、読み取りクォーラムまたは書き込みクォーラム）から、クライアントデータアクセス要求３２１５の受信を肯定応答する肯定応答メッセージ３２２０を受信することができる。肯定応答３２２０は、さらに、メッセージを送信したセカンダリノードが、そのデータアクセスキュー（すなわち、動作のシーケンス３５０１）にクライアントデータアクセス要求３２１５を挿入したことを示すことができる。いくつかの場合に、プライマリノード３２１１は、複製セット内のすべてのノードからまたはそのクォーラムからそのような肯定応答メッセージを受信することができる。肯定応答は、それに加えてまたはその代わりに、クライアントデータアクセス要求の受入または拒否を示すことができる。
【０４０５】
方法３３００は、プライマリノードが、データアクセス要求をコミットする行為（コミットは、クライアントデータアクセス要求に従ってデータにアクセスすることを含む）（行為３３７０）を含む。例えば、プライマリノード３２１１は、データアクセス要求３２１５を単一フェーズでコミットすることができ、このコミットは、クライアントデータアクセス要求３２１５に従ってデータにアクセスすることを含む。したがって、データアクセス要求が書き込み要求である場合には、プライマリノード３２１１は、書き込み要求を単一フェーズでコミットすることができる。単一フェーズでのコミットは、コミットクエリを送信し、セカンダリノードのそれぞれから受信することなく行うことができる。単一フェーズでのコミットを、非ブロッキングトランザクションと称する場合がある。上記複製セット内の障害検出が完全なので、プライマリノードは、コミットクエリを送信し、セカンダリノードのそれぞれから受信する必要がない。
【０４０６】
いくつかの実施形態で、プライマリノード３２１１は、クライアントデータアクセス要求３２１５を第２複製セットに送信することができる。第２複製セットは、プライマリノードの近傍とは異なる近傍内にあるものとすることができる。いくつかの場合に、プライマリノードの近傍は、複製セットと同一のノードを含む。プライマリノード３２１１は、複製セット３２１０がクライアントデータアクセス要求３２１５の第１部分を処理することを要求し、第２複製セットがそのデータアクセス要求の異なる部分を処理することを要求することができる。しかし、そのような実施形態は、２フェーズコミットプロセスを使用するはずである。例えば、このプロセスは、クライアントデータアクセス要求３２１５の第１部分に対応する応答を複製セット３２１０から受信することを含むことができる。このプロセスは、そのデータアクセス要求の第２の異なる部分に対応する応答を第２複製セットから受信することをも含むことができる。応答を組み合わせることができ、組み合わされた応答に基づいて、最新のデータアクセス応答を生成することができる。
【０４０７】
例示的実施形態では、プライマリノード３２１１は、次のようにクライアントデータ書き込み要求に応答することができる。１）プライマリ３２１１は、アプリケーション一貫性制約に対して要求を認証検査する。プライマリ３２１１が違反を判定する場合には、プライマリ３２１１は、アプリケーション一貫性違反の障害状況をクライアント３２５０に応答し、下のステップ（７）にスキップする。２）プライマリ３２１１は、プライマリのＬＳＮを原子的に増分することによって得ることができるシーケンス番号を書き込み動作に割り当てる。この例では、所与の書き込み動作に関連するシーケンス番号を、そのＤＳＮと称する。３）プライマリ３２１１は、ＤＳＮ、ＣＳＮ、および書き込むべきデータをすべてのセカンダリノードに通信し、書き込みクォーラムのセカンダリノードが応答するのを待つ（変形手法は、プライマリが、書き込むべきデータを書き込みクォーラムだけに送信することとすることができる）。
【０４０８】
４）書き込みクォーラムのセカンダリノードから肯定応答を聞いた後に、プライマリ３２１１は、書き込み動作をローカルに実行し、書き込み動作がコミットされると考えられる点にある。プライマリ３２１１は、成功の状況をクライアントに戻って応答し、下のステップ（７）にスキップする。５）プライマリ３２１１が、書き込みクォーラムのセカンダリノードから肯定応答を得ることができない場合には、プライマリ３２１１は、障害を発生したセカンダリノードを除去するために再構成動作を開始する。６）プライマリ３２１１が、書き込み動作をローカルに実行することができない場合には、プライマリ３２１１は、新しいプライマリに推移するために再構成動作を開始し、それ自体を複製セット３２１０から除去し、ステップ（７）にスキップする。７）プライマリ３２１１は、次の着信クライアントデータアクセス要求を待つ。他の実施形態が、可能であり、上記のようにより多数またはより少数のステップを含むことができることに留意されたい。
【０４０９】
例示的実施形態では、セカンダリノード３２１２は、次の形でデータ書き込み要求を処理することができる。１）セカンダリは、着信書き込み動作で指定されるＣＳＮをそのＣＳＮと比較する。指定されたＣＳＮがそのＣＳＮ未満である場合に、セカンダリは、その要求を無視し、下のステップ（４）にスキップする。セカンダリノード３２１２は、指定されたＣＮＳがそのＣＳＮを超えることができないとアサートする。というのは、そのような条件が、再構成が不完全な障害ディテクタを用いて達成されたことを暗示するからである。２）セカンダリノード３２１２は、着信書き込みデータ要求のＤＳＮをそのＬＳＮと比較する。ＤＳＮが、その（ＬＳＮ＋１）未満である場合に、セカンダリノード３２１２は、その書き込みデータ要求を無視する。ＤＳＮが、その（ＬＳＮ＋１）を超える場合に、セカンダリノード３２１２は、そのデータ書き込み要求をバッファリングし、下のステップ（４）にスキップする。そうではない場合に、セカンダリノード３２１２は、そのＬＳＮを原子的に増分し、そのデータ書き込み要求を受け入れ、肯定応答３２２０を送り返す。セカンダリノード３２１２が、ローカル障害に起因して要求を受け入れることができない場合には、セカンダリノード３２１２は、セカンダリとしてのそのノードを複製セットから除去するために再構成を開始するようにプライマリに要求する。３）セカンダリノード３２１２は、現在バッファリングされている動作のそれぞれを調べ終えるまで、それらを調べ、処理し、そのＤＳＮがセカンダリの本明細書で説明するＬＳＮ値の範囲内であるものをすべて受け入れ、したがってプライマリによって確立された全順序を保存する。４）セカンダリノード３２１２は、プライマリ３２１１からの次のデータアクセス要求を待つ。処理の行為は、関連するデータを安定したストレージファシリティに書き込むことを含むことができる。
【０４１０】
データベースセッティングでは、書き込みトランザクションを実行する例示的方法は、次のとおりである。１）「アボート」を含む「コミット」の前の動作について、プライマリ３２１１は、単純に、その動作をローカルに実行し、下のステップ（６）にスキップする。２）「コミット」について、プライマリ３２１１は、トランザクションをローカルに準備することによってトランザクション順序を判定する。このステップは、データベース一貫性制約に対してトランザクションの認証検査をも行う。ローカル準備に失敗する場合には、障害状況をクライアント３２５０に戻って応答し、下のステップ（６）にスキップする。３）プライマリノード３２１１は、「コミット」要求と共に、前の例のステップ（２）〜（３）で指定されたセカンダリノード３２１２にトランザクションを転送する。４）プライマリノード３２１１は、書き込みクォーラムのセカンダリノードから肯定応答を得た後に、トランザクションをローカルにコミットし、クライアント３２５０に成功を報告する。５）プライマリノード３２１１は、書き込みクォーラムのセカンダリノードから肯定応答を得ることができない場合に、ローカルに準備されたトランザクションをアボートし、障害を発生したセカンダリノードを除去するために再構成動作を開始する。６）プライマリ３２１１は、次の着信クライアントデータアクセス要求３２１５を待つ。
【０４１１】
図３４に、フェデレーションインフラストラクチャ内で一貫した複製セットを確立し、維持する方法３４００の一例の流れ図を示す。方法３４００を、これから、環境３２００のコンポーネントおよびデータを頻繁に参照して説明する。
【０４１２】
方法３４００は、ノードのリング内の複数のノードの中から複製セットを確立する行為（複製セットは、メンバとしてプライマリノードおよび１つまたは複数のセカンダリノードを含む）（行為３４１０）を含む。例えば、複製セット３２１０を、ノード３２１１、３２１２およびノードのリング３２０５上の他のノードの中から確立することができる。複製セット３２１０に、メンバとしてプライマリノード３２１１およびセカンダリノード３２１２を含めることができる。いくつかの場合に、複製セット３２１０の境界を、セカンダリノードもメンバである、プライマリの近傍と同一とすることができる。
【０４１３】
方法３４００は、複製セットメンバのうちの少なくとも１つに影響する複製セット構成イベントオカレンス(replica set configuration event occurrence)を示す表示を受信すること（行為３４２０）をも含む。例えば、複製セット３２１０内のノード３２１１および３２１２のいずれもが、プライマリノード３２１１およびセカンダリノード３２１２のうちの少なくとも１つに影響する複製セット構成イベントオカレンスの表示を受信することができる。複製セット構成イベントには、複製セット内のノード障害、複製セットからのノード離脱、またはノードが複製セットに参加することを含めることができる。再構成を引き起こす、複製セットのノードに影響する他のイベントも、可能である。いくつかの場合に、そのような構成イベントは、クライアントデータアクセス要求中に発生し得る。
【０４１４】
方法３４００は、受信された表示に基づいて、複製セットを再構成しなければならないことを判定する行為（再構成は、複製セット構成イベントオカレンスに基づいて、複製セットからの既存セカンダリノードの除去、複製セットへの新しいセカンダリノードの追加、新しいプライマリへの突然の推移、および新しいプライマリへの滑らかな推移のうちの少なくとも１つを含む）（行為３４３０）を含む。例えば、受信された表示に基づいて、複製セット３２１０内のノードのうちの１つが、複製セット３２１０を再構成しなければならないと判定することができる。再構成には、発生した構成イベントに応じて、複製セットからの既存セカンダリノードの除去、複製セットへの新しいセカンダリノードの追加、新しいプライマリへの突然の推移、および新しいプライマリへの滑らかな推移のうちの少なくとも１つを含めることができる。
【０４１５】
複製セットを再構成し、新しいプライマリノードに推移する一例の方法およびアルゴリズムが、以下に含まれる。複製セット再構成の一例は、一般に、１）新しいプライマリへの突然の推移、２）新しいプライマリへの滑らかな推移、３）セカンダリノードの除去、および４）セカンダリノードの追加を含む４つのケースをカバーする。この４つの一般的な一例のそれぞれは、独立に発生し得、少なくともいくつかの実施形態で、既存のプライマリの置換を伴わない。
【０４１６】
方法３４００は、複製セット構成イベントに対応する再構成に従って複製セットを再構成する行為（行為３４４０）を含む。例えば、複製セット３２１０を、複製セット構成イベントに対応する再構成に従って再構成することができる。したがって、複製セット構成イベントがノード障害である場合に、複製セット３２１０を、セカンダリの追加、セカンダリの除去、または新しいプライマリへの推移によって再構成することができる。同様に、複製セット構成イベントがノード参加であるときに、複製セット３２１０を、上記の方法のいずれかに従って再構成することができる。いくつかの場合に、ある再構成方法が、ある再構成イベントに対応することができる。この対応は、ユーザによって構成することができ、あるいは自動的とすることができる。
【０４１７】
いくつかの場合に、プライマリノード３２１１は、構成状態情報に基づいて、１つまたは複数の複製セット再構成が進行しているのを検出することができる。上で示したように、再構成プロセス中には、新しいプライマリノードを、複製セットについて選ぶことができる。上記実施形態によれば、リング３２０５内のノードは、新しいプライマリノードの情報がリング上の他のノードに関して最新であることを保証するために、新しいプライマリノードと通信することができる。
【０４１８】
いくつかの実施形態で、上で図３４を参照して説明したものに類似するかこれと同一の一貫した複製セットを使用して、データにアクセスし、データを格納することができる。例えば、複製セット３２１０を、複製セットノードのうちの１つまたは複数（例えば、セカンダリノード３２１２）上のデータストレージの一部を維持するように構成することができる。プライマリノード３２１１は、クライアントデータアクセス要求３２１５を受信することができる。要求３２１５には、ノードの複製セット３２１０内の少なくとも１つのノード上でアクセスされる情報の表示を含めることができる。プライマリノードは、要求を直接に処理するか、あるいは要求をセカンダリノードに渡すかのいずれかを行うことができる。プライマリノード３２１１が、受信されたクライアントデータアクセス要求３２１５内で示される情報の少なくとも一部へのアクセスに失敗したことを検出した場合には、プライマリノード３２１１は、それ自体を複製セットから除去することができ、その結果、プライマリノード３２１１に格納された情報は、クライアントデータアクセス要求に応答してアクセスされるのを防がれるようになる。これは、失効した若しくは古い情報を返す可能性を除去し、クライアントデータアクセス要求３２１５に応答して返されるすべての情報が最新であることを保証する。
【０４１９】
いくつかの実施形態によれば、新しいプライマリへの突然の推移は、次の形で発生し得る。既存プライマリが障害を発生するときに、新しいプライマリが、上で述べた方法による信頼できるリーダー選出アルゴリズムを使用して選ばれる。任意のクライアント動作を受け入れる前に、新しいプライマリは、複製セットから古いプライマリを除去するために、次の構成変更を実行することができる。１）新しいプライマリは、それが複製セット状態の知識を有するかどうかを知るためにチェックすることができる。新しいプライマリは、この知識を有しない場合に、複製セットのすべてのメンバが障害を発生したと暗黙のうちに判定し、下のステップ（９）にスキップする。２）新しいプライマリは、複製セットのすべてのノードに連絡して、すべての既存セカンダリノードに連絡し終えることに関するフィックスポイントに達するまで、それらのＣＳＮおよびＬＳＮを判定する。このステップで収集された情報を使用して、新しいプライマリは、最も古いＣＳＮ、最も新しいＣＳＮ、および最も新しいＬＳＮを判定する。最も古いＣＳＮおよび最も新しいＣＳＮが、いくつか（またはほとんど）の場合に同一である可能性があることに留意されたい。最も古いＣＳＮおよび最も新しいＣＳＮが異なるときには、再構成動作の途中でのプライマリの障害が示される。その場合に、最も古いＣＳＮより大きいＣＳＮを有するすべての複製は、確実に、最新データを有する。したがって、このステップの終りに、新しいプライマリは、最も古いＣＳＮおよび最も新しいＣＳＮが異なるときに、最新データを既に有する。そうでない場合に、新しいプライマリは、最も新しいＣＳＮの前に書き込まれたデータだけを有し、ステップ（３）でのチェックは、新しいプライマリが最も新しいＣＳＮを過ぎて書き込まれたデータをも有することを保証する。
【０４２０】
３）最も古いＣＳＮおよび最も新しいＣＳＮが同一であり、新しいプライマリが、読み取りクォーラムのセカンダリノードと連絡することができない場合には、データ消失の可能性があり、新しいプライマリは、下のステップ（９）にスキップする。いくつかの場合に、読み取りクォーラムが書き込みクォーラムと交差することが非常に有利である（または必要でさえある）可能性がある。サイズベースのクォーラムについて、読み取りクォーラムは、（ｎ−ｗ）より大きい任意のセットであり、ここで、ｎは、ＣＳＮで指定される複製ノードの個数であり、ｗは、書き込みクォーラムである。
【０４２１】
４）新しいプライマリは、セカンダリノードの報告されたＬＳＮと上のステップ（２）で判定された最新のＬＳＮとの間の動作をそれらのセカンダリノードに送信することによって、セカンダリノードをその構成においてデータに関して最新にすることを試みる。最も古いＣＳＮの後、最新のＣＳＮまでの不完全な再構成動作を、このステップで、短縮された無効な再構成動作として送信することができる。５）新しいプライマリは、最新のＣＳＮを有する構成から、障害を発生したプライマリ（例えば、プライマリ３２１１）およびセカンダリノード（例えば、セカンダリノード３２１２）を除去した後に、新しい複製構成をローカルに構築し、最新のＬＳＮをそのＬＳＮにし、そのＬＳＮを増分することによって得られたＣＳＮをその新しい構成に割り当てる。６）新しいプライマリは、新しい複製構成をすべてのセカンダリノードに通信する。
【０４２２】
７）新しいプライマリが、上のステップ（６）で送信された再構成動作に応答して、すべてのセカンダリノードから成功状況を得ることができないか、いずれかのセカンダリから障害状況を聞く場合に、新しいプライマリは、上のステップ（２）〜（６）を再実行する。８）少なくともいくつか（またはすべて）のセカンダリノードから成功状況を聞いた後に、新しいプライマリは、下のステップ（１０）にスキップする。９）新しいプライマリは、データセンタのベルを鳴らす、ポケットベルメッセージを送信するなど、ディザスタリカバリを実行するためのステップを行う。いくつかの場合に、複製セットは、手動介入を使用することによってのみ復元することができる。１０）新しいプライマリは、この時点でクライアント動作の処理を再開する。上のステップ（２）で、新しいプライマリは、古いプライマリが障害を発生したときに複製セットに追加される過程にあった新しいセカンダリノードを発見する可能性がある。フィックスポイントは、新しいプライマリが新しい構成の一部と考えるセカンダリノードの安定したセットを取り込むことを意味する。新しいセカンダリノードをも処理する突然のプライマリ推移の前後の最適化を除去する場合には、このフィックスポイント計算を除去することができる。
【０４２３】
いくつかの実施形態によれば、新しいプライマリへの滑らかな推移は、次の形で発生し得る。既存プライマリから新しいプライマリへの推移は、複製セットへの新しいセカンダリの追加（下で説明する）に非常に似ている。新しいプライマリは、複製セット内の現行セカンダリであってもなくてもよい。この例では、潜在的な新しいプライマリは、このアルゴリズムに従って複製セットの一部になる。１）新しいプライマリは、それにデータを転送するために、複製セット内の１つまたは複数の既存セカンダリに連絡し、２）新しいプライマリは、それと同時に、新しい動作をそれに転送するために既存プライマリ（例えば、プライマリ３２１１）に連絡する。
【０４２４】
３）新しいプライマリから受信された新しい動作のＤＳＮが、セカンダリから受信されたデータより大きい場合には、新しいプライマリによって送信された新しい書き込み動作を、セカンダリによって受信されたデータとマージする。４）上のステップ（１）で新しいプライマリによって連絡されたすべてのセカンダリノードが、データ転送が完了したことを報告した後に、新しいプライマリは、既存プライマリ３２１１に連絡して、新しいプライマリを複製セットの現行プライマリにするための構成変更を開始する。５）ステップ（４）で送信された再構成要求に対する応答として既存プライマリから成功状況を受信した後に、新しいプライマリは、複製セットのプライマリの役割を引き受け、６）ステップ（５）の再構成要求まで、新しいプライマリは、それが受信するすべてのクライアント動作を既存プライマリに転送する。
【０４２５】
いくつかの実施形態によれば、セカンダリノードを除去するプロセスは、次の形で発生し得る。完全な障害ディテクタ（上で図１４および１９に関して説明した）が、既存セカンダリ３２１２が障害を発生したことをリングノードのうちの１つ（例えば、プライマリノード３２１１）に報告するとき、または既存セカンダリが、それ自体を複製セット３２１０から自発的に除去するために他のノードのうちの１つ（例えば、プライマリ）に連絡するときに、ノードのうちの１つ（例えば、プライマリ）は、次のアルゴリズムを用いて、複製セットからセカンダリを除去することができる。この例では、１）プライマリは、着信クライアント動作（例えば、３２１５）の処理をブロックし、これらをバッファリングするか、クライアント（例えば３２５０）に後で再試行するように求めるかのいずれかを行い、２）プライマリは、障害を発生したセカンダリを複製セットメンバシップから除去することによって新しい複製構成をインストールし、そのＬＳＮを原子的に増分することによって新しい構成にＣＳＮを割り当てる。いくつかの場合に、これは、再構成動作が、データ動作と同一のシーケンスストリーム内にあることを意味する。３）プライマリは、すべてのセカンダリノードに新しい構成を通信し、４）少なくともいくつか（またはすべて）のセカンダリノードから成功状況を聞いた後に、プライマリは、クライアント動作の処理を再開する。
【０４２６】
そのような再構成プロセス中に、再構成されるセカンダリは、次のように振る舞うことができる。１）セカンダリは、再構成動作のＣＳＮをそのＬＳＮと比較する。ＣＳＮが（ＬＳＮ＋１）未満の場合には、セカンダリは、プライマリに傷害状況を送信し、下のステップ（３）にスキップする。ＣＳＮが（ＬＳＮ＋１）と等しい場合には、セカンダリは、そのＬＳＮを原子的に増分し、再構成動作を受け入れ、成功状況を送り返す。そうでない場合には、セカンダリは、再構成動作をバッファリングし、下のステップ（３）にスキップし、２）セカンダリは、現在バッファリングされている動作のうちの少なくともいくつか（またはすべて）を調べるまで、それらを調べ、処理し、３）セカンダリは、プライマリからの次の動作要求を待つ。
【０４２７】
障害ディテクタの完全さは、古い再構成および新しい再構成が同時には存在しないことを保証する。いくつかの実施形態で、全体的な仮定は、フェイルストップ（ｆａｉｌ−ｓｔｏｐ）障害を検出するのに使用できる完全な障害ディテクタが存在することである。この意味での「完全な」の使用は、ノードインスタンス（ノードの存在のそのインスタンス）が実際に永久的に使用不能にならない限り、障害ディテクタが、そのノードインスタンスが使用不能になったことを絶対に報告しないという仮定を取り込む。上で述べたように、障害検出は、上記リング一貫性プロパティおよびルーティング一貫性プロパティという概念と密接に関係し、これに頼ることができる。古い再構成および新しい再構成が同時には存在しないので、これは、複製セット状態が、複製セットメンバの外部に存在しないことを暗示する。というのは、複製セットノードが、それが障害を発生した後またはそれが自発的にそれ自体を除去した後のいずれかに限って複製セットから除去されるからである。このプロパティは、複製セットのすべてのメンバが障害を発生した状態を識別するのに有用である。というのは、新たに選ばれるプライマリが、この状態の下で複製セット状態へのアクセスを有しないことを認識するからである。
【０４２８】
この例では、プライマリが、再構成動作が完了するまで着信動作の処理をブロックするので、これは、オペレータが、不可視になった再構成動作を無視することを可能にする。再構成動作は、それを開始したプライマリが再構成プロセス自体の間に障害を発生し、障害を発生したプライマリによって連絡されたセカンダリノードもその後に障害を発生するときに、不可視になり得る。このプロパティは、複製セットの既存セカンダリノードの間で単一のＣＳＮを見つける新たに選択されたプライマリが、それが見つけたＣＳＮがシステム全体を観察する託宣展望から実際に最新のＣＳＮであることまたは、後で不可視になった、より後の再構成動作の後にデータ動作が開始されなかったことのいずれかを確信することを可能にする。したがって、新たに選ばれたプライマリが、新しいプライマリへの突然の推移に関する例で説明したように、既存セカンダリノードの間でそのプライマリが見つけた最新ＣＳＮに基づいてデータ消失を判定することが、安全である。
【０４２９】
再構成動作がデータ動作と同一のシーケンス内にあることができることを考慮すると、少なくともいくつか（またはすべて）のセカンダリノードが、再構成動作の終りにデータに関して最新にされる（これらのすべてが同一のＬＳＮを有することを意味する）。書き込みクォーラムの存在下で、このプロパティは、新に選ばれたプライマリが、既存セカンダリノードの間で見つけた最新ＣＳＮに基づいてデータ消失を判定することを安全にする。
【０４３０】
いくつかの実施形態によれば、セカンダリノードを追加するプロセスは、次の形で発生し得る。この例では、新しいセカンダリは、次のアルゴリズムに従って、複製セットの一部になる。１）セカンダリノードは、それにデータを転送するために、複製セット内の１つまたは複数の既存セカンダリノードに連絡し、２）セカンダリノードは、同時に、新しい動作をそれに転送するためにプライマリ（例えば、３２１１）に連絡し、３）プライマリから受信された新しい動作のＤＳＮが、セカンダリから受信されたデータより大きい場合には、セカンダリノードは、プライマリによって送信された新しい書き込み動作をセカンダリから受信したデータとマージし、４）上のステップ（１）で新しいセカンダリによって連絡された少なくともいくつか（またはすべて）のセカンダリノードが、データ転送が完了したことを報告した後に、セカンダリノードは、プライマリに連絡して、複製セットにそれ自体を追加するための構成変更を開始する。
【０４３１】
この例を継続すると、新しいセカンダリを複製セットに追加するためにプライマリが従うアルゴリズムは、次のとおりである。１）新しいセカンダリからの最初の要求に応答して、プライマリは、まだ複製セットの一部ではないが、新しいセカンダリになるはずのものへの新しい動作の転送を開始し、２）新しいセカンダリからの後続の再構成要求に応答して、プライマリは、新しい構成が既存セカンダリを除去するのではなく新しいセカンダリを追加するという相違を伴う、上記「セカンダリノードの除去」の一例で述べたものと実質的に同一のステップを使用する再構成動作を開始することができる。
【０４３２】
図３６に、フェデレーションインフラストラクチャ内で複製セットからのデータにアクセスする環境３６００を示す。環境３６００は、複数のモジュールを含むデータアクセスシステム３６１０を含む。一般に、以下で説明する各モジュールは、リング実施態様（例えば、ノードのリング３２０５）内に存在し、近傍および／または複製セットを構成するノード、より一般的にはノードのリング配置を構成するノードおよびそのようなノードのリング配置内のアクティブノードになることを試みるデバイスにまたがる分散アルゴリズムとして実施され得る。このシステムは、リング上の複数のノードの近傍を確立するように構成された近傍確立モジュール３６２０を含み、この近傍は、少なくとも、直接に隣接する先行ノードおよび直接に隣接する後続ノードを含む。ノードのリング３２０５には、直接に隣接するノード１（３６０８）と直接に隣接するノード２（３６０９）との間でリングに参加することを試みることができる、参加するノード３６０６を含めることができる。いくつかの実施形態で、参加するノード３６０６は、参加するノードがノード２３０１と２３６２との間でのキャッシングされた合意に基づいて識別子範囲を判定する図２３Ｃで説明したものに類似する形でノードのリング３６０５に参加することができる。
【０４３３】
このシステムは、さらに、確立された近傍の外の参加するノードが、ノードのリング内の確立された近傍に参加する意図を示したことを判定するように構成された意図判定モジュール３６２５を含む。意図判定モジュール３６２５は、ノードの近傍の確立を示す近傍表示３６２１を近傍確立モジュール３６２０から受け取ることができる。近傍には、直接に隣接するノード１（３６０８）、参加するノード３６０６、および直接に隣接するノード２（３６０９）を含めることができる。意図判定モジュール３６２５は、参加するノードの参加する意図３６２６を一貫性維持モジュール３６３０に送ることができる。
【０４３４】
一貫性維持モジュール３６３０を、複数のノード内の各ノードが近傍内のｉｄ空間の一部のｉｄ空間オーナーシップをとるように、確立された近傍内の一貫性を維持するように構成することができる。上記見出し「ノードのリングの参加および離脱」において説明したように、近傍内の一貫性は、参加するノード３６０６がノードのリング３６０５に参加するときに維持することができる。一貫性維持モジュール３６３０は、一貫性表示３６３１を選出判定モジュール３６３５に送ることができる。いくつかの実施形態で、リングのｉｄ空間内の所与のｉｄで維持されるすべての状態一貫性について、そのプライマリノードが任意の所与の瞬間にそのｉｄを所有するリングノードである状態の単位について形成された複製セットがあることに留意されたい。ｉｄ空間オーナーシップは、所与のｉｄについてノードの間で移動する（一貫して）ので、その所有するノードで格納される（または、これによって制御される）サービス状態の任意の単位の対応するプライマリさもそのように移動する。この実施形態では、ｉｄ空間オーナーシップおよびプライマリさは、同時の形で転送される。
【０４３５】
選出判定モジュールは、複数のノード内のノードの１つが、プライマリノードによって向けられるクライアントデータアクセス要求に応答するように構成されたノードの複製セットにまたがる責任を有するプライマリノードになるために選ばれたことを判定するように構成され得る。プライマリノード選出に関して上記のように、選出判定モジュールは、プライマリノードが複製セット（確立された近傍内のすべてのノードを含むことができる）について選ばれたことを判定し、どのノードがプライマリになるために選ばれたかの表示（３６３６）を要求受信モジュールに送ることができる。上記のように、そのようなリーダー選出は、本論文で前に定義したリング一貫性およびルーティング一貫性（少なくとも部分的に完全な障害ディテクタ機構を形成する監視合意を含む）の原理に従うことができる。
【０４３６】
要求受信モジュール３６４０を、クライアント３６１５から１つまたは複数のクライアントデータアクセス要求を受信するように構成することができ、各データアクセス要求３６４１は、複製セット内のノードのうちの少なくとも１つでアクセスされるデータの少なくとも一部を示す。要求受信モジュール３６４０は、プライマリノード表示３６３６をも受け取ることができる。プライマリノード表示３６３６およびデータアクセス要求３６４１を、データアクセスモジュール３６４５への３６４１Ａおよび３６３６Ａに組み合わせることができる（あるいは、それぞれを別々に送ることができる（図示せず））。データアクセスモジュール３６４５を、通信３６０７を介してノードのリング３６０５内の１つまたは複数のノードと通信し、クライアントデータアクセス要求３６４１内で示されたデータにアクセスするように構成することができる。したがって、システム全体をインスタンス化することができ、ここで、ノードがノードのリング３６０５に参加し、去ることができ、一貫性が維持され、プライマリノードが選ばれ、データが信頼できる形でアクセスされる。このシステム内の説明されたモジュールのそれぞれは、これらの機能ならびに上のセクションでより詳細に説明した、各モジュールに対応する他の機能を実行することができる。
【０４３７】
いくつかの実施形態で、アクセスされるデータは、サービスを含む。例えば、参加するノード３６０６は、クライアント３６１５がアクセスを望むサービスを提供することができる。例えば、サービスを、電子メールアプリケーションとすることができる。クライアント３６１５は、アクセスされるデータを示すことができ、データアクセスシステム３６１０は、参加するノードがデータアクセスシステムによって維持されるリングおよびデータの一貫性に起因してリングを去るかどうかにかかわりなく、データにアクセスするように構成され得る。他の場合に、提供されるサービスを、ロックマネージャ、データストレージシステム、プロデューサ−コンシューマキュー、または任意の他のサービスとすることができる。システムが、データベースなどのデータにアクセスするのに使用される場合に、システム３６１０を、複製セット内のデータの原子性、一貫性、独立性、および永続性（ＡＣＩＤ）プロパティのそれぞれを維持するように構成することができる。したがって、どのノードが実際にデータを含むか、どのノードがノードのリングに参加しまたは去るか、あるいはデータを含むかなりの個数のノードが障害を発生したかどうかにかかわりなく、一貫した信頼できるデータアクセスを提供するように構成できるシステムが提示される。
【０４３８】
いくつかの場合に、サービスによって公開される動作を、状態を変化させる動作および状態を変化させない動作にパーティショニングすることができる。ストレージサービスの場合に、状態を変化させる動作を、「書き込み」と呼ぶことができ、状態を変化させない動作を、「読み取り」と呼ぶことができる。ロックマネージャサービスの場合に、状態を変化させる動作を、「獲得」および「解放」と称し、状態を変化させない動作を、「クエリ」と称する。プロデューサ−コンシューマキュー（時々分散計算に使用される）の場合に、状態を変化させる動作を、「エンキュー」および「デキュー」と称し、状態を変化させない動作を、「ピーク」と称する。したがって、本明細書のいくつかの実施形態で、用語「書き込み」は、状態を変化させるすべての動作を取り込み、用語「読み取り」は、状態を変化させないすべての動作を取り込む。
【０４３９】
いくつかの場合に、読み取り動作は、プライマリノード３２１１によってローカルに処理される。読み取りを、クライアントが要求した状態が存在しないので、プライマリになるはずのもので満足することができない場合には、その状態は、セカンダリノードのどれにも（保証されて）存在はしない。いくつかの実施形態で、書き込み動作を、プライマリノード３２１１を介して順序付けることができる。その場合に、プライマリノード３２１１は、少なくとも書き込みクォーラムのセカンダリノードが、それらがクライアント供給の状態をそれら自体で書き込んだことを肯定応答するまで、実際にはその状態をローカルに書き込まない可能性がある。その肯定応答の後に、プライマリノード３２１１は、実際に状態をローカルに書き込む（または書き込むことを試みる）。再構成は、いくつかの実施形態で、複製セットメンバ（プライマリノードまたはセカンダリノード）が要求された状態を書き込むことができないときに、いつでも発生し得る。その場合に、ノードは、それ自体を複製セットから除去することによって、複製セット内で再構成を開始することができる。さらに、応答していない任意のセカンダリノードは、障害を発生し（これは、完全な障害ディテクタのゆえに保証される）、プライマリノードは、複製セットからそのセカンダリノードを除去することによって再構成をトリガする。いくつかの場合に、これは、プライマリノードに複製セットのプライマリであることを停止させない。
【０４４０】
データアクセスシステム３６１０を、クライアントデータ書き込み要求に従ってデータを書き込むように構成することができる。したがって、データアクセス要求３６４１（またはデータアクセス要求３２１５）が書き込み要求であるか、書き込み要求を含む場合に、プライマリノード３２１１は、クライアントデータ書き込み要求で示されるデータをセカンダリノード内のデータストアに書き込むようにセカンダリノード３２１２に指示することができる。いくつかの場合に、プライマリノードは、書き込み要求を２フェーズで１つまたは複数のセカンダリノード３２１２に複製する。この変形の利益は、書き込みクォーラムが複製セット３２１０内のすべてのセカンダリノードからなる場合に、読み取り動作をセカンダリによってサービスすることが可能になることである。いくつかの場合に、セカンダリノードおよびプライマリノードでの書き込み動作は、データをノードのそれぞれに個別に使用可能な安定したストレージに書き込むなど、追加ロジックをトリガすることができる。
【０４４１】
データアクセスシステム３６１０を、クライアントデータ読み取り要求に従ってデータを読み取るように構成することができる。したがって、データアクセス要求３６４１（またはデータアクセス要求３２１５）が、読み取り要求であるか読み取り要求を含む場合に、プライマリノード３２１１またはセカンダリノード３２１２のいずれかを、読み取り要求を直接に処理するように構成することができる。いくつかの場合に、プライマリノード３２１１が、要求内で示されるデータを読み取るようにセカンダリノードに要求することは、不必要である。他の場合に、セカンダリは、データを読み取り、クライアントデータ読み取り要求に自律的に応答することができるものとすることができる。
【０４４２】
本発明を、その趣旨または本質的特性から逸脱せずに他の特定の形で実施することができる。説明された実施形態は、すべての面で、例示的であって制限的ではないと考えられなければならない。したがって、本発明の範囲は、前述の説明ではなく添付の特許請求の範囲によって示される。特許請求の範囲の同等性の意味および範囲に含まれるすべての変更が、その範囲に含まれなければならない。
【図１】
0005498594.tif 000007
【図２】
0005498594.tif 000008
【図３】
0005498594.tif 000009
【図４】
0005498594.tif 000010
【図５】
0005498594.tif 000011
【図６】
0005498594.tif 000012
【図７】
0005498594.tif 000013
【図８】
0005498594.tif 000014
【図９】
0005498594.tif 000015
【図１０】
0005498594.tif 000016
【図１１】
0005498594.tif 000017
【図１２Ａ】
0005498594.tif 000018
【図１２Ｂ】
0005498594.tif 000019
【図１３】
0005498594.tif 000020
【図１４】
0005498594.tif 000021
【図１５】
0005498594.tif 000022
【図１６】
0005498594.tif 000023
【図１７】
0005498594.tif 000024
【図１８】
0005498594.tif 000025
【図１９Ａ】
0005498594.tif 000026
【図１９Ｂ】
0005498594.tif 000027
【図１９Ｃ】
0005498594.tif 000028
【図２０】
0005498594.tif 000029
【図２１】
0005498594.tif 000030
【図２２Ａ】
0005498594.tif 000031
【図２２Ｂ】
0005498594.tif 000032
【図２３Ａ】
0005498594.tif 000033
【図２３Ｂ】
0005498594.tif 000034
【図２３Ｃ】
0005498594.tif 000035
【図２３Ｄ】
0005498594.tif 000036
【図２４】
0005498594.tif 000037
【図２５】
0005498594.tif 000038
【図２６】
0005498594.tif 000039
【図２７】
0005498594.tif 000040
【図２８】
0005498594.tif 000041
【図２９】
0005498594.tif 000042
【図３０】
0005498594.tif 000043
【図３１】
0005498594.tif 000044
【図３２】
0005498594.tif 000045
【図３３】
0005498594.tif 000046
【図３４】
0005498594.tif 000047
【図３５】
0005498594.tif 000048
【図３６】
0005498594.tif 000049