(57)【要約】  複数の発行者からメッセージを受信し、順序付けられた複数のメッセージを各チャネルが含む複数のチャネルのうちの１つにメッセージの各々を割り当て、第１の持続時間のそれぞれの有効期間を各ストレージバッファが含むそれぞれのストレージバッファに順序に従ってチャネルのうちの各々のメッセージを格納し、特定のチャネルに対して、それぞれのストレージバッファから特定のチャネルのメッセージを取り出し、第２の持続時間のそれぞれの有効期間を各データブロックが含むデータブロックを含む配信バッファに特定のチャネルの取り出されたメッセージを格納し、かつ配信バッファ内に格納されたメッセージを特定のチャネルの複数の購読者に提供するためのコンピュータストレージデバイス上に符号化されたコンピュータプログラムを含む方法、システム、及び装置。【選択図】図５
2019535072.tif 000002
【特許請求の範囲】
【請求項１】
複数の発行者から複数のメッセージを受信する段階と、
順序付けられた複数のメッセージを各チャネルが含む複数のチャネルのうちの１つに前記メッセージの各々を割り当てる段階と、
第１の持続時間のそれぞれの有効期間を各ストレージバッファが含む１又は２以上のそれぞれのストレージバッファに前記順序に従って前記チャネルのうちの各々のメッセージを格納する段階と、
特定のチャネルに対して、それぞれのストレージバッファから前記特定のチャネルのメッセージを取り出す段階と、
第２の持続時間のそれぞれの有効期間を各データブロックが含む１又は２以上のデータブロックを含む配信バッファに前記順序に従って前記特定のチャネルの前記取り出されたメッセージを格納する段階と、
前記配信バッファに格納された前記メッセージを前記特定のチャネルの複数の購読者に提供する段階と、
を含むことを特徴とするコンピュータ実施方法。
【請求項２】
前記配信バッファに格納された前記メッセージを前記特定のチャネルの前記複数の購読者に提供する段階は、
特定の購読者の接続ステータスを決定する段階と、
それに基づいて、前記配信バッファに格納された前記メッセージのうちの１又は２以上を前記特定の購読者に提供する段階と、
を更に含む、
ことを特徴とする請求項１に記載の方法。
【請求項３】
前記特定の購読者が前記特定のチャネルとの既存の接続を有すると決定する段階と、
それに基づいて、満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納されたメッセージを含む前記配信バッファに格納された１又は２以上のメッセージを前記特定の購読者に提供する段階と、
を更に含むことを特徴とする請求項２に記載の方法。
【請求項４】
前記特定の購読者が前記特定のチャネルとの新しい接続を有すると決定する段階と、それに基づいて
（ｉ）満了していないそれぞれの有効期間を有する前記データブロックのうちの１又は２以上に格納された１又は２以上のメッセージを前記特定の購読者に提供する段階、及び
（ｉｉ）満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納された１又は２以上のメッセージを前記特定の購読者が受信することを防止する段階と、
を更に含むことを特徴とする請求項２に記載の方法。
【請求項５】
前記特定のチャネルの前記取り出されたメッセージを前記配信バッファに格納する段階は、
前記特定のチャネルの前記順序の後期に取り出されたメッセージを格納するのに使用されるデータブロックよりも早く満了することになる有効期間を有するデータブロックに該特定のチャネルの該順序の早期に取り出されたメッセージを格納する段階、
を含む、
ことを特徴とする請求項１に記載の方法。
【請求項６】
前記配信バッファは、前記データブロックの連結リストを含み、
前記特定のチャネルの前記順序の最後に取り出されたメッセージが、前記連結リストのテールデータブロックに格納される、
ことを特徴とする請求項１に記載の方法。
【請求項７】
前記特定のチャネルの前記取り出されたメッセージを前記配信バッファに格納する段階は、
前記連結リストのヘッドでの１又は２以上のデータブロックを該連結リストから取り除く段階、
を更に含み、
前記取り除かれたデータブロックは、満了したそれぞれの有効期間を含む、
ことを特徴とする請求項６に記載の方法。
【請求項８】
前記配信バッファは、第１のコンピュータノード上に存在し、
前記配信バッファに格納された前記メッセージは、前記第１のコンピュータノード上に存在するそれぞれのコンピュータ処理を通して前記複数の購読者の各々に提供される、
ことを特徴とする請求項１に記載の方法。
【請求項９】
前記ストレージバッファは、前記第１のコンピュータノードとは異なるそれぞれの第２のコンピュータノード上に存在する、
ことを特徴とする請求項８に記載の方法。
【請求項１０】
前記配信バッファは、可視区域及び不可視区域を含むことを特徴とする請求項１に記載の方法。
【請求項１１】
既存の接続を有する購読者が、前記可視区域及び前記不可視区域の両方からのデータにアクセスすることを許可されることを特徴とする請求項１０に記載の方法。
【請求項１２】
新しい接続を有する購読者が、前記可視区域からのデータにアクセスすることを許可され、かつ前記不可視区域からのデータにアクセスすることを許可されないことを特徴とする請求項１０に記載の方法。
【請求項１３】
複数の発行者から複数のメッセージを受信する段階と、
順序付けられた複数のメッセージを各チャネルが含む複数のチャネルのうちの１つに前記メッセージの各々を割り当てる段階と、
第１の持続時間のそれぞれの有効期間を各ストレージバッファが含む１又は２以上のそれぞれのストレージバッファに前記順序に従って前記チャネルのうちの各々のメッセージを格納する段階と、
特定のチャネルに対して、それぞれのストレージバッファから前記特定のチャネルのメッセージを取り出す段階と、
第２の持続時間のそれぞれの有効期間を各データブロックが含む１又は２以上のデータブロックを含む配信バッファに前記順序に従って前記特定のチャネルの前記取り出されたメッセージを格納する段階と、
前記配信バッファに格納された前記メッセージを前記特定のチャネルの複数の購読者に提供する段階と、
を含む動作を実行するようプログラムされた１又は２以上のコンピュータ、
を含むことを特徴とするシステム。
【請求項１４】
前記配信バッファに格納された前記メッセージを前記特定のチャネルの前記複数の購読者に提供する段階は、
特定の購読者の接続ステータスを決定する段階と、
それに基づいて、前記配信バッファに格納された前記メッセージのうちの１又は２以上を前記特定の購読者に提供する段階と、
を更に含む、
ことを特徴とする請求項１３に記載のシステム。
【請求項１５】
前記特定の購読者が前記特定のチャネルとの既存の接続を有すると決定する段階と、
それに基づいて、満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納されたメッセージを含む前記配信バッファに格納された１又は２以上のメッセージを前記特定の購読者に提供する段階と、
を更に含むことを特徴とする請求項１４に記載のシステム。
【請求項１６】
前記特定の購読者が前記特定のチャネルとの新しい接続を有すると決定する段階と、それに基づいて
（ｉ）満了していないそれぞれの有効期間を有する前記データブロックのうちの１又は２以上に格納された１又は２以上のメッセージを前記特定の購読者に提供する段階、及び
（ｉｉ）満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納された１又は２以上のメッセージを前記特定の購読者が受信することを防止する段階と、
を更に含むことを特徴とする請求項１４に記載のシステム。
【請求項１７】
前記特定のチャネルの前記取り出されたメッセージを前記配信バッファに格納する段階は、
前記特定のチャネルの前記順序の後期に取り出されたメッセージを格納するのに使用されるデータブロックよりも早く満了することになる有効期間を有するデータブロックに該特定のチャネルの該順序の早期に取り出されたメッセージを格納する段階、
を含む、
ことを特徴とする請求項１３に記載のシステム。
【請求項１８】
前記配信バッファは、前記データブロックの連結リストを含み、
前記特定のチャネルの前記順序の最後に取り出されたメッセージが、前記連結リストのテールデータブロックに格納される、
ことを特徴とする請求項１３に記載のシステム。
【請求項１９】
前記特定のチャネルの前記取り出されたメッセージを前記配信バッファに格納する段階は、
前記連結リストのヘッドでの１又は２以上のデータブロックを該連結リストから取り除く段階、
を更に含み、
前記取り除かれたデータブロックは、満了したそれぞれの有効期間を含む、
ことを特徴とする請求項１８に記載のシステム。
【請求項２０】
１又は２以上のコンピュータによって実行された時に、
複数の発行者から複数のメッセージを受信する段階と、
順序付けられた複数のメッセージを各チャネルが含む複数のチャネルのうちの１つに前記メッセージの各々を割り当てる段階と、
第１の持続時間のそれぞれの有効期間を各ストレージバッファが含む１又は２以上のそれぞれのストレージバッファに前記順序に従って前記チャネルのうちの各々のメッセージを格納する段階と、
特定のチャネルに対して、それぞれのストレージバッファから前記特定のチャネルのメッセージを取り出す段階と、
第２の持続時間のそれぞれの有効期間を各データブロックが含む１又は２以上のデータブロックを含む配信バッファに前記順序に従って前記特定のチャネルの前記取り出されたメッセージを格納する段階と、
前記配信バッファに格納された前記メッセージを前記特定のチャネルの複数の購読者に提供する段階と、
を含む動作を前記コンピュータに実行させる命令が格納された非一時的コンピュータ可読ストレージデバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
〔関連出願への相互参照〕
この出願は、引用により本明細書にその内容全体が組み入れられている２０１６年９月２３日出願の米国特許出願第１の５／２７４，２８１号に対する優先権を主張するものである。
【０００２】
本明細書は、データ通信システムに関し、特に、リアルタイムスケーラブル発行‐購読メッセージングを実施するシステムに関する。
【背景技術】
【０００３】
発行−購読パターン（又は「ＰｕｂＳｕｂ」）は、いわゆる発行者が、トピックに対するメッセージを発行し、いわゆる購読者が、彼らが購読している特定のトピックに関するメッセージを受信するソフトウエアシステムによって実施されるデータ通信メッセージング取り決めである。トピック毎に１又は２以上の発行者が存在する可能性があり、発行者は、一般的に、どの購読者が、もし居れば、発行されたメッセージを受信するかの知識を持っていない。一部のＰｕｂＳｕｂシステムは、メッセージをキャッシュに入れず、又は小さいキャッシュを有し、購読者が、特定のトピックに対する購読予約の時点の前で発行されたメッセージを受信しない場合があることを意味する。ＰｕｂＳｕｂシステムは、メッセージ発行のサージ中又は特定のトピックに対する購読者の数が増加する時に性能不安定を受け易い可能性がある。
【発明の概要】
【課題を解決するための手段】
【０００４】
様々な実施では、本明細書に説明するシステム及び方法は、複数の購読者によって同時に読み取ることができるメッセージデータを格納するために共有構造（すなわち、「高速バッファ」）を利用する。ロッキングに関連付けられた問題を回避するために、システム及び方法は、「ロック‐フリー」又は非ブロッキング手法を利用する。購読者は、ブロッキングすることなく又は高速バッファ内のどこから読み取るか及びどのポイントまで読み取るかを考えることなく、データの多くの部分を取り込むことができる。
【０００５】
このシステム及び方法は、以前の手法と比較して多くの利益を提供する。例えば、発行者は、もし在るとしてもどれほど多くの購読者が存在するかに関わりなく購読者又は関連の購読論理によって制限されず、かつ安定した発行速度を有する。システムのこの性質は、例えば、発行及び購読構成要素及び／又は処理を互いから独立にすることによって達成することができる。一部の事例では、発行及び購読構成要素は、例えば本明細書に説明する高速バッファ手法を使用してロック‐フリーメモリ書込及び読取を通して情報を共有することができる。これに代えて又はこれに加えて、発行及び購読構成要素及び／又は処理は、例えば、発行及び購読構成要素が、典型的に高速である及び／又はボトルネックを呈示しないメモリコントローラ及びバスだけを通して対話するように、異なる物理コアを利用するように構成することができる。
【０００６】
これに代えて又はこれに加えて、システム柔軟性が、望ましい場合に購読者よりも発行者が優先される（又は優先解除される）ことを可能にする。好ましい例では、高速バッファは、緩やかに結合された発行及び購読ループを有する又は利用する。これは、望ましい場合に発行速度が購読速度とは異なること、及び／又は例えばシステム負荷に従って各速度に対して選択又は優先されることを可能にする。発行活動が高い及び／又は発行活動を制限しないことが好ましい時に、例えば発行ループを購読ループよりも優先することができる。このような優先順位付けを達成するために、発行ループは、あたかも購読者がいないようにスピンするよう作ることができる（例えば、発行ループは、購読ループが処理されるよりも高速に処理することができる）。換言すると、購読者がメッセージデータの全てについて行く又は受信できない場合でも、可能な限り多くの発行メッセージデータを本発明のシステムが渡すことができるようにすることによって発行者をブロック又は制限しないことが望ましい。これに代えて又はこれに加えて、購読活動が高い時に、発行活動が低減されるように購読者をブロック又は制限しない及び／又は発行者に自動バックプレッシャーを加えないことが望ましい。このような優先順位付けは、例えば、２つの作業者プール（例えば、１つは発行者のプール及び１つは購読者のプール）を作成し、かつ２つのプール内のスレッドに異なる優先順位を設定するためのオペレーティングシステムカーネルスケジューラ優先順位付け機構を使用することによって達成することができる。発行者及び購読者の優先順位付け又は優先順位付け解除の他の手法も考えられている。
【０００７】
本発明のシステム及び方法の更に別の利点は、購読者がデータ集約を利用することができ、かつ集約するデータの量を定義することができることである。一般的に、データ集約の使用及び／又は集約サイズの最適化は、より良いパフォーマンス特性の達成及び／又はメモリ使用の低減を支援することができる。例えばメッセージを配信する時に、メッセージをブロック又はバッチ（例えば、高速バッファ内のメッセージのコンマで区切ったリスト）に分けることができる。メッセージデータの送信を準備する時に、システム及び方法は、次のブロックに集約するメッセージの数を決定することができる。接続で交換されるパケットのサイズは、接続特性（例えば、帯域幅及び／又は待ち時間）及び／又はＴＣＰ接続の状態に依存する可能性がある。一部の事例では、これは、接続のメッセージを集める処理がブロック内の多くのメッセージを集約して大きなパケットを生成することを可能にし、それによってネットワーク容量をより良く利用し、少ないオーバーヘッドで高スループットを提供する。
【０００８】
本発明のシステム及び方法の別の利益は、メッセージ活動に応じて購読者がパフォーマンスと待ち時間の間で最適な均衡を見出すことによってデータ読取の頻度を変更することができることである。例えば、本明細書に説明する通知子手法を使用して、高メッセージ活動を有するチャネルの新しいメッセージを能動的にモニタすることができ、低メッセージ活動を持つチャネルはそれほど能動的にモニタすることなく受信することができる。購読者は、分離されて互いに影響を与えないことが好ましい。１人の購読者がメッセージストリームよりも遅い場合に、他の購読者は、一般的に遅い購読者によって影響されず、メッセージストリームについて行くことができる。
【０００９】
本発明のシステム及び方法の更に別の利益は、システム構成要素が独立に実施されることを可能にするモジュール性が増加することである。対話は、メモリを通して行われることが好ましく、それによって購読者を別々の個々の処理上に置き、高速バッファにアクセスさせることができる。代替手法では、システムの複数の論理部を緊密に結合してインタフェースオーバーヘッド（例えば、データのエクスポートを準備する及び入力に対して構文解析すること）を低減し、及び／又は粒度及び精度を上げる変更を行うことができる。このような手法の欠点は、分離が低下し、信頼性が低下し、一般的に効率が悪いことである（例えば、他の構成要素に影響を与える１つの構成要素の負荷に起因して）。本明細書に説明するシステム及び方法の例で使用する反対の手法は、構成要素を互いに分離してシステム構成要素の向上した信頼性及び効率、及び最適な管理及び優先順位付けを達成することである。一般的に、オーバーヘッドの費用が低い又は少なくとも許容可能である時に分離はより有効である。本発明のシステム及び方法では、例えば、高速バッファに書き込む及び高速バッファから読み取ることによって処理を伝達することができるので、オーバーヘッドの費用は一般的に低い。本発明のシステム及び方法は、殆ど又は全く追加コストなしでそのようなモジュール性から利益を得ることができる。一部の実施では、オペレーティングシステムレベルの共有メモリが使用される時に、発行者及び購読者を異なる処理において実施することができ、及び／又は発行者及び購読者が異なる言語で書かれた実施を使用して開始することができる。一般的に、高速バッファの使用を通した対話は、２つの動作：メモリへの書込及びメモリからの読取だけに通信を制限する。メッセージ、信号、ロック、及び／又は同期プリミティブの使用は回避することができる。本明細書で議論するように、試験結果は、本発明のシステム及び方法が発行者から購読者へのメッセージ転送速度を大幅に改善することを示している。
【００１０】
一般的に、本明細書に説明する主題の一態様は、複数の発行者から複数のメッセージを受信するアクションと、メッセージの各々を複数のチャネルのうちの１つに割り当てるアクションであって、各チャネルが順序付けられた複数のメッセージを含むアクションと、順序に従って１又は２以上のそれぞれのストレージバッファにチャネルのうちの各々のメッセージを格納するアクションであって、各ストレージバッファが第１の持続時間のそれぞれの有効期間（ＴＴＬ）を含むアクションと、特定のチャネルに対して、それぞれのストレージバッファから特定のチャネルのメッセージを取り出すアクションと（例えば、満了しておらず順序に従う有効期間を有するメッセージ）、順序に従って配信バッファに特定のチャネルの取り出したメッセージを格納するアクションであって、配信バッファが１又は２以上のデータブロックを含み、各データブロックが第２の持続時間（例えば、第１の持続時間よりも長い）のそれぞれの有効期間を含むアクションと、配信バッファに格納されたメッセージを特定のチャネルの複数の購読者に提供するアクションとを含むコンピュータ実施方法に具現化することができる。この態様の他の実施形態は、対応するシステム、装置、ストレージデバイス、及びコンピュータプログラムを含む。
【００１１】
これら及び他の態様は、任意的に以下の特徴の１又は２以上を含むことができる。配信バッファに格納されたメッセージを特定のチャネルの複数の購読者に提供するアクションは、特定の購読者の接続ステータスを決定するアクションと、それに基づいて配信バッファに格納されたメッセージの１又は２以上を特定の購読者に提供するアクションとを含むことができる。この態様は、特定の購読者が特定のチャネルとの現在の接続を有すると決定するアクションと、それに基づいて、満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納されたメッセージを含む配信バッファに格納された１又は２以上のメッセージを特定の購読者に提供するアクションとを含むことができる。この態様は、特定の購読者が特定のチャネルとの現在の接続を持たないと決定するアクションと、それに基づいて、（ｉ）満了していないそれぞれの有効期間を有するデータブロックのうちの１又は２以上に格納された１又は２以上のメッセージを特定の購読者に提供するアクション及び（ｉｉ）満了したそれぞれの有効期間を有する１又は２以上のデータブロックに格納された１又は２以上のメッセージを特定の購読者が受信することをブロッキングするアクションとを含むことができる。特定のチャネルの取り出されたメッセージを配信バッファに格納するアクションは、順序の後期に特定のチャネルの取り出されたメッセージを格納するのに使用されるデータブロックよりも早く満了することになる有効期間を有するデータブロックに順序の早期に特定のチャネルの取り出されたメッセージを格納するアクションを含むことができる。配信バッファは、データブロックの連結リストを含むことができる。特定のチャネルの順序の最後に取り出されたメッセージは、連結リストのテールデータブロックに格納することができる。配信バッファに特定のチャネルの取り出されたメッセージを格納するアクションは、連結リストのヘッドで１又は２以上のデータブロックを連結リストから取り除くアクションを更に含むことができる。取り除かれたデータブロックは、満了したそれぞれの有効期間（例えば、指定された期間を超える）を含む可能性がある。配信バッファは、第１のコンピュータノード上に存在することができる。配信バッファに格納されたメッセージは、第１のコンピュータノード上に存在するそれぞれのコンピュータ処理を通して複数の購読者の各々に提供することができる。ストレージバッファは、第１のコンピュータノードとは異なるそれぞれの第２のコンピュータノード上に存在することができる。一部の例では、配信バッファは、可視区域と不可視区域を含むことができる。既存の接続を有する購読者（例えば、配信バッファへの読取アクセスを以前に許可されて配信バッファから読み取っている購読者）は、可視区域と不可視区域の両方からのデータにアクセスすることを許可される場合がある。新しい接続を有する購読者（例えば、最近読取アクセスを許可されて配信バッファからの読取をまだ開始していない購読者）は、可視区域からのデータへのアクセスを許可されて不可視区域からのデータへのアクセスを許可されない場合がある。
【００１２】
本明細書に説明する主題の１又は２以上の実施形態の詳細は、添付図面及び以下の説明に示している。本発明の主題の他の特徴、態様、及び利点は、説明、図面、及び特許請求の範囲から明らかになるであろう。
【図面の簡単な説明】
【００１３】
【図１Ａ】ＰｕｂＳｕｂ通信パターンをサポートする例示的システムを示す図である。
【図１Ｂ】例示的クライアントデバイス上のソフトウエアの機能層を示す図である。
【図２】例示的メッセージングシステムの図である。
【図３Ａ】データをストリームレットに書き込む例示的方法のデータ流れ図である。
【図３Ｂ】ストリームレットからデータを読み取る例示的方法のデータ流れ図である。
【図４Ａ】メッセージをメッセージングシステムのチャネルに発行する例示的方法のデータ流れ図である。
【図４Ｂ】メッセージングシステムのチャネルを購読する例示的方法のデータ流れ図である。
【図４Ｃ】メッセージングシステムのチャネルのメッセージを格納するための例示的データ構造の図である。
【図５】Ｑノードからメッセージを取り出して取り出したメッセージをメッセージングシステムの購読者に提供するＭＸノードを示す概略図である。
【図６】異なる時間インスタンスでのメッセージングシステムのＭＸノード内の高速バッファの例示的データブロックを示す図である。
【図７】メッセージデータを複数の購読者に送信する例示的方法の流れ図である。
【００１４】
様々な図面における同じ参照番号及び表示は同じ要素を示す。
【発明を実施するための形態】
【００１５】
図１Ａは、ＰｕｂＳｕｂ通信パターンをサポートする例示的システム１００を示している。発行者クライアント（例えば、発行者１）は、システム１００によってメッセージを指名チャネル（例えば、「チャネル１」）に発行することができる。メッセージは、テキスト、画像コンテンツ、音声コンテンツ、マルチメディアコンテンツ、ビデオコンテンツ、及びバイナリデータなどの１又は２以上を含むあらゆるタイプの情報を含むことができる。メッセージデータの他のタイプも可能である。購読者クライアント（例えば、購読者２）は、システム１００を使用して指名チャネルを購読予約し、かつ購読要求後に又は所与の位置（例えば、メッセージ番号又は時間オフセット）から発生するメッセージの受信を開始することができる。クライアントは、発行者及び購読者の両方とすることができる。
【００１６】
構成に応じて、ＰｕｂＳｕｂシステムは、以下のように分類することができる。
・１対１（１：１）。この構成では、チャネル毎に１人の発行者及び１人の購読者がいる。典型的な使用事例は、プライベートメッセージングである。
・１対多数（１：Ｎ）。この構成では、チャネル毎に１人の発行者と複数の購読者がいる。典型的な使用事例は、放送メッセージ（例えば、株価）である。
・多数対多数（Ｍ：Ｎ）。この構成では、単一チャネルに発行する多くの発行者がいる。
メッセージは、次に、複数の購読者に配信される。典型的な使用事例は、地図アプリケーションである。
【００１７】
指名チャネルを生成するのに必要な個別の動作（operation）はない。チャネルが購読された時又はメッセージがチャネルに発行された時にチャネルが暗黙的に生成される。一部の実施では、チャネル名は、名前空間によって限定することができる。名前空間は、１又は２以上のチャネル名を含む。異なる名前空間は、曖昧さを生じることなく同じチャネル名を有することができる。名前空間名は、名前空間及びチャネネームがドット又は他の適切な分離記号によって分けられる場合のチャネル名の接頭辞とすることができる。一部の実施では、チャネル許可設定を指定する時に名前空間を使用することができる。例えば、メッセージングシステム１００は、ａｐｐ１．ｆｏｏ及びａｐｐ１．ｓｙｓｔｅｍ．ｎｏｔｉｆｉｃａｔｉｏｎｓチャネルを有することができ、ここで「ａｐｐｌ」は、名前空間の名称である。本発明のシステムは、クライアントがａｐｐｌ．ｆｏｏチャネルを購読及び発行することを可能にすることができる。しかし、クライアントは、ａｐｐｌ．ｓｙｓｔｅｍ．ｎｏｔｉｆｉｃａｔｉｏｎｓチャネルを発行しないが購読のみとすることができる。
【００１８】
図１Ｂは、例示的クライアントデバイス上のソフトウエアの機能層を示している。クライアントデバイス（例えば、クライアント１０２）は、例えば、パーソナルコンピュータ、ラップトップコンピュータ、タブレットコンピュータ、スマートフォン、スマートウォッチ、又はサーバコンピュータのようなデータ処理装置である。他のタイプのクライアントデバイスも可能である。アプリケーション層１０４は、ＰｕｂＳｕｂシステム１００に統合することになるエンド−ユーザアプリケーションを含む。メッセージング層１０６は、アプリケーション層１０４がチャネル購読、メッセージ発行、メッセージ取り出し、ユーザ認証、及びユーザ許可のようなシステム１００のサービスを利用するプログラミングインタフェースである。一部の実施では、メッセージング層１０６との間で送られるメッセージは、ＪａｖａＳｃｒｉｐｔ（登録商標）オブジェクト表記（ＪＳＯＮ）オブジェクトとして符号化される。他のメッセージ符号化方式も可能である。
【００１９】
オペレーティングシステム１０８層は、クライアント１０２のオペレーティングシステムソフトウエアを含む。様々な実施では、持続的又は非持続的接続を使用してシステム１００にメッセージを送信する及びシステム１００からメッセージを受信することができる。持続的接続は、例えば、ネットワークソケットを使用して生成することができる。ＴＣＰ／ＩＰ層１１２のようなトランスポートプロトコルは、メッセージング層１０６によって使用されるシステム１００とのトランスポート制御プロトコル／インターネットプロトコル通信を実施し、接続を通してシステム１００にメッセージを送信する。例えば、ユーザデータグラムプロトコル（ＵＤＰ）を含む他の通信プロトコルも可能である。更に別の実施では、任意的なトランスポート層セキュリティ（ＴＬＳ）層１１０を利用してメッセージの機密性を保証することができる。
【００２０】
図２は、例示的メッセージングシステム１００の図である。システム１００は、ＰｕｂＳｕｂ通信パターンを実施するための機能性を提供する。本発明のシステムは、例えば、１又は２以上の地理的な場所で１又は２以上のデータセンター１２２に配備することができるソフトウエア構成要素及びストレージを含む。本発明のシステムは、ＭＸノード（例えば、ＭＸノード又は多重化ノード２０２、２０４、及び２０６）、Ｑノード（例えば、Ｑノード又は待ち行列ノード２０８、２１０、及び２１２）、１又は２以上のチャネルマネージャノード（例えば、チャネルマネージャ２１４、２１５）、及び任意的に１又は２以上のＣノード（例えば、Ｃノード又はキャッシュノード２２０及び２２２）を含む。各ノードは、仮想機械又は物理機械（例えば、データ処理装置）で実行することができる。
【００２１】
各ＭＸノードは、外部ネットワーク２１６を通じた１又は２以上の発行者及び／又は購読者接続の終端ポイントとして機能する。ＭＸノード、Ｑノード、Ｃノード、及びチャネルマネージャ間の内部通信は、例えば、内部ネットワーク２１８を通じて行われる。例示的に、ＭＸノード２０４をクライアント１０２からの購読者接続の終端とすることができる。各Ｑノードは、ＭＸノードによって消費するチャネルデータをバッファに入れる。チャネルに発行されたメッセージの順序付けられたシーケンスが論理的チャネルストリームである。例えば、３つのクライアントが所与のチャネルにメッセージを発行する場合に、クライアントによって発行された複合メッセージは、チャネルストリームを含む。メッセージは、チャネルストリーム内で、例えば、クライアントによる発行の時間により、ＭＸノードによる受信の時間により、又はＱノードによる受信の時間によって順序付けることができる。チャネルストリームのメッセージを順序付けるための他の方法も可能である。１よりも多いメッセージが順序の同じ位置に割り当てられる場合に、順序の後ろのシーケンスを有するメッセージの１つを（例えば、ランダムに）選択することができる。各チャネルマネージャノードは、チャネルストリームをいわゆるストリームレットに分割することによってＱノードの負荷を管理する役割を果たす。ストリームレットは以下に詳しく説明する。任意的Ｃノードは、キャッシュ及びＱノードからの負荷除去を提供する。
【００２２】
例示的メッセージングシステム１００では、１又は２以上のクライアントデバイス（発行者及び／又は購読者）は、ＭＸノード（例えば、ＭＸノード２０４）へのそれぞれの持続的接続（例えば、ＴＣＰ接続）を設定する。ＭＸノードは、これらの接続の終端ポイントとして機能する。例えば、これらの接続によって運ばれた外部メッセージ（例えば、それぞれのクライアントデバイスとＭＸノード間）は、外部プロトコル（例えば、ＪＳＯＮ）に基づいて符号化することができる。ＭＸノードは、外部プロトコルを終了して外部メッセージを内部通信に翻訳し、逆も同様である。ＭＸノードは、クライアントの代わりにストリームレットを発行及び購読する。従って、ＭＸノードは、同じチャネルを購読又は発行するクライアントデバイスの要求を多重化及び融合することができ、従って、１つずつの代わりに１つとして複数のクライアントデバイスを表している。
【００２３】
例示的メッセージングシステム１００では、Ｑノード（例えば、Ｑノード２０８）は、１又は２以上のチャネルストリームの１又は２以上のストリームレットを格納することができる。ストリームレットは、チャネルストリームの一部分のためのデータバッファである。ストリームレットは、そのストレージが満杯である時に書込に対して閉じることになる。ストリームレットは、ストリームレットの有効期間（ＴＴＬ）が満了した時に読取及び書込に対して閉じて割り当てを解除する。例示的に、ストリームレットは、１ＭＢの最大サイズ及び３分のＴＴＬを有することができる。異なるチャネルは、異なるサイズ及び／又は異なるＴＴＬによって制限されるストリームレットを有することができる。例えば、１つのチャネル内のストリームレットは、３分まで存在することができる一方、別のチャネル内のストリームレットは、１０分まで存在することができる。様々な実施では、ストリームレットは、Ｑノードで実行されるコンピュータ処理に対応する。コンピュータ処理は、ストリームレットのＴＴＬが満了した後に終了することができ、従って、例えば、Ｑノードに戻るコンピュータリソース（ストリームレット）を解放する。
【００２４】
クライアントデバイスから発行要求を受信した時に、ＭＸノード（例えば、ＭＸノード２０４）は、チャネルマネージャ（例えば、チャネルマネージャ２１４）に要求してストリームレットへのアクセスを許可し、発行されるメッセージを書き込む。しかし、ＭＸノードがチャネル内のストリームレットへの書込アクセスを予め許可される（かつチャネルが書込に対して閉じていない）場合に、ＭＸノードは、ストリームレットにアクセスする許可を要求する必要なくこのストリームレットにメッセージを書き込むことができることに注意されたい。メッセージがチャネル内のストリームレットに書き込まれた状態で、メッセージは、ＭＸノードによって読み取られ、このチャネルの購読者に提供することができる。
【００２５】
同様に、クライアントデバイスからチャネル購読要求を受信した時に、ＭＸノードは、チャネル内のストリームレットへのアクセスのための許可をチャネルマネージャに要求してストリームレットからメッセージが読み取られる。ＭＸノードがチャネル内のストリームレットへの読取アクセスを予め許可されている（かつチャネルのＴＴＬが読取に対して閉じていない）場合に、ＭＸノードは、ストリームレットにアクセスする許可を要求する必要なくストリームレットからメッセージを読み取ることができる。読取メッセージは、チャネルに購読予約したクライアントデバイスに転送することができる。様々な実施では、ストリームレットから読み取られたメッセージは、ＭＸノードによってキャッシュに入れられ、それによってＭＸノードは、ストリームレットから読み取るのに必要な時間数を低減することができる。
【００２６】
例示的に、ＭＸノードは、ＭＸノードが特定のチャネル内のストリームレットを格納する特定のＱノードのストリームレットにデータのブロックを格納することを可能にするチャネルマネージャからの許可を要求することができる。例示的ストリームレット許可要求及び許可データ構造は以下の通りである。
2019535072.tif 000003
【００２７】
ＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｑｕｅｓｔデータ構造は、ストリームｃｈａｎｎｅｌの名前及びＭＸノードがストリームレットからの読取又はストリームレットへの書込を意図するか否かを示すモードを格納する。ＭＸノードは、ＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｑｕｅｓｔをチャネルマネージャノードに送信する。チャネルマネージャノードは、相応にＭＸノードにＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅデータ構造を送信する。ＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅは、ストリームレットの識別子（ｓｔｒｅａｍｌｅｔ−ｉｄ）、ストリームレットの最大サイズ（ｌｉｍｉｔ−ｓｉｚｅ）、ストリームレットが格納することができるメッセージの最大数（ｌｉｍｉｔ−ｍｓｇｓ）、ＴＴＬ（ｌｉｍｉｔ−ｌｉｆｅ）、及びストリームレットが存在するＱノードの識別子（ｑ−ｎｏｄｅ）を含有する。ＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｑｕｅｓｔ及びＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅはまた、ストリームレットから読み取るためのストリームレットの位置（又はチャネルの位置）を示す位置フィールドを有することができる。
【００２８】
許可は、ストリームレットが閉じた状態で無効になる。例えば、ストリームレットは、ストリームレットのＴＴＬが満了した状態で読取及び書込に対して閉じ、ストリームレットのストレージが満杯の時はストリームレットが書込に対して閉じる。許可が無効になった時に、ＭＸノードは、ストリームレットから読み取る又はストリームレットに書き込むためのチャネルマネージャからの新しい許可を要求することができる。新しい許可は、異なるストリームレットを参照することになり、かつ新しいストリームレットが存在する場所に応じて同じか又は異なるＱノードを意味することになる。
【００２９】
図３Ａは、様々な実施でのデータをストリームレットに書き込む例示的方法のデータ流れ図である。図３Ａでは、ストリームレットに書き込むためのＭＸノード（例えば、ＭＸノード２０２）要求が、上述のようにチャネルマネージャ（例えば、チャネルマネージャ２１４）によって許可された時に、ＭＸノードは、チャネルマネージャ（３０２）から受信した許可応答で識別されたＱノード（例えば、Ｑノード２０８）との送信制御プロトコル（ＴＣＰ）接続を確立する。ストリームレットは、複数の書込許可（例えば、複数の発行者クライアントによって発行されたメッセージに対する）によって同時に書き込むことができる。ＭＸノードとＱノード間の接続プロトコルの他のタイプも可能である。
【００３０】
ＭＸノードは、次に、ＭＸノードがＱノードに書き込みたいストリームレットの識別子を備えた準備−発行メッセージを送信する（３０４）。ストリームレット識別子及びＱノード識別子は、上述のように書込許可でチャネルマネージャによって提供することができる。Ｑノードは、識別されたストリームレットのハンドラ処理３０１（例えば、Ｑノードで実行されるコンピュータ処理）にメッセージを渡す（３０６）。ハンドラ処理は、ＭＸノードに肯定応答を送信することができる（３０８）。肯定応答を受信した後に、ＭＸノードは、識別されたストリームレットに受信したデータを格納するハンドラ処理へのメッセージの書込（発行）（例えば、３１０、３１２、３１４、及び３１８）を開始する。ハンドラ処理はまた、受信したデータの肯定応答（３１６、３２０）をＭＸノードに送信することができる。一部の実施では、肯定応答は、抱き合わせ又は累積的とすることができる。例えば、ハンドラ処理は、予め決められたデータ量が受信される毎に（例えば、１００メッセージが受信される毎に）、又は予め決められた時間毎に（例えば、１ミリ秒毎に）ＭＸノードに肯定応答を送信することができる。ネーグルのアルゴリズムのような他の肯定応答スケジューリングアルゴリズムを使用することもできる。
【００３１】
ストリームレットが、発行されたデータをそれ以上受け入れられない場合（例えば、ストリームレットが満杯の時）、ハンドラ処理は、問題を示す否定応答（ＮＡＫ）メッセージ（３３０）、次に、ＥＯＦ（ファイルの終わり）メッセージ（３３２）を送信する。従って、ハンドラ処理は、発行許可のためのＭＸノードとのアソシエーションを閉じる。ＭＸノードが格納する追加のメッセージを有する場合に、ＭＸノードは、チャネルマネージャから別のストリームレットの書込許可を要求することができる。
【００３２】
図３Ｂは、様々な実施でのストリームレットからデータを読み取る例示的方法のデータ流れ図である。図３Ｂでは、ＭＸノード（例えば、ＭＸノード２０４）は、チャネルマネージャ（例えば、チャネルマネージャ２１４）に特定のメッセージから始まる特定のチャネル又はチャネルの時間オフセットを読み取るための要求を送信する。チャネルマネージャは、特定のメッセージを含有するストリームレットの識別子、特定のメッセージに対応するストリームレットにおける位置、及び特定のストリームレットを含有するＱノード（例えば、Ｑノード２０８）の識別子を含む読取許可をＭＸノードに戻す。ＭＸノードは、ＱノードとのＴＣＰ接続を確立する（３５２）。ＭＸノードとＱノード間の接続プロトコルの他のタイプも可能である。
【００３３】
ＭＸノードは、ストリームレットの識別子（Ｑノード内）及びＭＸノードがそこから読み取りたいストリームレットの位置を備えた購読メッセージ（３５４）をＱノードに送信する（３５６）。Ｑノードは、購読メッセージをストリームレットのハンドラ処理３５１に渡す（３５６）。ハンドラ処理は、ＭＸノードに肯定応答を送信することができる（３５８）。ハンドラ処理は、ストリームレットの位置で開始されるメッセージ（３６０、３６４、３６６）をＭＸノードに送信する。一部の実施では、ハンドラ処理は、ストリームレットのメッセージの全てをＭＸノードに送信することができる。特定のストリームレット内の最後のメッセージを送信した後に、ハンドラ処理は、最後のメッセージの通知をＭＸノードに送信することができる。ＭＸノードは、特定のチャネル内の次のメッセージを含有する別のストリームレットに対する別の要求をチャネルマネージャに送信することができる。
【００３４】
特定のストリームレットが閉じた場合（例えば、特定のストリームレットのＴＴＬが満了した後）、ハンドラ処理は、非購読メッセージ（３９０）、次に、ＥＯＦメッセージ（３９２）を送信して読取許可のためのＭＸノードとのアソシエーションを閉じることができる。ＭＸノードは、ＭＸノードが特定のチャネル内のメッセージのために別のストリームレットに移る（例えば、チャネルマネージャによって示されたように）時にハンドラ処理とのアソシエーションを閉じることができる。ＭＸノードは、ＭＸノードが、対応するクライアントデバイスから非購読メッセージを受信した場合に、ハンドラ処理とのアソシエーションを閉じることができる。
【００３５】
様々な実施では、ストリームレットは、同じ時間インスタンスに書き込み、かつ読み取ることができる。例えば、同じ時間インスタンスに有効読取許可及び有効書込許可を存在させることができる。様々な実施では、複数の読取許可（例えば、複数の発行者クライアントによって購読されるチャネルに対する）によって同時にストリームレットを読み取ることができる。ストリームレットのハンドラ処理は、例えば、到着時間に基づいて同時書込許可からのメッセージを順序付けし、その順序に基づいてメッセージを格納することができる。従って、複数の発行者クライアントからチャネルに発行されたメッセージは、チャネル内のストリームレットにシリアル化して格納することができる。
【００３６】
メッセージングシステム１００では、１又は２以上のＣノード（例えば、Ｃノード２２０）は、１又は２以上のＱノードからのデータ転送をアンロードすることができる。例えば、特定のチャネルのためのストリームレットをＱノードから要求する多くのＭＸノードが存在する場合に、ストリームレットをアンロードして１又は２以上のＣノードをキャッシュに入れることができる。ＭＸノード（例えば、チャネルマネージャから読取許可によって命令される）は、代わりにＣノードからストリームレットを読み取ることができる。
【００３７】
上述のように、メッセージングシステム１００内のチャネルのためのメッセージは、チャネルストリームで順序付けされる。チャネルマネージャ（例えば、チャネルマネージャ２１４）は、それぞれのＱノードに各々が存在する固定サイズストリームレットにチャネルストリームを分割する。従って、チャネルストリームの格納は、多くのＱノード間で共有することができ、各Ｑノードは、チャネルストリームの一部分（１又は２以上のストリームレット）を格納する。より具体的には、ストリームレットは、例えば、Ｑノード上のコンピュータ処理に関連付けられたレジスタ及び／又は動的メモリ要素に格納することができ、従って、ハードディスクのような持続性低速ストレージデバイスにアクセスする必要性を回避する。これは高速のメッセージアクセスをもたらす。チャネルマネージャは、Ｑノードのそれぞれの負荷をモニタし、いかなる１つのＱノードの過負荷も回避する方法でストリームレットを割り当てることにより、メッセージングシステム１００のＱノード間の負荷の均衡を取ることができる。
【００３８】
様々な実施では、チャネルマネージャは、各アクティブストリームレット、ストリームレットが存在するそれぞれのＱノード、ストリームレットの第１のメッセージの位置の識別、及びストリームレットが書込に対して閉じているか否かを識別するリストを維持する。一部の実施では、Ｑノードは、満杯であるために又はストリームレットのＴＴＬが満了した時にストリームレットが閉じていることをストリームレットに発行しているチャネルマネージャ及びあらゆるＭＸノードに通知する。ストリームレットが閉じている時に、ＭＸノードがストリームレットからメッセージの取り出しを継続することができるようにストリームレットのＴＴＬが満了するまでアクティブストリームレットのチャネルマネージャのリストにストリームレットが残る。
【００３９】
ＭＸノードが所与のチャネルに対する書込許可を要求して書き込むことができるチャネルのためのストリームレットがない時に、チャネルマネージャは、Ｑノードの１つに新しいストリームレットを割り当て、ストリームレットのアイデンティティ及びＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅのＱノードを戻す。そうでなければ、チャネルマネージャは、ストリームレット及び対応するＱノードをＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅに書き込むために現在開いているというアイデンティティを戻す。ＭＸノードは、ストリームレットが満杯になるか又はストリームレットのＴＴＬが満了するまでストリームレットにメッセージを発行することができ、この後で新しいストリームレットをチャネルマネージャによって割り当てることができる。
【００４０】
ＭＸノードが所与のチャネルの読取許可を要求して読み取ることができるチャネルのためのストリームレットがない時に、チャネルマネージャは、Ｑノードの１つに新しいストリームレットを割り当て、ストリームレットのアイデンティティ及びＳｔｒｅａｍｌｅｔＧｒａｎｔＲｅｓｐｏｎｓｅのＱノードを戻す。そうでなければ、チャネルマネージャは、ストリームレットのアイデンティティ及びＭＸノードが読み取りたい位置を含有するＱノードを戻す。Ｑノードは、送信するストリームレットのメッセージがなくなるまで指定された位置で始まるストリームレットからＭＸノードへのメッセージの送信を開始することができる。新しいメッセージがストリームレットに発行された時に、このストリームレットを購読しているＭＸノードは、新しいメッセージを受信する。ストリームレットのＴＴＬが満了した場合に、ハンドラ処理３５１は、ＥＯＦメッセージ（３９２）をストリームレットを購読するいずれのＭＸノードにも送信する。
【００４１】
図２に関して上述したように、メッセージングシステム１００は、複数のチャネルマネージャ（例えば、チャネルマネージャ２１４、２１５）を含むことができる。複数のチャネルマネージャは、弾力性を提供して単一障害点を回避する。例えば、１つのチャネルマネージャは、それが維持するストリームレットと現在の許可のリストとを別の「スレーブ」チャネルマネージャに複製することができる。別の例として、複数のチャネルマネージャは、例えば、Ｐａｘｏｓ又はＲａｆｔプロトコルのような分散コンセンサスプロトコルを使用して複数のチャネルマネージャ間で動作を調整することができる。
【００４２】
図４Ａは、メッセージングシステム内のチャネルにメッセージを発行する例示的方法のデータ流れ図である。図４Ａでは、発行者（例えば、発行者クライアント４０２、４０４、４０６）が、図２に関して上述したメッセージングシステム１００にメッセージを発行する。例えば、発行者４０２は、接続４１１をそれぞれ確立して発行要求をＭＸノード２０２に送信する。発行者４０４は、接続４１３をそれぞれ確立して発行要求をＭＸノード２０６に送信する。発行者４０６は、接続４１５をそれぞれ確立して発行要求をＭＸノード２０４に送信する。ここでＭＸノードは、内部ネットワーク２１８を通じてメッセージングシステム１００のチャネルマネージャ（例えば、チャネルマネージャ２１４）及び１又は２以上のＱノード（例えば、Ｑノード２１２及び２０８）と通信することができる（４１７）。
【００４３】
例証として、発行者からＭＸノードへの各発行要求（例えば、ＪＳＯＮ鍵／値ペアにおける）は、チャネル名及びメッセージを含む。ＭＸノード（例えば、ＭＸノード２０２）は、発行要求のメッセージを発行要求のチャネル名（例えば、「ｆｏｏ」）に基づいてメッセージングシステム１００の別々のチャネルに割り当てることができる。ＭＸノードは、チャネルマネージャ２１４によって割り当てられたチャネルを確認することができる。チャネル（購読要求で指定）がメッセージングシステム１００にまだ存在しない場合、チャネルマネージャは、メッセージングシステム１００内で新しいチャネルを生成かつ維持することができる。例えば、チャネルマネージャは、チャネルのストリームの各アクティブストリームレットを識別するリスト、ストリームレットが存在するそれぞれのＱノード、及び上述のようなストリームレットの最初と最後のメッセージの位置の識別を維持することによって新しいチャネルを維持することができる。
【００４４】
特定のチャネルのメッセージに関して、ＭＸノードは、メッセージングシステム１００の１又は２以上のバッファ又はストリームレットにメッセージを格納することができる。例えば、ＭＸノード２０２は、発行者４０２からチャネルｆｏｏへの発行要求メッセージＭ１１、Ｍ１２、Ｍ１３、及びＭ１４を受信する。ＭＸノード２０６は、発行者４０４からチャネルｆｏｏへの発行要求メッセージＭ７８及びＭ７９を受信する。ＭＸノード２０４は、発行者４０６からチャネルｆｏｏへの発行要求メッセージＭ２６、Ｍ２７、Ｍ２８、Ｍ２９、Ｍ３０及びＭ３１を受信する。
【００４５】
ＭＸノードは、チャネルｆｏｏのためのメッセージを格納する１又は２以上のストリームレットを識別することができる。上述のように、各ＭＸノードは、ＭＸノードがチャネルｆｏｏのストリームレットにメッセージを格納することを可能にするチャネルマネージャ２１４からの書込許可を要求することができる。例えば、ＭＸノード２０２は、チャネルマネージャ２１４からＱノード２１２上のストリームレット４１０１にメッセージＭ１１、Ｍ１２、Ｍ１３、及びＭ１４を書き込む許可を受信する。ＭＸノード２０６は、チャネルマネージャ２１４からストリームレット４１０１にメッセージＭ７８及びＭ７９を書き込む許可を受信する。ここでストリームレット４１０１は、チャネルｆｏｏのメッセージを格納するチャネルストリーム４３０のストリームレットのシーケンスの最後のストリームレット（この時点で）である。ストリームレット４１０１は、ストリームレット４１０１に以前に格納されたがまだ開いているチャネルｆｏｏのメッセージ（４２１）を有し、すなわち、ストリームレット４１０１は、メッセージを格納する空間をまだ有しており、かつストリームレットのＴＴＬが満了していない。
【００４６】
ＭＸノード２０２は、各メッセージがＭＸノード２０２によって受信されたそれぞれの時間に基づいてチャネルｆｏｏのためのメッセージを例えばＭ１１、Ｍ１３、Ｍ１４、Ｍ１２（４２２）のように並べ、受信したメッセージを並べられた通りにストリームレット４１０１に格納することができる。すなわち、ＭＸノード２０２は、最初にＭ１１、次に、Ｍ１３、Ｍ１４、及びＭ１２を受信する。同様に、ＭＸノード２０６は、各メッセージがＭＸノード２０６によって受信されたそれぞれの時間に基づいてチャネルｆｏｏのためのメッセージを例えばＭ７８、Ｍ７９（４２３）のように並べ、受信したメッセージを並べられた通りにストリームレット４１０１に格納することができる。チャネルのためのメッセージの他の配置又は順序付けも可能である。
【００４７】
ＭＸノード２０２（又はＭＸノード２０６）は、例えば図３Ａに関して上述したストリームレットにデータを書き込む方法を使用して受信メッセージを格納することができる。様々な実施では、ＭＸノード２０２（又はＭＸノード２０６）は、チャネルｆｏｏのための受信メッセージをバッファに（例えばローカルデータバッファに）入れて、バッファメッセージが事前に決められた数又はサイズ（例えば、１００メッセージ）に達した時に、又は事前に決められた時間（例えば、５０ミリ秒）が経過した時に、チャネルｆｏｏのストリームレット（例えば、ストリームレット４１０１）に受信メッセージを格納することができる。すなわち、ＭＸノード２０２は、ある時間に又は５０ミリ秒毎にストリームレットに１００メッセージを格納することができる。ネーグルのアルゴリズムのような他の肯定応答スケジューリングアルゴリズムを使用することもできる。
【００４８】
様々な実施では、Ｑノード２１２（例えばハンドラ処理）は、チャネルｆｏｏのメッセージをＭＸノード２０２及びＭＸノード２０６によって並べられた順序でストリームレット４１０１に格納する。Ｑノード２１２は、Ｑノード２１２がメッセージを受信する順序でチャネルｆｏｏのメッセージをストリームレット４１０１に格納する。例えば、Ｑノード２１２は、最初に（ＭＸノード２０６から）メッセージＭ７８、次にメッセージＭ１１及びＭ１３（ＭＸノード２０２から）、Ｍ７９（ＭＸノード２０６から）、及びＭ１４及びＭ１２（ＭＸノード２０２から）を受信すると仮定されたい。Ｑノード２１２は、ストリームレット４１０１に以前に格納されたメッセージ４２１の直後に、受信した順序、例えば、Ｍ７８、Ｍ１１、Ｍ１３、Ｍ７９、Ｍ１４、及びＭ１２でストリームレット４１０１にメッセージを格納する。従って、複数の発行者（例えば、４０２、４０４）からチャネルｆｏｏに発行されたメッセージは、特定の順序で並べてチャネルｆｏｏのストリームレット４１０１に格納することができる。チャネルｆｏｏを購読する異なる購読者は、図４Ｂに関して詳しく説明するように同じ特定の順序でチャネルｆｏｏのメッセージを受信することになる。
【００４９】
図４Ａの例では、メッセージＭ１２がストリームレット４１０１に格納された後の時間インスタンスで、ＭＸノード２０４は、チャネルマネージャ２１４からチャネルｆｏｏに書き込む許可を要求する。チャネルマネージャ２１４は、ストリームレット４１０１が書込にまだ開いている場合にストリームレット４１０１へのメッセージの書込許可をＭＸノード２０４に提供する。ＭＸノード２０４は、各メッセージがＭＸノード２０４によって受信されたそれぞれの時間に基づいてチャネルｆｏｏのためのメッセージを例えばＭ２６、Ｍ２７、Ｍ３１、Ｍ２９、Ｍ３０，Ｍ２８（４２４）のように並べ、チャネルｆｏｏのために並べられた通りにメッセージを格納する。
【００５０】
例証として、メッセージＭ２６がストリームレット４１０１の最後の利用可能な位置に格納されると仮定されたい。ストリームレット４１０１が現在満杯であるので、Ｑノード２１２は、ＭＸノード２０４にＮＡＫメッセージ、次にＥＯＦメッセージを送信し、図３Ａに関して上述したように書込許可のためのＭＸノード２０４とのアソシエーションを閉じる。次に、ＭＸノード２０４は、チャネルｆｏｏのための追加のメッセージ（例えば、Ｍ２７、Ｍ３１など）のためのチャネルマネージャ２１４からの別の書込許可を要求する。
【００５１】
チャネルマネージャ２１４は、メッセージングシステム１００の利用可能なＱノードのそれぞれの過負荷（例えばどのくらいのストリームレットが各Ｑノード上に存在しているか）をモニタすることができる。チャネルマネージャ２１４は、いずれの所与のＱノードに対しても過負荷（例えば、ストリームレットが多すぎる又は読取又は書込許可が多すぎる）を回避することができるようにＭＸノード２０４からの書込要求にストリームレットを割り当てることができる。例えば、チャネルマネージャ２１４は、メッセージングシステム１００の最小負荷Ｑノードを識別してＭＸノード２０４からの書込要求に対して最小負荷Ｑノードに新しいストリームレットを割り当てることができる。図４Ａの例では、チャネルマネージャ２１４は、Ｑノード２０８上の新しいストリームレット４１０２を割り当てて、ストリームレット４１０２へのチャネルｆｏｏの書込メッセージに対する書込許可をＭＸノード２０４に提供する。図４Ａに示すように、Ｑノードは、ＭＸノード２０４によって並べられた順序Ｍ２７、Ｍ３１、Ｍ２９，Ｍ３０、及びＭ２８で（この時点でストリームレット４１０２に対して他の同時書込許可がないと仮定して）ＭＸノード２０４からのメッセージをストリームレット４１０２に格納する。
【００５２】
チャネルマネージャ２１４が、ＭＸノード（例えば、ＭＸノード２０４）からのチャネル（例えば、ｆｏｏ）への書込許可の要求に対して新しいストリームレット（例えば、ストリームレット４１０２）を割り当てる時に、チャネルマネージャ２１４は、チャネルのストリームに既に存在する他のストリームレットのＴＴＬの後に満了することになるＴＴＬをストリームレットに割り当てる。例えば、チャネルマネージャ２１４は、ストリームレットを割り当てる時にチャネルｆｏｏのチャネルストリームの各ストリームレットに３分のＴＴＬを割り当てることができる。すなわち、各ストリームレットは、チャネルマネージャ２１４によって割り当てられた（生成された）後に３分で満了することになる。前のストリームレットが閉じた（例えば、完全に満杯になった又は満了した）後に新しいストリームレットが割り当てられるので、チャネルｆｏｏのチャネルストリームは、従って、前のストリームレットが満了した後に各々が順次満了するストリームレットを含む。例えば、図４Ａのチャネルｆｏｏの例示的チャネルストリーム４３０に示されるように、ストリームレット４０９８及び４０９８の前のストリームレットは満了している（点線の網掛けボックスによって表示）。これらの満了したストリームレットに格納されたメッセージは、チャネルｆｏｏの購読者が読み取ることはすることができない。ストリームレット４０９９、４１００、４１０１、及び４１０２は、アクティブのままである（満了していない）。ストリームレット４０９９、４１００、及び４１０１は、書込に対して閉じているが、読み取ることはすることができる。ストリームレット４１０２は、メッセージＭ２８がストリームレット４１０２に格納された時点で読み取り、かつ書き込むことができる。後の時間にストリームレット４０９９が満了し、次にストリームレット４１００、４１０１が満了することになる等々である。
【００５３】
図４Ｂは、メッセージングシステム内のチャネルを購読する例示的方法のデータ流れ図である。図４Ｂでは、購読者４８０は、メッセージングシステム１００のＭＸノード４６１との接続４６２を確立する。購読者４８２は、ＭＸノード４６１との接続４６３を確立する。購読者４８５は、メッセージングシステム１００のＭＸノード４６８との接続４６７を確立する。ここで、ＭＸノード４６１及び４６８は、内部ネットワーク２１８を通じてメッセージングシステム１００内のチャネルマネージャ２１４及び１又は２以上のＱノードとそれぞれ通信することができる（４６４）。
【００５４】
購読者（例えば、購読者４８０）は、接続を確立する（例えば、４６２）及びチャネルｆｏｏのメッセージを購読する要求をＭＸノード（例えば、ＭＸノード４６１）に送信することによってメッセージングシステム１００のチャネルｆｏｏを購読することができる。要求（例えば、ＪＳＯＮ鍵／値ペアにおける）は、チャネル名「ｆｏｏ」を含むことができる。購読要求を受信した時に、ＭＸノード４６１は、チャネルマネージャ２１４にチャネルｆｏｏのチャネルストリーム内のストリームレットの読取許可に対する要求を送信することができる。
【００５５】
例証として、現時点でチャネルｆｏｏのチャネルストリーム４３１が図４Ｂに示すようにアクティブストリームレット４１０２、４１０３、及び４１０４を含むと仮定されたい。ストリームレット４１０２及び４１０３は各々が満杯である。ストリームレット４１０４は、位置４７７３１に格納された最後のメッセージ（現時点で）を含むチャネルｆｏｏのメッセージを格納する。ストリームレット４１０１及び４１０１の以前のストリームレットは、このそれぞれのＴＴＬが満了しているので無効である。ストリームレット４１０１のＴＴＬが満了したためにストリームレット４１０１はもう有効でないので、図４Ａに関して上述したストリームレット４１０１に格納されたメッセージＭ７８、Ｍ１１、Ｍ１３、Ｍ７９、Ｍ１４、Ｍ１２、及びＭ２６はチャネルｆｏｏの購読者に利用することができない点に注意されたい。上述のように、チャネルｆｏｏのチャネルストリームの各ストリームレットは、３分のＴＴＬを有し、従って、現在の時間から３分以内にチャネルｆｏｏに発行された（すなわち、チャネルのストリームレットに格納された）メッセージ（チャネルｆｏｏのストリームレットに格納されたもの）だけがチャネルｆｏｏの購読者に利用可能になる。
【００５６】
例えば、購読者４８０がチャネルｆｏｏの新しい購読者である時に、ＭＸノード４６１は、チャネルｆｏｏの全ての利用可能なメッセージの読取許可を要求することができる。要求に基づいて、チャネルマネージャ２１４は、チャネルｆｏｏのアクティブストリームレットの最も早期のストリームレット（すなわち、アクティブストリームレットのシーケンスの第１の）であるストリームレット４１０２（Ｑノード２０８上）の読取許可をＭＸノード４６１に提供する。ＭＸノード４６１は、例えば図３Ｂに関して上述したストリームレットからデータを読み取る方法を使用して、Ｑノード２０８からのストリームレット４１０２内のメッセージを取り出すことができる。ストリームレット４１０２から取り出されたメッセージは、ストリームレット４１０２に格納されたのと同じ順序を維持する点に注意されたい。しかし、ストリームレット内のメッセージの他の配置又は順序付けも可能である。様々な実施では、ストリームレット４１０２に格納されたメッセージをＭＸノード４６１に提供する時に、Ｑノード２０８は、メッセージをバッファに（例えば、ローカルデータバッファに）入れて、バッファメッセージが事前に決められた数又はサイズ（例えば、２００メッセージ）に達した又は事前に決められた時間（例えば、５０ミリ秒）が経過した時にＭＸノード４６１にメッセージを送信することができる。すなわち、Ｑノード２０８は、ある時間に又は５０ミリ秒毎に２００メッセージでチャネルｆｏｏのメッセージ（ストリームレット４１０２からの）をＭＸノード４６１に送信することができる。ネーグルのアルゴリズムのような他の肯定応答スケジューリングアルゴリズムを使用することもできる。
【００５７】
ストリームレット４１０２の最後のメッセージを受信した後で、ＭＸノード４６１は、肯定応答をＱノード２０８に送信し、チャネルマネージャ２１４にチャネルｆｏｏのチャネルストリームの次のストリームレットに対する別の要求（例えば、読取許可の要求）を送信することができる。要求に基づいて、チャネルマネージャ２１４は、チャネルｆｏｏのアクティブストリームレットのシーケンスでストリームレット４１０２に論理的に続くストリームレット４１０３（Ｑノード４７２上）の読取許可をＭＸノード４６１に提供する。ＭＸノード４６１は、例えば、ストリームレット４１０３に格納された最後のメッセージを取り出すまで図３Ｂに関して上述したストリームレットからデータを読み取る方法を使用して、ストリームレット４１０３に格納されたメッセージを取り出すことができる。ＭＸノード４６１は、次のストリームレット４１０４（Ｑノード４７４上）のメッセージに対する読取許可の別の要求をチャネルマネージャ２１４に送信することができる。読取許可を受信した後で、ＭＸノード４６１は、位置４７７３１の最後のメッセージまでストリームレット４１０４に格納されたチャネルｆｏｏのメッセージを取り出す。同様に、ＭＸノード４６８は、ストリームレット４１０２、４１０３、及び４１０４からメッセージを取り出して（図４Ｂに点線の矢印で図示）、メッセージを購読者４８５に提供することができる。
【００５８】
ＭＸノード４６１は、Ｑノード２０８、４７２、又は４７４からメッセージを受信すると共に購読者４８０に（接続４６２を通じて）チャネルｆｏｏの取り出されたメッセージを送信することができる。様々な実施では、ＭＸノード４６１は、ローカルバッファに取り出されたメッセージを格納することができる。従って、取り出されたメッセージは、他の購読者がチャネルｆｏｏを購読してチャネルのメッセージを要求した時に別の購読者（例えば、購読者４８２）に提供することができる。ＭＸノード４６１は、事前に決められた期間を超えた発行の時間を各々が有するローカルバッファに格納されたメッセージを取り除くことができる。例えば、ＭＸノード４６１は、３分を超える発行のそれぞれの時間を有するメッセージ（ローカルバッファに格納された）を取り除くことができる。一部の実施では、ＭＸノード４６１のローカルバッファにメッセージを維持する事前に決められた期間は、所与の時点でチャネルのストリームから取り出されたメッセージが既に満了したそれぞれの有効期間を有するストリームレットに含まれないので、チャネルｆｏｏのチャネルストリーム内のストリームレットのＴＴＬ持続時間と同じか又は類似とすることができる。
【００５９】
チャネルストリーム４３１から取り出されて購読者４８０に（ＭＸノード４６１によって）送信されたメッセージは、メッセージがチャネルストリームに格納されたのと同じ順序で並べられるが、メッセージの他の配置又は順序付けも可能である。例えば、チャネルｆｏｏに発行されたメッセージは、特定の順序（例えば、Ｍ２７、Ｍ３１、Ｍ２９、Ｍ３０など）で並べられてストリームレット４１０２に格納され、続いてストリームレット４１０３及びストリームレット４１０４に格納される。ＭＸノードは、チャネルストリーム４３１からメッセージを取り出して、メッセージがチャネルストリームに格納されたのと同じ順序Ｍ２７、Ｍ３１、Ｍ２９、Ｍ３０などで取り出されたメッセージを購読者４８０に提供し、次にストリームレット４１０３の順序付けられたメッセージ、及び次にストリームレット４１０４の順序付けられたメッセージが続く。
【００６０】
チャネルストリーム４３１の全ての利用可能なメッセージを取り出す代わりに、ＭＸノード４６１は、特定の位置、例えば位置４７２０２のメッセージから開始するチャネルストリーム４３１に格納されたメッセージに対する読取許可を要求することができる。例えば、位置４７２０２は、購読者４８０がチャネルｆｏｏを（例えば、メッセージングシステム１００のＭＸノード４６１又は別のＭＸノードへの接続を通して）最後に購読した時の早期のインスタンス（例えば、現在の時間の１０秒前）に対応することができる。ＭＸノード４６１は、位置４７２０２で開始するメッセージに対する読取許可の要求をチャネルマネージャ２１４に送信することができる。要求に基づいて、チャネルマネージャ２１４は、ストリームレット４１０４（Ｑノード４７４上）の読取許可及びチャネルストリーム位置４７２０２に対応するストリームレット４１０４上の位置をＭＸノード４６１に提供する。ＭＸノード４６１は、提供された位置から開始するストリームレット４１０４のメッセージを取り出して、取り出されたメッセージを購読者４８０に送信することができる。
【００６１】
図４Ａ及び４Ｂに関して上述したように、チャネルｆｏｏに発行されたメッセージは、特定の順序で並べられてチャネルのストリームレットに格納される。チャネルマネージャ２１４は、ストリームレットのそれぞれの有効期間を通して生成される場合のストリームレットの順序付けられたシーケンスを維持する。ＭＸノード（例えば、ＭＸノード４６１、又はＭＸノード４６８）によってストリームレットから取り出されて購読者に提供されたメッセージは、一部の実施では、メッセージがストリームレットの順序付けられたシーケンスで格納されるのと同じ順序にすることができる。従って、異なる購読者（例えば、購読者４８０、購読者４８２、又は購読者４８５）に送信されるメッセージは、購読者が接続されるＭＸノードに関わらず（メッセージがストリームレットに格納されるのと）同じ順序にすることができる。
【００６２】
様々な実施では、ストリームレットは、メッセージのブロックのセットにメッセージを格納する。各ブロックは、いくつかのメッセージを格納する。例えば、ブロックは、２００キロバイトのメッセージを格納することができる。各ブロックは、ブロックを保持するストリームレットのＴＴＬよりも短い可能性がある固有のＴＴＬを有する。ブロックのＴＴＬが満了した状態で、図４Ｃに関して以下に詳しく説明するように、ブロックを保持するストリームレットからこのブロックを廃棄することができる。
【００６３】
図４Ｃは、メッセージングシステム内のチャネルのメッセージを格納するための例示的データ構造である。図４Ａ及び４Ｂに関してチャネルｆｏｏで説明したように、現時点で、チャネルｆｏｏのチャネルストリーム４３２が図４Ｃに示すようにアクティブストリームレット４１０４及び４１０５を含むと仮定されたい。ストリームレット４１０３及び４１０３の以前のストリームレットは、このそれぞれのＴＴＬが満了しているので無効である。ストリームレット４１０４はその容量の点で既に満杯であり（例えば、対応する書込許可によって決定されるように）、追加のメッセージ書込に対しては閉じられている。ストリームレット４１０４は、メッセージを読み取ることができる。ストリームレット４１０５は開かれており、メッセージ書込及び読取に利用可能である。
【００６４】
例証として、ストリームレット４１０４（例えば、図４Ｂに示したＱノード４７４で実行されるコンピュータ処理）は、現在２ブロックのメッセージを保持する。ブロック４９４は、チャネル位置４７３０１から４７８５０のメッセージを保持する。ブロック４９５は、チャネル４７８５１から４８０００のメッセージを保持する。ストリームレット４１０５（例えば、メッセージングシステム１００の別のＱノードで実行されるコンピュータ処理）は、現在２ブロックのメッセージを保持する。ブロック４９６は、チャネル位置４８００１から４８２００のメッセージを保持する。ブロック４９７は、チャネル位置４８２０１から開始するメッセージを保持し、チャネルｆｏｏの追加のメッセージを依然として受け入れる。
【００６５】
ストリームレット４１０４が（例えば書込許可によって）生成された時に、第１のブロック（サブバッファ）４９２は、メッセージ、例えば、チャネル位置４７０１０から４７１００のメッセージを格納するために生成される。その後に、ブロック４９２がその容量に達した後で、別のブロック４９３がメッセージ、例えば、チャネル位置４７１１１から４７３００のメッセージを格納するために生成される。ブロック４９４及び４９５は、追加のメッセージを格納するために続けて生成される。その後に、ストリームレット４１０４は、追加のメッセージ書込に対して閉じられ、チャネルｆｏｏの追加のメッセージを格納するための追加のブロックを備えたストリームレット４１０５が生成される。
【００６６】
この例では、ブロック４９２及び４９３のそれぞれのＴＴＬは満了している。これらの２つのブロックに格納されたメッセージ（チャネル位置４７０１０から４７３００）は、チャネルｆｏｏの購読者によって読み取ることはすることができない。ストリームレット４１０４は、例えばブロック４９２及び４９３に対するメモリ空間の割り当てを解除することによって、これらの２つの満了したブロックを廃棄することができる。ブロック４９４又は４９５は満了になり、ストリームレット４１０４自体が無効になる前にストリームレット４１０４によって廃棄することができる。これに代えて、ストリームレット４１０４自体は、ブロック４９４又は４９５が満了する前に無効になることができる。従って、ストリームレットは、例えばストリームレット及びブロックのそれぞれのＴＴＬに応じて、１又は２以上のメッセージのブロックを保持することができるか又はメッセージのブロックを包含しなくてもよい。
【００６７】
ストリームレット、又はメッセージングシステム１００のＱノードで実行されるコンピュータ処理は、Ｑノードからメモリ空間の一定のサイズを割り当てることによってチャネルのメッセージを格納するためのブロックを生成することができる。ストリームレットは、ある時間の１つのメッセージをメッセージングシステム１００のＭＸノードから受信し、受信したメッセージをブロックに格納することができる。これに代えて、ＭＸノードは、メッセージのグループをアセンブリし（すなわちバッファに入れ）、メッセージのグループをＱノードに送信することができる。ストリームレットは、メモリ空間のブロック（Ｑノードからの）を割り当てて、メッセージのグループをブロックに格納することができる。ＭＸノードは、例えば各メッセージから共通ヘッダを取り除くこと又は他の適切な圧縮技術を実行することによって、メッセージのグループに圧縮を行うこともできる。
【００６８】
上述のように、ＭＸノードは、Ｑノードからメッセージを取り出し、取り出したメッセージをローカルバッファに格納し（キャッシュに入れ）、ローカルバッファから取り出したメッセージを複数の購読者に提供することができる。従って、ＭＸノードは、メッセージが（ストリームレットに）格納されるＱノードのネットワークボトルネックを生じることなく、多数（例えば、数千又はそれ以上）の購読者（例えば特定のチャネルの）をサポートすることができる。メッセージングシステム１００は、各々がメッセージをキャッシュに入れて追加の購読者をサポートすることができる追加のＭＸノードを加えることによって購読者の数を拡張することができる。
【００６９】
ＭＸノードがローカルにキャッシュに入れられたメッセージを複数の購読者に提供する時に、ＭＸノードで実行される送信側処理は、キャッシュに入れられたメッセージのコピーを各々が購読者の１つとの接続に対応する宛先処理（ＭＸノードで実行される）に送信することができる。しかし、多数の（例えば数千の）購読者により、キャッシュに入れられたメッセージ（例えば、異なる宛先処理に対する送信側処理によって生成された）のコピーは、ＭＸノードでのメモリ使用の高需要を起こすことがある。送信側処理がキャッシュに入れられたメッセージを順次異なる宛先処理に送信する場合、宛先処理間のブロッキング（同期のための）は、ＭＸノードでのコンピュータ資源輻輳を起こすことがある。
【００７０】
本明細書に説明する特定の実施は、Ｑノードから取り出されたメッセージをキャッシュに入れるために使用することができるＭＸノードの配信バッファ（すなわち、「高速バッファ」）を利用する。高速バッファは取り出されたメッセージを格納するためのデータブロックを含む。以下に説明するように、各データブロックは、高速バッファからデータを読み取ることに関連付けられる読取動作時間よりも長いそれぞれのＴＴＬを有する。これは、データがバッファから読み取られる及び／又は購読者に送信される場合のデータブロックの満了を回避することができる。ある一定の事例では、データブロックのＴＴＬは、対応するストリームレットのＴＴＬよりも長い。購読者の処理（ＭＸノードで実行される）は、ＭＸノードとの購読者の接続ステータスに応じて高速バッファのデータブロックのうちの１又は２以上に格納されたメッセージを読み取ることができる。複数の購読者のための処理は、各メッセージの複数のコピーを作成することなく単一の共有データ構造（高速バッファ）からメッセージを読み取ることができる。好ましい実施では、複数のＭＸノードは、互いにブロッキング又は干渉することなく、かつ高速バッファ内のデータを修正することなく、高速バッファから（例えば同じデータを）同時に読み取ることができる。例えば、ＭＸノード上の第１の読取処理は、同じＭＸノード上にあるがＭＸノードの異なるプロセッサコアに存在する可能性がある第２の読取処理をブロッキングする（例えば、第２の読取処理の保留を起こす）ことなく、高速バッファからメッセージを読み取ることができる。
【００７１】
図５は、ＭＸノード５０２がＱノード５０４からメッセージを取り出し、このメッセージを購読者のクライアントデバイス５０６に提供する例示的システム５００である。ＭＸノード５０２は、ＭＸ購読処理５０８及び高速バッファ５１０を含むことができる。ＭＸ購読処理５０８は、接続５１２を使用してＱノード５０４に格納されたメッセージ（例えば、ストリームレット内の）を読み取ることができ、接続５１４を使用してストレージのために高速バッファ５１０にメッセージを提供することができる。高速バッファ５１０は、各ブロックがＴＴＬを有する１又は２以上のブロックにメッセージを格納することができる。好ましい実施では、高速バッファ５１０は、データブロックを保持して定期的に（例えば、古いデータがＭＸ処理によって読み取られなくなるか又は購読者によって要求されなくなる時、又は指定された又は事前に決められた期間後に）古いデータを満了させる共有ロック‐フリー構造とすることができる。
【００７２】
ある一定の例では、ＭＸノード５０２は、クライアントデバイス５０６などの１又は２以上のクライアントデバイスとの通信を確立するためのＭＸ接続処理５１６及びＭＸ送信処理５１８を含むこともできる。図示した例では、クライアントデバイス５０６が接続５２０を使用してＭＸ接続処理５１６に接続し、１又は２以上のチャネルのメッセージをＭＸノード５０２から要求する。クライアントデバイス５０６は、例えば、位置４７２０２などの特定の位置で開始するチャネルｆｏｏのメッセージを要求することができる。この特定の要求の例示的ＪＳＯＮバージョンは以下の通りである。
2019535072.tif 000004
【００７３】
要求に応答して、ＭＸ接続処理５１６は、命令５２４をＭＸ送信処理５１８に送信して高速バッファ５１０内に格納された（例えば、チャネルｆｏｏの位置４７２０２で開始する）メッセージデータを取り出す。ＭＸ送信処理５１８は、接続５２６を使用して高速バッファ５１０からメッセージデータを取り出し、接続５２２を通してメッセージをクライアントデバイス５０６に送信する。
【００７４】
ＭＸ購読処理５０８及び高速バッファ５１０は、１つのチャネル毎に初期化される及び／又は単一のチャネルのメッセージの取り出し及び格納に向けられることが好ましい。追加のＭＸ購読処理及び／又は高速バッファをＭＸノード５０２に含めることができ、追加のチャネルのメッセージを取り出して格納することができる。代替実施では、ＭＸ購読処理５０８及び高速バッファ５１０は、複数のチャネルのメッセージを取り出す及び格納するように構成することができる。例えば、ＭＸノード５０２は、複数のチャネルのメッセージを取り出す及び格納するための１つのＭＸ購読処理５０８及び１つの高速バッファ５１０を含むことができる。
【００７５】
同様に、ＭＸ接続処理５１６及びＭＸ送信処理５１８は、１つのクライアント接続毎に初期化される及び／又は単一のクライアントデバイス（例えば、クライアントデバイス５０６）との通信を確立することに向けられることが好ましい。追加のＭＸ接続処理及びＭＸ送信処理は、ＭＸノード５０２上に含めることができ、追加のクライアントデバイスとの通信を確立して１又は２以上の高速バッファからメッセージを取り出して送信することができる。代替実施では、ＭＸ接続処理５１６及びＭＸ送信処理５１８は、複数のクライアントデバイスに接続されてそれに供するように構成することができる。例えば、ＭＸノード５０２は、クライアントデバイス（クライアントデバイス５０６を含む）から要求を受信してメッセージをクライアントデバイス（例えば、１又は２以上のチャネル）にそれぞれ送信するための１つのＭＸ接続処理５１６及び１つのＭＸ送信処理５１８を含むことができる。
【００７６】
一般的に、Ｑノード５０４からＭＸ購読処理５０８に配信されたデータのブロックは、ブロックが高速バッファ５１０によって受信されたのと同じ順序で高速バッファ５１０に格納することができるが、データブロックの他の配列又は順序付けも可能である。ブロックにはオフセット及びタイムスタンプが与えられることが好ましい。これは、ブロックが位置付けられて高速バッファ５１０から取り出されることを可能にし、及び／又はＭＸ購読処理５０８がそのＴＴＬよりも古い及び／又は他に読み取ることができない何れのブロックも識別することを可能にする。オフセットは、一般的に、高速バッファ５１０内の単一の待ち行列又は連結リスト（例えば、前方リスト）の後方部分に１つずつ追加されるブロックを有する昇順で割り当てられる。
【００７７】
ある一定の例では、高速バッファ５１０のブロックにアクセスする又はレビューする時に、ＭＸ購読処理５０８は、例えば、アクティブ、アクセス不能、又は満了として各ブロックを分類することができるが、他の指定又は分類も可能である。一般的に、アクティブブロックは、ＴＴＬが満了していない「若い」ブロックである。アクティブブロックは、高速バッファ５１０の可視又は他にアクセス可能区域に存在し、新しい読取要求によってアクセスすることができる。アクセス不能ブロックは、ＴＴＬが満了しそうな「中年」ブロックである。アクセス不能ブロックは、高速バッファ５１０の不可視又は他に制限された又は非アクセス区域に存在し、確立された接続（例えば、以前に許可された読取要求）を有する読取処理によってのみアクセスすることができる。アクセス不能ブロックのＴＴＬが読取処理中に満了した場合、ブロックは満了になるが、読取処理にはブロックからのデータの読取を終了するための追加の時間が与えられる。満了したブロックは高速バッファ５１０の不可視区域に存在し、高速バッファ５１０から定期的に削除される。
【００７８】
例えば、１又は２以上のブロックが満了したことをＭＸ購読処理５０８が決定した時に、ＭＸ購読処理５０８は、高速バッファ５１０の待ち行列を縮小することができる。例えば、ＭＸ購読処理５０８は、高速バッファ５１０のヘッド、テール、又は他の適切な部分を縮小することができ、それによって満了したブロックが待ち行列から取り除かれてアクセスすることができなくなる。しかし、一部の実施では、満了したブロックは、ＴＴＬ内でブロックからメッセージを読み取ることができないある一定の処理に対処するために追加の時間に読み取ることができるように留まることができる。例えば、ＭＸノード５０２との現在の又は既存の接続を有する（例えば、既存の読取要求）クライアントデバイス（及び関連のＭＸ送信処理）は、アクセス不能及び／又は満了したブロックからデータを読み取ることができる。他方、ＭＸノード５０２との新しい接続（例えば、既存の読取要求のない）を有するクライアントデバイス（及び関連のＭＸ送信処理）は、アクセス不能及び／又は満了したブロックからデータを読み取ることができない。新しい接続を有するこのようなクライアントデバイスは、待ち行列の可視又はアクセス可能な部分に現在あるアクティブブロックだけを読み取ることに制限される。この手法は、既存の接続又は既存の読取要求に対するプリファレンスを与え、対応するクライアントデバイスが受信されたメッセージデータの何れのギャップも回避することを可能にする。このようなギャップは、例えば低接続速度及び／又は接続における時間的経過に起因して起こる可能性がある。他方、新しい接続が、何れのメッセージデータも読み取っておらずかつ満了していないブロックを読み取ることによって開始することができるので、新しい接続は、一般的には、何れかのギャップを埋めるために古いブロックにアクセスする必要はない。様々な例では、「既存の接続」は、ＭＸ送信処理が要求した接続及び高速バッファ５１０からの読取メッセージを指す。様々な例では、「新しい接続」は、ＭＸ送信処理が高速バッファ５１０から何れのメッセージも読み取っていない接続を指す。
【００７９】
有利なことに、ブロックを分類する及び満了したブロックを定期的に削除するこの手法は、メモリ使用における改善された制御を提供する。チャネルデータによって使用されるメモリの量は、需要に従って動的に割り当てる及び／又は経時的に変更することができる。例えば、チャネルのメッセージ活動が減少する場合に、満了ブロックが削除されて新しいブロックがあまり作成されないので、チャネルに使用されるメモリの量は自動的に減少することがある。既存の読取処理がメッセージデータを読み取る機会を有した後に及びブロックのメッセージデータがもう必要ない場合に満了したブロックを削除することができる。この手法は、１又は２以上の処理段階（例えば、暗号化、圧縮など）を追加する柔軟性を提供し、このような段階が解放されたメモリを処理しない又はアクセスしようとしないことを保証する。
【００８０】
好ましい実施では、ＭＸ購読処理５０８は、高速バッファ５１０の構造を修正する権利だけを有する処理とすることができる。例えば、ブロックを高速バッファ５１０に追加する、高速バッファ５１０からブロックを取り除く、及び／又は必要な場合に高速バッファ５１０のブロックを修正するようにＭＸ購読処理５０８を構成する及びそれを可能にすることができる。ＭＸ購読処理５０８は、高速バッファ５１０内の待ち行列又は連結リストのヘッド部分及びテール部分を識別するポインタを動かすこともできる。他の処理又はＭＸノード構成要素は、このような修正を実行することができないことが好ましい。ＭＸ購読処理５０８だけにこのような権利を与えることによって、修正動作での何れのロックの必要性もなくなる。
【００８１】
ある一定の例では、ＭＸ送信処理５１８は、読取動作毎の始めに高速バッファ５１０のフロント（すなわち、ヘッド）及びバック（すなわち、テール）を検査することができる。ＭＸ送信処理５１８はターゲットブロックの読取を要求しており、ターゲットブロックが高速バッファ５１０のアクセス可能又は可視領域に存在する時に（例えば、ターゲットブロックがアクティブブロックであるので）、ＭＸ送信処理５１８は、高速バッファ５１０からブロックを読み取り、ブロック内のメッセージデータをクライアントデバイス５０６に転送することができる。ＭＸ送信処理５１８が高速バッファ５１０のアクセス可能な領域の１よりも多いブロックからデータを読み取ることを要求している時は、ＭＸ送信処理５１８は、高速バッファ５１０（例えば、高速バッファ５１０の要求されたオフセット又は位置を有するブロックから開始する）からのデータの量（例えば、最大６４Ｋｂ）を読み取り、メッセージデータをクライアントデバイス５０６に転送することができる。ある一定の事例では、ターゲットデータブロックが高速バッファ５１０でアクセスすることができない（例えば、ターゲットブロックが満了したので）ことをＭＸ送信処理５１８が検知した時に、ＭＸ送信処理５１８は、エラーレポート及び／又は待機を伴う個別の論理を適用することができる。ＭＸ送信処理５１８によって使用される個別の論理は、高速バッファ５１０のアクセス可能な領域と比較してターゲットブロックが存在する場所に依存する場合がある。
【００８２】
例えば、一部の事例では、クライアント接続が遅すぎて高速移動チャネルデータに同期することができない時、クライアントはチャネルからの購読を止めて、チャネルのデータに「同期していない」ことをクライアントに通知するメッセージが送信される。これに代えて、クライアントに「同期していない」メッセージを送信するのではなく、クライアントが、利用可能な最も古いデータ（例えば、最も古いアクティブブロック）又は利用可能な最も新しいデータ（例えば、最も新しいアクティブブロック）に高速転送される。ある一定の事例では、本発明のシステム及び方法は、１又は２以上の主要なアクティブブロック（例えば、１又は２以上のフラグによって示される）を識別し、主要なアクティブブロックからのデータをクライアントに転送し、クライアントを更なる読取のための最も新しいアクティブブロックに高速転送することができる。クライアントは、エラーレポート及び／又は待機がどのように実行されるかを定義するある一定のプリファレンスを有することができる。例えば、クライアントは、その状態が完全にリロードされるようにするプリファレンスを有することができる（例えば、クライアントが接続を失い、再接続することができる時）。
【００８３】
様々な例では、ＭＸ送信処理５１８は、高速バッファ５１０内のアクセス可能ブロックを読み取ることができ、追加のブロックが高速バッファ５１０に追加されて読み取ることができる時に通知されるのを待つことができる。例えば、ＭＸ送信処理５１８が高速バッファ５１０のテールに達した時に、ＭＸ送信処理５１８は、通知子５２８をオンにする又は起動する及び／又は他の処理をもたらすことができる。通知子５２８は、高速バッファ５１０への新しいデータの到着時にＭＸ送信処理５１８を目覚めさせるように構成することができる。通知子５２８を起動するために、ＭＸ送信処理５１８は、接続５３２に沿ってその処理識別子（ＰＩＤ）又は他の適切な識別子を待機リスト５３０に送信することができる。ＭＸ送信処理５１８は、新しいデータに対して高速バッファ５１０の第２の検査を実行することができ、新しいデータが存在しない場合、ＭＸ送信処理５１８は眠る及び通知子５２８からのメッセージを待つことができる。待機リスト５３０にＰＩＤを提供した後に再度高速バッファ５１０を検査することで、ＭＸ送信処理５１８は、ＰＩＤが待機リスト５３０に追加される直前又はほぼ同時に到着した何れの新しいデータの存在も識別することを可能にする。一般的に、待機リスト５３０は、新しいデータが高速バッファ５１０に到着した時に通知されるのを待っている１又は２以上のＭＸ送信処理に対するＰＩＤのリストを含む。待機リスト５３０は接続５３４に沿ってＰＩＤを通知子５２８に提供することができ、新しいデータが高速バッファ５１０に到着して読み取ることができる時に通知子５２８は目覚める又は待機リスト５３０内のＭＸ送信処理に通知することができる。例えば、通知子５２８は、接続５３６に沿って通知を送信することによってＭＸ送信処理５１８を目覚めさせることができる。ＭＸ購読処理５０８及び高速バッファ５１０と同様に、待機リスト５３０及び通知子５２８は、単一のチャネルの動作を実行するように構成されることが好ましい。ＭＸノード５０２は、追加の待機リスト及び通知子を含み、追加のチャネルの動作を実行することができる。代替実施では、待機リスト５３０及び通知子５２８は、複数のチャネルの動作を実行するように構成することができる。例えば、ＭＸノード５０２は、新しいデータが複数のチャネルに対する高速バッファ５１０に到着した時にＭＸ送信処理のＰＩＤを受信する及び対応するＭＸ送信処理を目覚めさせるための１つの待機リスト５３０及び１つの通知子５２８それぞれを含むことができる。
【００８４】
好ましい例では、通知子５２８は、ＭＸ購読処理５０８と一緒に機能することができる及び／又は同期することができる。データの新しいブロックが高速バッファ５１０に追加された時に、通知子５２８は、通知されるのを待っている１又は２以上のＭＸ送信処理の待機リスト５３０からのＰＩＤのリストを受信することができる。通知子５２８は、通知を１又は２以上のＭＸ送信処理に配信する。通知は、高速バッファ５１０内の新しいブロックのオフセット又は位置を含むことが好ましい。通知を送信した後に、１又は２以上のＭＸ送信処理のＰＩＤは、待機リスト５３０から取り除くことができる。
【００８５】
ある一定の実施では、待ち時間を低く維持するために、通知子５２８は、ＭＸ購読処理５０８との同期の２レベルモデルを使用することができる。内側ループ５３８では、通知子５２８は、短い間隔で（例えば、１０ｍｓ毎に）ＭＸ購読処理５０８に接触して、何れかの新しいブロックが高速バッファ５１０に追加されたか否かを決定することができる。通知子５２８は、例えば、ＭＸ購読処理５０８の辞書又はログから読み取り、高速バッファ５１０に最も新しく追加されたブロックのオフセットを決定することができる。最も新しいブロックが閾値時間量以上（例えば、２０ｍｓよりも長く）変化しなかった場合、通知子５２８は、通知子５２８が眠る及び／又はＭＸ購読処理５０８からの通知を待つ外側ループ５４０に切り替えることができる。外側ループ５４０では、ＭＸ購読処理５０８は、通知子５２８の状態を検査し、通知子５２８が眠っているかつ新しいデータが高速バッファ５１０に送信された時に通知を送信することによって通知子５２８を目覚めさせることが好ましい。一般的に、通知子５２８の状態の検査は、通知を配信するよりも大幅に高速の動作であるので、この手法は、ＭＸ購読処理５０８が、Ｑノード上の新しいデータを頻繁に探しかつ何れのこのような新しいデータも高速バッファ５１０に追加することを可能にする。ＭＸ購読処理５０８が、新しいブロックが高速バッファ５１０に追加されたことを通知子５２８に通知した時に、通知子５２８は、内側ループ５３８に切り替えることができる。２ループ手法は、ＭＸノード５０２が資源を節約しかつより効率的に動作することを可能にする。メッセージデータが高速バッファに頻繁に追加される時だけ通知子５２８は新しいメッセージデータをアクティブに探す。そうでなければ、通知子５２８は眠ることができかつ新しいデータが到着した時にＭＸ購読処理５０８によって目覚める。２ループ手法の主な利点は、仕事がある時又は近い将来に作業が予想される時だけ資源が使用されることである。新しいチャネルデータがすぐ予期されない時、本発明のシステムは、内側ループ５３８から外側ループ５４０のプッシュ通知の使用に切り替える。２ループ手法は、待ち時間と中央処理ユニット（ＣＰＵ）オーバーヘッドの間の最適な均衡を達成する。外側ループ５４０は、本発明のシステムが、めったに更新されない数百万のチャネルを維持し、このようなチャネルのステータスを検査するのに単一のＣＰＵサイクルを浪費しないことを可能にする。同時に、内側ループ５３８は、本発明のシステムが頻繁に更新される他のチャネルを最小待ち時間で維持することを可能にする。
【００８６】
ある一定の実施では、通知子５２８が高速バッファ５１０に追加された新しいデータに気付いた時に、通知子５２８は、新しいデータを待っている何れのＭＸ送信処理にも通知を送信する。例えば、通知子５２８は、眠っておりかつ新しいデータを待っているＭＸ送信処理のＰＩＤを待機リスト５３０から取得し、通知をこれらのＭＸ送信処理に送信することができる。通知は、高速バッファ５１０内のデータの何れの新しいブロックのオフセット又は他の位置情報も含むことが好ましい。
【００８７】
様々な例では、本発明のシステム及び方法は、発行者を購読者に対して優先する（又は優先解除する）ことができる。例えば、高速バッファ５１０は、（ｉ）発行ループでは発行者からデータを受信する、及び（ｉｉ）購読ループでは購読者にデータを提供すると考えることができる。発行ループは、例えば、１又は２以上の発行者から新しいメッセージデータを取得する段階及び新しいメッセージデータを高速バッファ５１０に書き込む段階を含むことができる。購読ループは、例えば、高速バッファ５１０の新しいデータを検査する段階、及び新しいデータを１又は２以上の購読者に提供する段階（例えば、ＭＸ送信処理５１８を使用して）を含むことができる。好ましい例では、発行ループ及び購読ループは、緩く結合又は結合されず、それによって発行及び購読速度を独立して制御及び／又は優先させることができる。これは、望ましい場合に、購読速度とは異なる発行速度を可能にする及び／又は例えばシステム負荷に従って各速度を選択又は優先させることができる。発行活動を促進するために、例えば、発行ループの段階をより高速に実行することができ、それによってメッセージデータをより頻繁に高速バッファ５１０に書き込むことができる。これに代えて又はこれに加えて、購読活動を促進するために、購読ループの段階をより高速に実行することができ、それによってメッセージデータをより頻繁に高速バッファ５１０から読み取ることができる。一般的に、１つのループの段階がより高速に実行される時に、他のループの段階をより低速に実行することができ、例えば、一定値又は一定値近くに全体のシステム負荷を維持する及び／又は過度のシステム負荷を回避することができる。このような優先順位付けは、例えば、２つの作業者プール（例えば、発行者の１つのプール及び購読者の１つのプール）を作成して２つのプールのスレッドに異なる優先順位を設定するためにオペレーティングシステムカーネルスケジューラ優先順位付け機構を使用することによって達成することができる。発行者及び購読者を優先する又は優先解除する他の手法も考えられている。
【００８８】
図６は、時間の異なるインスタンスでの高速バッファ５１０の例示的データブロックを示す。第１の時間６５０で、高速バッファ５１０は、Ｑノード５０４内の１又は２以上のストリームレットから取り出されたデータブロック６０１、６０２、．．．、６０８のシーケンスを含む。データブロック内のメッセージデータのシーケンスは、Ｑノード５０４内の１又は２以上のストリームレットからのメッセージデータのシーケンスに一致又は同じであることが好ましい。
【００８９】
高速バッファ５１０内の各データブロック６０１、６０２、．．．、６０８にそれぞれのＴＴＬが与えられる。好ましい実施では、ブロックのＴＴＬは、ブロックからデータを読み取るのに十分な時間を読取処理に与える十分な持続時間である。一部の事例では、１又は２以上のブロックのＴＴＬは、Ｑノード５０４内の１又は２以上のストリームレットのＴＴＬよりも長い。一般的に、ブロックのＴＴＬは、高速バッファ５１０から読み取るのに適切な時間をＭＸ送信処理に与えるよう選択される。１つの例では、高速バッファ５１０内のブロックのＴＴＬは約３０秒又は約６０秒であり、Ｑノード５０４内のストリームレットのＴＴＬは約１０秒であるが、ブロック及びストリームレットの他のＴＴＬも可能である。従って、高速バッファ５１０（ＭＸノード５２０上）は、ストリームレットが特定のチャネルに保持することができる（例えば、過去１０秒のメッセージ）よりも多くのメッセージ（例えば、過去３０秒のメッセージ）を保持することができる。従って、ＭＸノード５０２は、購読者のクライアントデバイス（例えば、クライアントデバイス５０６）にメッセージの長い履歴を提供することができる。例えば、クライアントデバイスが遅い接続を有する及び／又は他にＱノード５０４のストリームレット内でアクセス可能でない又は格納されていない可能性があるメッセージを読み取るのに長い時間（例えば、１０秒を超える）がかかる時にこれは有利である。
【００９０】
様々な例では、高速バッファ５１０の内側の３つのグローバル常時アクセス可能ポインタ、すなわち、可視区域６６２の一番右側のブロック（すなわち、時間６５０のブロック６０８）を識別するテールポインタ６４２、可視区域６６２の一番左側のブロック（すなわち、時間６５０のブロック６０３）を識別するヘッドポインタ６４０、及び不可視区域６６０の一番左側のブロック（すなわち、時間６５０のブロック６０１）を識別する以前のヘッドポインタ６４４が存在することができる。ポインタによって参照される全ブロックは、全てのこのようなポインタにブロックの次のポインタを使用してリストの第１のブロック（例えば、時間６５０のブロック６０１）から反復することによって到達することができるように単一の連結リスト（例えば、転送リスト）を表す。ある一定の例では、可視区域６０２はアクティブであるブロックを含み、不可視区域６６０はアクセス不能及び／又は満了したブロックを含む。
【００９１】
高速バッファ５１０のデータブロックのシーケンスでは、高速バッファ５１０のヘッドポインタ６４０に近いデータブロックが、高速バッファ５１０のテールポインタ６４２に近いブロックよりも長く高速バッファ５１０に存在している。従って、ヘッドポインタ６４０に近いブロックは、一般的には、テールポインタ６４２近くのブロックがそのＴＴＬに到達して満了する前にそれぞれのＴＴＬに到達して満了することになる。例えば、第１の時間６５０に、ブロック６０３はブロック６０４の前に満了し、ブロック６０４はブロック６０５の前に満了することになる等々である。一般的に、高速バッファ５１０内のメッセージは、メッセージがＱノード５０４内で並べられたのと同じ順序で並べられるが、メッセージの他の配列又は順序付けも可能である。従って、メッセージは、メッセージがＱノード５０４内で満了するのと同じ順序で高速バッファ５１０内で満了することができる。
【００９２】
好ましい実施では、高速バッファ５１０のデータブロックのシーケンスは、連結リスト６２０のように並べることができる。連結リスト６２０では、各データブロックが、リストのシーケンスの次のデータブロックを示すポインタを有する。例えば、データブロック６０４はデータブロック６０５を指すポインタを有し、データブロック６０５はデータブロック６０６を指すポインタを有する。連結リスト６２０のテールエンドに位置付けられるデータブロック６０８は、連結リスト６２０のテールエンドにあることを示すポインタ（例えば、ＮＵＬ）を有することができる。１つの実施では、連結リスト６２０は、連結リスト６２０のヘッドのブロックを識別するヘッドポインタ６４０を含む。時間６５０で、例えば、連結リスト６２０は、データブロック６０３を識別するヘッドポインタ６４０を有することができ、データブロック６０３は自らのＴＴＬには達していないが連結リスト６２０内の次に満了するブロックになる。
【００９３】
ある一定の事例では、ＭＸ購読処理５０８がデータを高速バッファ５１０に追加した時に、ＭＸ購読処理５０８は２つの事柄を実行することができる。まず、ＭＸ購読処理５０８は、可視区域６６２内の最も古いブロックの年齢（すなわち、時間６５０のブロック６０３）を決定し、最も古いブロックを不可視区域６６０に移動すべきか否かを決定することができる。可視区域６６２の１又は２以上のブロックがアクセス不能（すなわち、そのＴＴＬがまもなく満了するので）又は満了した場合、ＭＸ購読処理５０８は、１又は２以上のブロックを不可視区域６６０に動かすか又は高速バッファ５１０からこの１又は２以上のブロックを削除することができる。１つの例では、アクセス不能のブロックが不可視区域６６０に移され、満了したブロックが削除される。高速バッファ５１０から１又は２以上のブロックを削除又は取り除く処理は、本明細書で「縮小」と呼ばれる。次に、ＭＸ購読処理５０８は、データの１又は２以上のブロックを高速バッファ５１０のテールに追加することができる。
【００９４】
好ましい例では、縮小及び追加処理は、ロック又は原子動作を使用することなく行われ、結果生じる変化は平穏な順序で作られることが好ましい。一般的に、ロック又は原子動作は、対称型マルチプロセッサ（すなわち、ＳＭＰ又はマルチコア）システムにおけるパフォーマンス低下の大きな原因である。あらゆるこのような動作は、コア又は不均等メモリアクセス（ＮＵＭＡ）ノードキャッシュが、変化が起こった直後に読み取ることができるキャッシュ値を持たないようにしなければならない。ロック及び／又は原子動作はモデムＣＰＵでは高価であり、数百のＣＰＵサイクルがかかる可能性がある。しかし、時間に頼ることによって、高速バッファ５１０は真に並行に実行し、それによってマルチ読取処理が同じメモリから同時に読み取ることができる。本明細書に説明する高速バッファ手法によって、境界ポインタ以外の何も縮小及び追加処理中の同期を必要としないことが好ましい。
【００９５】
図６の時間６５０及び６５２に関して、縮小は以下の技術によって行われることが好ましい。まず、不可視区域６６０内の満了ブロックが削除される。一部の例では、何らかの閾値時間（例えば、ＴＴＬ*１．５）よりも若い不可視区域６６０の満了した又はアクセス不能ブロックが、不可視区域６６０に保持される。以前のヘッドポインタ６４４は、ヘッドポインタ６４０の現在の位置に動かされ、ヘッドポインタ６４０は、アクティブであるブロック（例えば、時間６５２のブロック６０５）が見つけられるまでテールポインタ６４２に向けて移動される。ヘッドポインタ６４０は、この第１のアクティブブロックの前縁に配置される。アクティブブロックが見つけられない場合、ヘッドポインタ６４０及びテールポインタ６４２は、高速バッファ５１０がアクティブブロックを含まないことを示す同じ位置にマーク付けすることができる。
【００９６】
縮小処理は、図６の高速バッファ５１０の時間６５２、６５４、及び６５８に示されている。時間６５２で、ヘッドポインタ６４０及び以前のヘッドポインタ６４４は移動しており、それによって満了したブロック６０１及び６０２が取り除かれ、かつ不可視区域６６０には存在せず、不可視区域６６０は今のところブロック６０３及び６０４を含む。テールポインタ６４２は、ブロック６１１に新しいテールを定めるために移動している。同様に、時間６５４で、ヘッドポインタ６４０及び以前のヘッドポインタ６４４が移動しており、それによって満了したブロック６０３及び６０４は取り除かれ、不可視区域６６０に存在しない。この時間に、不可視区域６６０はブロックを含まず、ヘッドポインタ６４０及び以前のヘッドポインタ６４４は同じ位置（すなわち、時間６４４のブロック６０５）にマーク付けする。時間６５４の高速バッファ５１０内の各ブロックはアクティブであり、可視区域６６２に存在する。時間６５８で、ヘッドポインタ６４０及び以前のヘッドポインタ６４４が移動しており、それによって満了したブロック６０５及び６０６が取り除かれ、不可視区域６６０に存在しない。この時間の不可視区域６６０はブロック６０７及び７０８を含み、以前のヘッドポインタ６４４は、不可視区域６６０の一番左のブロック（すなわち、時間６５８でのブロック６０７）を識別するために移動している。時間６５８でのテールポインタ６４２は、ブロック６１５に新しいテールを定めるために移動しており、時間６５８でのヘッドポインタ６４０は、ブロック６０９に新しいヘッドを定めるために移動している。
【００９７】
一般的に、高速バッファ５１０から並行して読み取る多くのＭＸ送信処理があるので、ある一定のＭＸ送信処理が新しい不可視区域６６０内のブロックへのアクセスを持ち続けると同時に高速バッファ５１０の縮小及びポインタの再位置付けが起こることが好ましい。不可視区域６６０（例えば、時間６５２でのブロック６０３及び６０４を含む）は従って既存のＭＸ送信処理にアクセス可能のままにすることができ、即座に解放されない。これは、ブロックが可視区域６６２から不可視区域６６０に移動した後にＭＸ送信処理に対する既存の読取要求がアクセス不能及び／又は満了したブロックへのアクセスを続けることを可能にする。
【００９８】
一方、新しい及び／又は新しい読取要求を有するＭＸ送信処理には、高速バッファ５１０の可視区域６６２内のアクティブブロックへのアクセスのみが与えられる。好ましい例では、新しい読取要求を有する各ＭＸ送信処理（例えば、ＭＸ送信処理５１８）は、可視区域６６２の境界を検査し、処理要求が可視区域６６２の外側へ（例えば、前のヘッドとヘッドの間の何れかのブロックへ）のアクセスを要求する場合、あたかも要求に利用可能なデータがなかったかのように要求が失敗する。一般的に、新しい要求を有するＭＸ送信処理は、不可視区域６６０内の何れのアクセス不能又は満了ブロックへのアクセスも許可されない。好ましい例では、不可視区域６６０は、古い要求を有するＭＸ送信処理によってのみアクセスすることができ、ＭＸ送信処理は、可能な限り迅速に不可視区域６６０からの読取動作を終了することが好ましい。読取コードにロックがないことが好ましいので、一般的な読取時間は数マイクロ秒又はミリ秒かかる。
【００９９】
一般的に、ブロックは、約１ＴＴＬに対して不可視区域６６２に存在し、次にブロックがＴＴＬの何らかの割合（例えば、０．２５、０．５、又は０．７５）に存在する場合に不可視区域６６０に移動する。例えば、可視区域６６２内で約１ＴＴＬを消費した後に、ブロックは、追加のＴＴＬ*０．５に不可視区域６６０に存在することができる。不可視区域６６０のこの時間は、一般的には、通常のアクセス時間よりも何倍も長く、既存のＭＸ送信処理に要求されたメッセージデータを取得するための追加の時間を提供する。前述のように、ブロックがアクティブである時にブロックは可視区域６６２に存在し、ブロックがアクセス不能又は満了した時に不可視区域６６０にブロックが移される。
【０１００】
１つの例では、ブロックを高速バッファ５１０に追加するために、新しいブロックは、現在のテールポインタ６４２によって識別されたブロックに連結される別々の単一の連結リスト６２０に組み合わされる。テールポインタ６４２は、最後に追加されたブロックに移される。このブロック追加処理は、図６の時間６５２、６５６、及び６５８に示されている。これらの時間の各々で、新しいブロックが高速バッファ５１０に追加され、前の時間と比較され、テールポインタ６４２が最後に追加されたブロックを識別するために移されている。例えば、時間６５２で、新しいブロック６０９、６１０、及び６１１が追加され、テールポインタ６４２は、ブロック６１１が最後に追加されたブロックであることを示すブロック６１１の右手の端を指す。同様に、時間６５６で、新しいブロック６１２及び６１３が追加されており、テールポインタ６４２は、ブロック６１３が最後に追加されたブロックであることを示す。時間６５８で、ブロック６１４及び６１５が追加されており、テールポインタ６４２は、ブロック６１５が最後に追加されたブロックであることを示す。
【０１０１】
ある一定の事例では、データブロックは、ゼロメッセージを含有し、ギャップブロック又は左境界マーカとして作用することができる。ギャップブロックは、高速バッファ５１０内のブロック位置にギャップがある時（例えば、前のブロック位置に加えて前のブロック長が次のブロック位置に等しくない時）に使用することができる。このようなギャップは、例えば、１つのストリームレットから別のストリームレットに切り替える（例えば、１６ｍのサイズのストリームレットを１６ｍ境界によって位置合わせすることができる）又は紛失データによるものにすることができ、この場合、バッファ内のギャップに到達したクライアントは、紛失データに関して通知及び／又は紛失データを供給する必要がある。左境界マーカは、データが最初に書き込まれた又は書き込まれるはずの高速バッファ５１０内の最も左の利用可能な位置を示すゼロメッセージブロック又はマーカとすることができる。ゼロメッセージブロックは、データをもはや利用することができない時でも最も左のオフセットを含有することができる。このような事例では、左境界マーカは、ある一定の読取要求に関してかつ要求されたデータをクライアントデバイスに提供することができるか否かをＭＸノード５０２が決定することを助けることができる。あらゆる読取要求に左境界を定めることで、読取要求を将来満足することができる（例えば、データが受信された時）か否かを決定することができるようになる。
【０１０２】
一般的に、本明細書に説明する高速バッファは、分散ＰｕｂＳｕｂシステムの内側の内部構成要素である。高速バッファは、ＭＸノードに含めることができるか又はＭＸノードによって使用することができ、図５に示すように、高速バッファは、Ｑノードを含む他のシステム構成要素に含めることができるか又は他のシステム構成要素によって使用することができる。高速バッファ発行者は、一般的には、データを高速バッファに書き込む構成要素であり、高速バッファ購読者は、高速バッファからデータを読み取る構成要素である。図５に示すように、例えば、ＭＸノード５０２内の高速バッファ５１０では、ＭＸ購読処理５０８は高速バッファ発行者であり、ＭＸ送信処理５１８は、高速バッファ購読者である。類似の高速バッファ発行者及び高速バッファ購読者をＱノードに使用することができる。１つの例では、Ｑノード高速バッファ発行者は、Ｑストリームレット処理と呼ばれ、Ｑノード高速バッファ購読者は、Ｑ送信側処理と呼ばれる。Ｑノードに組み入れられるか又はＱノードによって使用される高速バッファは、ＭＸノード５０２に対して本明細書に説明する通知子及び／又は待機リスト手法を使用することができる。例えば、Ｑノード高速バッファから新しいメッセージデータを取り出すことを待っているＱ送信側処理は、データが利用することができない時に眠る及び／又は新しいメッセージデータが到着した時に目覚めることができる。
【０１０３】
図７は、メッセージを複数の購読者に提供する例示的方法７００の流れ図である。本発明の方法は、複数の発行者から複数のメッセージを受信する段階（段階７０２）を含む。メッセージの各々は、各チャネルが順序付けられた複数のメッセージを含む複数の個別のチャネルの１つに割り当てられる（段階７０４）。チャネルのうちの各々のメッセージは、順序に従って１又は２以上のそれぞれのストレージバッファに格納される（段階７０６）。各ストレージバッファは、第１の持続時間のそれぞれの有効期間を有する。特定のチャネルに対して、特定のチャネルのメッセージがそれぞれのストレージバッファ（例えば、満了していないかつ順序に従う有効期間を有する）から取り出される（段階７０８）。特定のチャネルの取り出されたメッセージは、順序に従って配信バッファに格納される（段階７１０）。配信バッファは、１又は２以上のデータブロックを含み、各データブロックは、第２の持続時間のそれぞれの有効期間（例えば、第１の持続時間よりも長い）を有する。配信バッファに格納されたメッセージは、特定のチャネルの複数の購読者に提供される（段階７１２）。
【０１０４】
説明したシステム及び方法の例は、１つのソース（例えば、ＥＲＬＡＮＧ処理）から複数の宛先（例えば、ＥＲＬＡＮＧ処理）にデータのストリームを送信することができる。データのストリームは、高速（例えば、メッセージ毎秒）でかつ低待ち時間（例えば、メッセージの９９％が５０ｍｓ未満の待ち時間で配信される）で配信される。
【０１０５】
第１の代替手法は、リスト又は他のデータ構造として表すことができるメッセージを送信側処理から宛先処理の全てに順次送信する段階を伴う。この処理は、一般的には遅く、例えばマルチコア処理のロッキングが他のコアで実行される処理にメッセージを送信する前後に輻輳ポイントを生じることがあるのでボトルネックになると評価される。この処理は、送信動作毎に送信されるデータのコピー（又はデータへの参照のコピー）を生じるのでメモリの多くを必要とする。コピーは、一般的には、宛先処理がデータを扱うまで宛先処理メッセージ待ち行列に存在する。複数の送信者を使用することでは問題は解決されない。
【０１０６】
第２の代替手法は、ストリームデータの中間単一コピーストレージとしてテーブルストレージ（例えば、ＥＲＬＡＮＧ  ＥＴＳ）を使用し、全ての宛先処理に様々な場所からのデータを同時に読み取らせることである。しかし、この手法は、テーブルストレージへのアクセスがボトルネックを示すので遅くなる。例えば、ＥＲＬＡＮＧ  ＥＴＳテーブルは、ロックのセットを利用して複数のアクセスからキーの範囲を保護し、これらのアクセスを順序付けする。ＥＴＳテーブルへの全ての呼出しがＥＴＳテーブル識別子によって行われる場合、ＥＴＳテーブル内のデータに対する場所を決定する段階も存在する。これらのロックの両方は高価であり、使用されるキー及びコア（最新のハードウエア上）の数に関係なく、テーブルに対する１０００万更新毎秒を超えるのを難しくする。ロックがなくなる場合、アクセス又は処理タスクの数を数桁低減することができる。
【０１０７】
これらの第１及び第２の代替手法と本明細書に説明する高速バッファ手法を比較するために一連の試験が行われた。この試験は、１つの発行者から複数の受信者に３２コアサーバ上で１００バイトメッセージを送信するために全ての３つの手法の使用に関わるものであった。受信者の数は、１００、１，０００、又は１０，０００から選択された。試験の結果は、各手法が送信することができた得られたメッセージ数毎秒を含む以下の表１に提示している。
【表１】
2019535072.tif 000005
表１．２つの代替手法との高速バッファ手法の比較
【０１０８】
様々な実施では、メッセージデータを単一処理から複数処理に送信するのではなく、本明細書に説明する高速バッファ手法は、受信者又は購読者自身に単一共有構造（すなわち、高速バッファ）からデータを取り込むようにタスクを課すものである。共有構造に関わるロッキング問題を回避するために、処理は、「ロック‐フリー」又は非ブロッキング手法を利用する。受信者は、ブロッキングなしに又はどこから読み取るか及びどのポイントまで読み取るかを考えることなしにデータの多くの部分を取り込むことができる。表１の結果が示すように、メッセージ転送の速度は、代替手法と比較する時にかなり改善されている。
【０１０９】
本明細書に説明する主題及び動作の実施形態は、本明細書及び本明細書の構造的均等物又はこれらの１又は２以上の組合せで開示する構造を含むデジタル電子回路、又はコンピュータソフトウエア、ファームウエア、又はハードウエアを用いて実施することができる。本明細書に説明する主題の実施形態は、１又は２以上のコンピュータプログラムとして、すなわち、デジタル処理装置によって実行するために又はその動作を制御するためにコンピュータストレージ媒体上に符号化されるコンピュータプログラム命令の１又は２以上のモジュールとして実施することができる。これに代えて又はこれに加えて、プログラム命令は、人工的に生成された伝播信号、例えば、データ処理装置によって実行するのに適する受信装置に送信する情報を符号化するために生成される機械発生式電気、光学、又は電磁信号で符号化することができる。コンピュータストレージ媒体は、コンピュータ可読ストレージデバイス、コンピュータ可読ストレージ基板、ランダム又はシリアルアクセスメモリアレイ又はデバイス、又はこれらの１又は２以上の組合せとすることができ、又はこれらに含めることができる。更に、コンピュータストレージ媒体は伝播信号ではないが、コンピュータストレージ媒体は、人工的発生式伝播信号で符号化されたコンピュータプログラム命令のソース又は宛先とすることができる。コンピュータストレージ媒体は、１又は２以上の個別の物理的構成要素又は媒体（例えば、複数のＣＤ、ディスク、又は他のストレージデバイス）とすることができ、又はこれらに含めることができる。
【０１１０】
本明細書に説明する動作は、１又は２以上のコンピュータ可読ストレージデバイスに格納されたか又は他のソースから受信したデータにデータ処理装置によって実行される動作として実施することができる。
【０１１１】
「データ処理装置」という語は、一例として、プログラマブルプロセッサ、コンピュータ、システムオンチップ、又はマルチプロセッサ、又は上述の組合せを含むデータを処理するための全ての種類の装置、デバイス、及び機械を網羅する。装置は、専用論理回路、例えば、ＦＰＧＡ（フィールドプログラマブルゲートアレイ）又はＡＳＩＣ（特定用途向け集積回路）を含むことができる。装置は、ハードウエアに加えて、問題のコンピュータプログラムのための実行環境を生成するコード、例えば、プロセッサファームウエア、プロトコルスタック、データベース管理システム、オペレーティングシステム、クロスプラットフォーム実行時間環境、仮想機械、又はこれらの１又は２以上の組合せを構成するコードを含むことができる。装置及び実行環境は、ウェブサービス、分散コンピュータ及びグリッドコンピュータインフラストラクチャーのような様々な異なるコンピュータモデルインフラストラクチャーを実現することができる。
【０１１２】
コンピュータプログラム（プログラム、ソフトウエア、ソフトウエアアプリケーション、スクリプト、又はコードとしても公知）は、コンパイル又は解釈言語、宣言、手順、又は機能言語を含むプログラミング言語のあらゆる形態で書くことができ、独立プログラムとして又はモジュール、構成要素、サブルーチン、オブジェクト、又はコンピュータ環境に使用するのに適する他のユニットとして含むいずれの形態でも配備することができる。コンピュータプログラムは、ファイルシステムのファイルに対応することができるが、対応する必要はない。プログラムは、他のプログラム又はデータ（例えば、マークアップ言語リソースに格納された１又は２以上のスクリプト）を保持するファイルの一部分に、問題のプログラム専用単一ファイルに、又は複数の調節されたファイル（例えば、１又は２以上のモジュール、サブプログラム、又はコードの一部分を格納するファイル）に格納することができる。コンピュータプログラムは、１つのコンピュータ又は１つのサイトに位置するか又は複数のサイトにわたって分散されて通信ネットワークによって相互接続された複数のコンピュータで実行されるように配備される。
【０１１３】
本明細書に説明した処理及び論理フローは、１又は２以上のコンピュータプログラムを実行する１又は２以上のプログラマブルプロセッサによって実行され、入力データを演算して出力を生成することによってアクションを実行することができる。処理及び論理フローは、専用論理回路、例えば、ＦＰＧＡ（フィールドプログラマブルゲートアレイ）又はＡＳＩＣ（特定用途向け集積回路）によって実行することができ、装置は、専用論理回路、例えば、ＦＰＧＡ（フィールドプログラマブルゲートアレイ）又はＡＳＩＣ（特定用途向け集積回路）として実施することができる。
【０１１４】
コンピュータプログラムの実行に適するプロセッサは、一例として、汎用及び専用マイクロプロセッサの両方、及びあらゆる種類のデジタルコンピュータのいずれか１つ又はそれよりも多いプロセッサを含む。一般的に、プロセッサは、読取専用メモリ又はランダムアクセスメモリ又はこれらの両方から命令及びデータを受信する。コンピュータの基本的な要素は、命令に従ってアクションを実行するためのプロセッサ、及び命令及びデータを格納するための１又は２以上のメモリデバイスである。一般的にコンピュータは、データを格納するための１又は２以上の大容量ストレージデバイス、例えば、磁気ディスク、磁気光学ディスク、又は光学ディスク、又は固体ドライブを含むか、これらからデータを受信するか又はデータを転送し、又はこの両方のために動作的に結合される。しかし、コンピュータは、そのようなデバイスを有する必要はない。コンピュータは、別のデバイス、いくつか挙げると、例えば、スマートフォン、移動音声又は映像プレーヤ、ゲームコンソール、全地球測位システム（ＧＰＳ）受信機、又は携帯式ストレージデバイス（例えば、ユニバーサルシリアルバス（ＵＳＢ）フラッシュドライブ）に組み込むことができる。コンピュータプログラム命令及びデータを格納するのに適するデバイスは、一例として、半導体メモリデバイス、例えば、ＥＰＲＯＭ、ＥＥＰＲＯＭ、及びフラッシュメモリデバイス、磁気ディスク、例えば、内部ハードディスク又は着脱可能ディスク、磁気光学ディスク、及びＣＤ−ＲＯＭ及びＤＶＤ−ＲＯＭディスクを含む不揮発性メモリ、媒体、及びメモリデバイスの全ての形態を含む。プロセッサ及びメモリは、専用論理回路によって補足又は専用論理回路に組み込むことができる。
【０１１５】
ユーザとの対話を提供するために、本明細書に説明する主題の実施形態は、ディスプレイデバイス、例えば、ユーザに情報を表示するためのディスプレイデバイス、例えば、ＣＲＴ（ブラウン管）又はＬＣＤ（液晶ディスプレイ）モニタ、及びキーボード及びポインティングデバイス、ユーザがコンピュータに入力を与えることを可能にする例えばマウス、トラックボール、タッチパッド、又はスタイラスを有するコンピュータを用いて実施することができる。他の種類のデバイスを使用して、同様にユーザとの対話を提供することができ、例えば、ユーザに提供されるフィードバックは、センサ式フィードバックのあらゆる形態、例えば、視覚フィードバック、聴覚フィードバック、又は触知フィードバックとすることができ、ユーザからの入力は、音響、音声、又は触知入力を含むあらゆる形態で受信することができる。コンピュータは、ユーザによって使用されるデバイスにリソースを送信し、デバイスからリソースを受信することにより、例えば、ウェブブラウザから受信した要求に応じてユーザのクライアントデバイスのウェブブラウザにウェブページを送信することによってユーザと対話することができる。
【０１１６】
本明細書に説明する主題の実施形態は、バックエンド構成要素を例えばデータサーバとして含むか、又はミドルウェア構成要素、例えば、アプリケーションサーバを含むか、又はフロントエンド構成要素、例えば、ユーザが本明細書に説明する主題の実施と対話することを可能にするグラフィカルユーザインタフェース又はウェブブラウザを有するクライアントコンピュータ、又は１又は２以上のこれらのバックエンド、ミドルウェア、又はフロントエンド構成要素のあらゆる組合せを含むコンピュータシステムを用いて実施することができる。システムの構成要素は、デジタルデータ通信のあらゆる形態又は媒体、例えば、通信ネットワークによって相互接続することができる。通信ネットワークの例は、ローカル区域ネットワーク（「ＬＡＮ」）及びワイド区域ネットワーク（「ＷＡＮ」）、インターネットワーク（例えば、インターネット）及びピアツーピアネットワーク（例えば、アドホックピアツープアネットワーク）を含む。
【０１１７】
コンピュータシステムは、クライアント及びサーバを含むことができる。クライアント及びサーバは、一般的に互いから遠隔にあり、一般的に通信ネットワーク上で対話する。クライアントとサーバの関係は、それぞれのコンピュータで実行されて互いにクライアント−サーバ関係を有するコンピュータプログラムによって発生する。一部の実施形態では、サーバは、データ（例えば、ＨＴＭＬページ）をクライアントデバイスに送信する（クライアントデバイスと対話するユーザにデータを表示してユーザからユーザ入力を受信するために）。クライアントデバイスで生成されたデータ（例えば、ユーザ対話の結果）は、サーバでクライアントデバイスから受信することができる。
【０１１８】
１又は２以上のコンピュータのシステムは、動作中にシステムにアクションを実行させるシステム上にインストールされたソフトウエア、ファームウエア、ハードウエア、又はその組合せを有することによって特定の動作又はアクションを実行するように構成することができる。１又は２以上のコンピュータプログラムは、データ処理装置によって実行された時に装置にアクションを実行させる命令を含むことによって特定の動作又はアクションを実行するように構成することができる。
【０１１９】
本明細書は多くの特定の実施の詳細を含有するが、それらは、いずれの発明又は主張することができる範囲の制限として解釈すべきではなく、逆に特定の発明の特定の実施形態に固有の特徴の説明として解釈しなければならない。個別の実施形態の関連で本明細書に説明するある一定の特徴は、単一実施形態に組み合わせて実施することができる。対照的に、単一実施形態の関連で説明する様々な特徴は、複数の実施形態で別々に又はあらゆる適切な部分組合せを用いて実施することができる。更に、特徴は、ある一定の組合せで作用するように上述し、更にそのように最初に主張したが、主張した組合せからの１又は２以上の特徴は、一部の事例では組合せから削除することができ、主張した組合せを部分組合せ又は部分組合せの変形に向けることができる。
【０１２０】
同様に、動作は、特定の順序で図面に示されているが、これは、望ましい結果を達成するためにそのような動作を示された特定の順序又は連続的な順序で実行し、又は全ての例示された動作を実行することが望ましいとして理解すべきではない。ある状況では、マルチタスク及び並列処理が有利である場合がある。上述の実施形態における様々なシステム構成要素の分離は、全ての実施形態においてそのような分離を要求するものとして理解すべきではなく、説明したプログラム構成要素及びシステムは、一般的に単一ソフトウエア製品に互いに統合するか又は複数のソフトウエア製品にパッケージ化することができることを理解しなければならない。
【０１２１】
すなわち、本主題の特定の実施形態を説明した。他の実施形態も特許請求の範囲内である。一部の事例では、特許請求の範囲に説明するアクションを異なる順序で実行して望ましい結果を達成することができる。更に、添付の図に示す処理は、望ましい結果を達成するために必ずしも示す特定の順序又は連続的な順序を必要としない。ある一定の実施では、マルチタスク及び並列処理が有利である場合がある。
【符号の説明】
【０１２２】
５０２  ＭＸノード
５０４  Ｑノード
５１０  高速バッファ
５２８  通知子
５３０  待機リスト
【図１Ａ】
2019535072.tif 000006
【図１Ｂ】
2019535072.tif 000007
【図２】
2019535072.tif 000008
【図３Ａ】
2019535072.tif 000009
【図３Ｂ】
2019535072.tif 000010
【図４Ａ】
2019535072.tif 000011
【図４Ｂ】
2019535072.tif 000012
【図４Ｃ】
2019535072.tif 000013
【図５】
2019535072.tif 000014
【図６】
2019535072.tif 000015
【図７】
2019535072.tif 000016
【国際調査報告】
2019535072.tif 000017
2019535072.tif 000018