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