(57)【特許請求の範囲】
【請求項１】
クライアントとブローカとの間に設けられる分散連携プロキシであって、
前記クライアントと通信するための第１の通信手段と、
前記ブローカと通信するための第２の通信手段と、
隣接する分散連携プロキシと通信するための第３の通信手段と、
を具備し、
前記第１の通信手段および前記第２の通信手段は、前記クライアントと前記ブローカとの間の通信の中継を行なうように連動し、
前記第３の通信手段は、前記第１の通信手段を介して前記クライアントから受信したメッセージまたは前記第２の通信手段を介して前記ブローカから受信したメッセージに基づいて、前記ブローカと前記隣接する分散連携プロキシに接続された他のブローカとの間の通信の中継を行なう、ことを特徴とする分散連携プロキシ。
【請求項２】
前記第３の通信手段が前記第１の通信手段を介して前記クライアントからパブリッシュメッセージを受信した場合、前記第３の通信手段は、前記クライアントから受信した前記パブリッシュメッセージを前記隣接する分散連携プロキシに送信し、
前記第３の通信手段が前記隣接する分散連携プロキシのうちの１つの分散連携プロキシからパブリッシュメッセージを受信した場合、前記第３の通信手段は、前記隣接する分散連携プロキシのうちの他の分散連携プロキシに、前記１つの分散連携プロキシから受信したパブリッシュメッセージを送信するとともに、前記第２の通信手段を介して、前記隣接する分散連携プロキシから受信した前記パブリッシュメッセージを前記ブローカに送信する、ことを特徴とする請求項１に記載の分散連携プロキシ。
【請求項３】
前記第３の通信手段が前記第１の通信手段を介して前記クライアントからサブスクライブメッセージを受信した場合、前記第３の通信手段は、前記クライアントから受信した前記サブスクライブメッセージを前記隣接する分散連携プロキシに送信し、
前記第３の通信手段が前記隣接する分散連携プロキシのうちの１つの分散連携プロキシからサブスクライブメッセージを受信した場合、前記第３の通信手段は、前記隣接する分散連携プロキシのうちの他の分散連携プロキシに、前記１つの分散連携プロキシから受信したサブスクライブメッセージを送信するとともに、前記第２の通信手段を介して、前記隣接する分散連携プロキシから受信した前記サブスクライブメッセージを前記ブローカに送信する、ことを特徴とする請求項１に記載の分散連携プロキシ。
【請求項４】
前記第３の通信手段は、メッセージの同一性を識別可能な情報と、当該メッセージの送信相手または受信相手を示す情報と、を履歴情報として保持し、前記履歴情報に基づいてメッセージ送信を行なうか否かを判定することを特徴とする請求項１乃至３のいずれか一項に記載の分散連携プロキシ。
【請求項５】
複数のブローカと、前記複数のブローカにそれぞれ対応する複数の分散連携プロキシと、を備える非同期メッセージングシステムであって、
前記複数の分散連携プロキシの各々は、当該分散連携プロキシに対応するブローカとクライアントとの間に設けられ、
前記複数の分散連携プロキシの各々は、
前記クライアントと通信するための第１の通信手段と、
前記対応するブローカと通信するための第２の通信手段と、
前記複数の分散連携プロキシのうちの隣接する分散連携プロキシと通信するための第３の通信手段と、
を具備し、
前記第１の通信手段および前記第２の通信手段は、前記クライアントと前記対応するブローカとの間の通信の中継を行なうように連動し、
前記第３の通信手段は、前記第１の通信手段を介して前記クライアントから受信したメッセージまたは前記第２の通信手段を介して前記対応するブローカから受信したメッセージに基づいて、前記対応するブローカと前記隣接する分散連携プロキシに対応するブローカとの間の通信の中継を行なう、ことを特徴とする非同期メッセージングシステム。
【請求項６】
前記第３の通信手段が前記第１の通信手段を介して前記クライアントからパブリッシュメッセージを受信した場合、前記第３の通信手段は、前記クライアントから受信した前記パブリッシュメッセージを前記隣接する分散連携プロキシに送信し、
前記第３の通信手段が前記隣接する分散連携プロキシのうちの１つの分散連携プロキシからパブリッシュメッセージを受信した場合、前記第３の通信手段は、前記隣接する分散連携プロキシのうちの他の分散連携プロキシに、前記１つの分散連携プロキシから受信したパブリッシュメッセージを送信するとともに、前記第２の通信手段を介して、前記隣接する分散連携プロキシから受信した前記パブリッシュメッセージを前記対応するブローカに送信する、ことを特徴とする請求項５に記載の非同期メッセージングシステム。
【請求項７】
前記第３の通信手段が前記第１の通信手段を介して前記クライアントからサブスクライブメッセージを受信した場合、前記第３の通信手段は、前記クライアントから受信した前記サブスクライブメッセージを前記隣接する分散連携プロキシに送信し、
前記第３の通信手段が前記隣接する分散連携プロキシのうちの１つの分散連携プロキシからサブスクライブメッセージを受信した場合、前記第３の通信手段は、前記隣接する分散連携プロキシのうちの他の分散連携プロキシに、前記１つの分散連携プロキシから受信したサブスクライブメッセージを送信するとともに、前記第２の通信手段を介して、前記隣接する分散連携プロキシから受信した前記サブスクライブメッセージを前記対応するブローカに送信する、ことを特徴とする請求項５に記載の非同期メッセージングシステム。
【請求項８】
前記第３の通信手段は、メッセージの同一性を識別可能な情報と、当該メッセージの送信相手または受信相手を示す情報と、を履歴情報として保持し、前記履歴情報に基づいてメッセージ送信を行なうか否かを判定することを特徴とする請求項５乃至７のいずれか一項に記載の非同期メッセージングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、非同期メッセージングシステムにおいて非同期メッセージングサーバの負荷分散を実現するための技術に関する。
【背景技術】
【０００２】
リアルタイムなデータのやり取りを実現する方法として、ｐｕｂ／ｓｕｂと呼ばれる非同期メッセージング手法が知られている。ｐｕｂ／ｓｕｂに基づいた非同期メッセージングシステム（ｐｕｂ／ｓｕｂメッセージングシステム）は、一般的には、パブリッシャ（publisher）、非同期メッセージングサーバとしてのブローカ（broker）、サブスクライバ（subscriber）から構成される。
【０００３】
ｐｕｂ／ｓｕｂメッセージングシステムでは、クライアント（パブリッシャまたはサブスクライバ）は、ブローカとの間でデータのやり取りを行なえばよいため、通信機能を軽量化することができる。しかし、クライアント数が増大すると、ブローカに負荷が集中しやすくなる。従来のｐｕｂ／ｓｕｂメッセージングシステムには、負荷分散を実現するために、ブローカ同士を連携させる連携機能を持つブローカを複数設けたものがある。しかしながら、ブローカ同士の連携は実装に依存する機能である。異なる動作環境のブローカ同士を連携させることができない場合があり、また、連携機能を持たないブローカを実装に用いることができない。例えば、ＭＱＴＴ（MQ Telemetry Transport）やＪＭＳ（Java（登録商標） Message Service）などのプロトコルは、単一ブローカの動作のみを規定しており、複数のブローカの連携については標準化されていない。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】“Building a two node high availability MQTT cluster”（ＵＲＬ：http://www.hivemq.com/blog/building-a-high-availability-mqtt-cluster）
【非特許文献２】“Distributed RabbitMQ brokers”（ＵＲＬ：https://www.rabbitmq.com/distributed.html）
【非特許文献３】“mosquitto.conf - the configuration file for mosquitto”（ＵＲＬ：http://mosquitto.org/man/mosquitto-conf-5.html）
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明は、上記事情に着目してなされたものであり、その目的とするところは、任意のブローカ同士の連携を可能にする分散連携プロキシ、およびこの分散連携プロキシを用いた非同期メッセージングシステムを提供することである。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、本発明の第１の態様は、クライアントとブローカとの間に設けられる分散連携プロキシであって、前記クライアントと通信するための第１の通信手段と、前記ブローカと通信するための第２の通信手段と、隣接する分散連携プロキシと通信するための第３の通信手段と、を備え、前記第１の通信手段および前記第２の通信手段が、前記クライアントと前記ブローカとの間の通信の中継を行なうように連動し、前記第３の通信手段が、前記第１の通信手段を介して前記クライアントから受信したメッセージまたは前記第２の通信手段を介して前記ブローカから受信したメッセージに基づいて、前記ブローカと前記隣接する分散連携プロキシに接続された他のブローカとの間の通信の中継を行なうようにしたものである。
【０００７】
本発明の第２の態様は、複数のブローカと、前記複数のブローカにそれぞれ対応する複数の分散連携プロキシと、を備える非同期メッセージングシステムであって、前記複数の分散連携プロキシの各々が、当該分散連携プロキシに対応するブローカとクライアントとの間に設けられ、前記複数の分散連携プロキシの各々が、前記クライアントと通信するための第１の通信手段と、前記対応するブローカと通信するための第２の通信手段と、前記複数の分散連携プロキシのうちの隣接する分散連携プロキシと通信するための第３の通信手段と、を備え、前記第１の通信手段および前記第２の通信手段が、前記クライアントと前記対応するブローカとの間の通信の中継を行なうように連動し、前記第３の通信手段が、前記第１の通信手段を介して前記クライアントから受信したメッセージまたは前記第２の通信手段を介して前記対応するブローカから受信したメッセージに基づいて、前記対応するブローカと前記隣接する分散連携プロキシに対応するブローカとの間の通信の中継を行なうようにしたものである。
【発明の効果】
【０００８】
本発明によれば、非同期メッセージングシステムにおいて任意のブローカ同士を連携させることができる。
【図面の簡単な説明】
【０００９】
【図１】第１の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムの構成例を示すブロック図。
【図２】第１の実施形態に係る連携方式（ＰＦＡ）を説明するための図。
【図３】第１の実施形態に係る分散連携プロキシの構成例を示すブロック図。
【図４】第１の実施形態に係るｐｕｂ／ｓｕｂメッセージング方法の説明に使用するシステム構成を示すブロック図。
【図５】第１の実施形態に係るｐｕｂ／ｓｕｂメッセージング方法を例示するシーケンス図。
【図６】第２の実施形態に係る連携方式（ＳＦＡ）を説明するための図。
【図７】第２の実施形態に係るｐｕｂ／ｓｕｂメッセージング方法の説明に使用するシステム構成を示すブロック図。
【図８】第２の実施形態に係るｐｕｂ／ｓｕｂメッセージング方法を例示するシーケンス図。
【図９】第３の実施形態に係るループ回避機構を説明するための図。
【発明を実施するための形態】
【００１０】
以下、図面を参照して本発明の実施形態を説明する。実施形態は、パブリッシャがトピックと呼ばれる論理チャネルを指定してメッセージを送信すると、同じトピックを指定して事前に受信登録しているサブスクライバに届く仕組みであるトピックベースｐｕｂ／ｓｕｂに関する。
【００１１】
［第１の実施形態］
図１は、第１の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムの構成例を示している。図１に示されるｐｕｂ／ｓｕｂメッセージングシステムは、複数のブローカ（ブローカＢ１、Ｂ２、Ｂ３）と、複数のブローカそれぞれに対応して設けられた複数の分散連携プロキシ（分散連携プロキシＤ１、Ｄ２、Ｄ３）と、を備える。ブローカＢ１には分散連携プロキシＤ１が接続され、ブローカＢ２には分散連携プロキシＤ２が接続され、ブローカＢ３には分散連携プロキシＤ３が接続されている。さらに、分散連携プロキシＤ１は分散連携プロキシＤ２に接続され、分散連携プロキシＤ２は分散連携プロキシＤ１、Ｄ３に接続され、分散連携プロキシＤ３は分散連携プロキシＤ２に接続されている。
【００１２】
分散連携プロキシには、０台以上のクライアントが接続されることができる。言い換えると、分散連携プロキシには、クライアントが動的に追加または削除されることができる。クライアントは、パブリッシャおよびサブスクライバの一方または両方の機能を果たすことができる。図１に示される例では、パブリッシャＰ１およびサブスクライバＳ１が分散連携プロキシＤ１に接続され、サブスクライバＳ２が分散連携プロキシＤ１に接続されている。パブリッシャ（例えば、パブリッシャＰ１）が、あるトピックにメッセージをパブリッシュした場合、このメッセージは、ブローカＢ１、Ｂ２、Ｂ３と分散連携プロキシＤ１、Ｄ２、Ｄ３とから構成される通信ネットワークを通じて、そのトピックをサブスクライブしているサブスクライバ（例えば、サブスクライバＳ１、Ｓ２）へ提供される。
【００１３】
分散連携プロキシは、クライアントとブローカとの間に位置し、クライアントとブローカとの間の通信の中継を行なう。例えば、分散連携プロキシＤ１は、パブリッシャＰ１およびサブスクライバＳ１とブローカＢ１との間に位置し、パブリッシャＰ１とブローカＢ１との間の通信およびサブスクライバＳ１とブローカＢ１との間の通信の中継を行なう。さらに、分散連携プロキシは、隣接する分散連携プロキシと通信することでブローカ同士の連携を実現する。例えば、分散連携プロキシＤ１は、ブローカＢ１、パブリッシャＰ１、またはサブスクライバＳ１から受信したメッセージを分散連携プロキシＤ２に転送することができ、分散連携プロキシＤ２から受信したメッセージをブローカＢ１に転送することができる。
【００１４】
本実施形態は、サブスクライブメッセージを伝搬させずに、パブリッシュメッセージを全てのブローカに伝搬させる連携方式を使用する。この連携方式をＰＦＡ（Publish Flooding Algorithm）と称する。ＰＦＡでは、サブスクライバ（例えば、サブスクライバＳ１）が、所望するトピックにサブスクライブする（購読を申し込む）ためのサブスクライブメッセージを送信すると、このサブスクライブメッセージは、サブスクライバ（例えば、サブスクライバＳ１）が接続されている分散連携プロキシ（例えば、分散連携プロキシＤ１）によって、対応するブローカ（例えば、ブローカＢ１）に転送される。これにより、サブスクライブメッセージを受信したブローカ（例えば、ブローカＢ１）において、サブスクライバ（例えば、サブスクライバＳ１）がトピックにサブスクライブしている状態となる。一方で、パブリッシャ（例えば、パブリッシャＰ１）が、パブリッシュしたいデータを含むパブリッシュメッセージを送信すると、このパブリッシュメッセージは、全ての分散連携プロキシ（例えば、分散連携プロキシＤ１、Ｄ２、Ｄ３）によって全てのブローカ（例えば、ブローカＢ１、Ｂ２、Ｂ３）に転送される。ブローカ（例えば、ブローカＢ１）は、パブリッシュメッセージを受信すると、トピックにサブスクライブしているサブスクライバ（例えば、サブスクライバＳ１）に分散連携プロキシ（例えば、分散連携プロキシＤ１）経由でパブリッシュメッセージを転送する。ＰＦＡでは、接続されている全ての分散連携プロキシにパブリッシャメッセージを転送するので、個々の分散連携プロキシの処理は容易になる。
【００１５】
図２を参照してＰＦＡをより詳細に説明する。図２（ａ）に示されるｐｕｂ／ｓｕｂメッセージングシステムでは、５台のブローカＢ１、Ｂ２、Ｂ３、Ｂ４、Ｂ５が分散連携プロキシＤ１、Ｄ２、Ｄ３、Ｄ４、Ｄ５にそれぞれ接続されており、分散連携プロキシＤ１は分散連携プロキシＤ２に接続され、分散連携プロキシＤ２は分散連携プロキシＤ１、Ｄ３、Ｄ４に接続され、分散連携プロキシＤ３は分散連携プロキシＤ２に接続され、分散連携プロキシＤ４は分散連携プロキシＤ２、Ｄ５に接続され、分散連携プロキシＤ５は分散連携プロキシＤ４に接続されている。
【００１６】
まず、図２（ａ）に示されるように、サブスクライバＳ１は、サブスクライブメッセージを分散連携プロキシＤ２に送信し、分散連携プロキシＤ２は、サブスクライバＳ１から受信したサブスクライブメッセージをブローカＢ２に転送する。また、図２（ｂ）に示されるように、サブスクライバＳ２は、サブスクライブメッセージを分散連携プロキシＤ４に送信し、分散連携プロキシＤ４は、サブスクライバＳ２から受信したサブスクライブメッセージをブローカＢ４に転送する。ここでは、サブスクライバＳ１、Ｓ２が同じトピックにサブスクライブしたものとする。これにより、図２（ｃ）に示されるように、ブローカＢ２においてサブスクライバＳ１がトピックにサブスクライブした状態となり、ブローカＢ４においてサブスクライバＳ２がトピックにサブスクライブした状態となる。図２（ｃ）において、サブスクライバから分散連携プロキシへ向かう実線矢印は、サブスクライブ方向を表す。
【００１７】
次に、図２（ｄ）に示されるように、分散連携プロキシＤ５に接続されたパブリッシャＰ１は、分散連携プロキシＤ５にパブリッシュメッセージを送信し、分散連携プロキシＤ５は、パブリッシャＰ１から受信したパブリッシュメッセージをブローカＢ５に転送する。さらに、分散連携プロキシＤ５は、パブリッシュメッセージを分散連携プロキシＤ４に転送する。分散連携プロキシＤ４は、分散連携プロキシＤ５から受信したパブリッシュメッセージをブローカＢ４に転送し、さらに、分散連携プロキシＤ３に転送する。分散連携プロキシＤ３は、分散連携プロキシＤ４から受信したパブリッシュメッセージをブローカＢ３に転送し、さらに、分散連携プロキシＤ１、Ｄ３に転送する。分散連携プロキシＤ１は、分散連携プロキシＤ２から受信したパブリッシュメッセージをブローカＢ１に転送し、分散連携プロキシＤ３は、分散連携プロキシＤ２から受信したパブリッシュメッセージをブローカＢ３に転送する。このようにして、パブリッシュメッセージは、分散連携プロキシＤ１〜Ｄ５による中継によって全てのブローカＢ１〜Ｂ５に伝搬される。ここで、パブリッシャＰ１が指定したトピックは、サブスクライバＳ１、Ｓ２がサブスクライブしたトピックと同じであるとする。すなわち、パブリッシャＰ１が送信したパブリッシュメッセージは、サブスクライバＳ１、Ｓ２によるサブスクライブの対象であるとする。
【００１８】
分散連携プロキシＤ４からパブリッシュメッセージを受信したブローカＢ４は、パブリッシュメッセージのトピックにサブスクライバＳ２がサブスクライブしていることを検出し、分散連携プロキシＤ４を介してサブスクライバＳ２にパブリッシュメッセージを転送する。さらに、分散連携プロキシＤ２からパブリッシュメッセージを受信したブローカＢ２は、パブリッシュメッセージのトピックにサブスクライバＳ１がサブスクライブしていることを検出し、分散連携プロキシＤ２を介してサブスクライバＳ１にパブリッシュメッセージを転送する。このようにして、パブリックメッセージは、該当するトピックにサブスクライブしているサブスクライバに届けられる。
【００１９】
図３は、第１の実施形態に係る分散連携プロキシの構成例を示している。図３に示されるように、分散連携プロキシＤ１は、クライアントＣ１、ブローカＢ１、および分散連携プロキシＤ２に接続されている。分散連携プロキシＤ２は、分散連携プロキシＤ１と同様の構成を有することができる。ここでは、分散連携プロキシＤ１について説明を行なう。
【００２０】
分散連携プロキシＤ１は、ローカル連携部３０１、リモート連携部３０２、およびブローカ連携部３０３を備える。ローカル連携部３０１は、クライアントＣ１と通信を行ない、リモート連携部３０２に情報を伝達しつつ、ブローカ連携部３０３と連動してクライアントＣ１とブローカＢ１との間の通信を仲介する。ブローカ連携部３０３は、ブローカＢ１と通信を行ない、リモート連携部３０２に情報を伝達しつつ、ローカル連携部３０１と連動してクライアントＣ１とブローカＢ１との間の通信を仲介する。リモート連携部３０２は、分散連携プロキシＤ２と通信を行ない、ローカル連携部３０１およびブローカ連携部３０３からの情報に基づいてブローカＢ１と分散連携プロキシＤ２に接続されたブローカとの間の通信を仲介する。
【００２１】
ローカル連携部３０１は、クライアントＣ１からメッセージを受信すると、ブローカ連携部３０３を介してブローカＢ１にこのメッセージを送信するとともに、リモート連携部３０２にこのメッセージを渡す。リモート連携部３０２は、クライアントＣ１からのメッセージがパブリッシュメッセージである場合には、擬似的なパブリッシャとして分散連携プロキシＤ２にこのメッセージを送信するが、クライアントＣ１からのメッセージがサブスクライブメッセージである場合には、分散連携プロキシＤ２へのメッセージ送信を行なわない。
【００２２】
リモート連携部３０２は、分散連携プロキシＤ２からパブリッシュメッセージを受信すると、ブローカ連携部３０３を介してブローカＢ１にこのパブリッシュメッセージを送信する。分散連携プロキシＤ２以外に隣接する分散連携プロキシがある場合、リモート連携部３０２は、擬似的なパブリッシャとして、当該分散連携プロキシに、分散連携プロキシＤ２から受信したパブリッシュメッセージをさらに送信する。ブローカ連携部３０３は、ブローカＢ１からパブリッシュメッセージを受信すると、ローカル連携部３０１を介してサブスクライバＳ１にこのパブリッシュメッセージを送信する。
【００２３】
分散連携プロキシＤ１はブローカＢ１の外部に設けられ、すなわち、ブローカ同士を連携させる連携機能がブローカＢ１の外部に切り出されている。分散連携プロキシＤ１は、例えば、メモリおよびプロセッサ（例えば、ＣＰＵ）を備えるコンピュータなどの情報処理装置において、メモリに格納されるコンピュータプログラムをプロセッサに実行させることにより実現することができる。分散連携プロキシＤ１は、ブローカＢ１が実装される装置（例えば、サーバ）上に実装されてもよく、ブローカＢ１が実装される装置と異なる装置上に実装されてもよい。
【００２４】
上述した構成を有する分散連携プロキシを用いることにより、複数台のブローカを含むｐｕｂ／ｓｕｂメッセージングシステムにおいて、実装に依存せず任意のブローカ間の連携が可能となる。言い換えると、ｐｕｂ／ｓｕｂメッセージングシステムに利用可能なブローカの選択肢が増大する。具体的には、動作環境の異なるブローカ同士の連携や連携機能を持たないブローカ同士の連携が可能となる。一例として、Ｗｉｎｄｏｗｓ（登録商標）サーバ上のブローカとＡｎｄｒｏｉｄ（登録商標）ホームゲートウェイ上のブローカを連携させることが可能となる。他の例では、異なるサービスベンダーがそれぞれの都合で選んだブローカ同士を相互接続することが可能になる。また、付加機能やライセンス・価格等の面で連携機能を持たないブローカに優位性がある場合に、これらのブローカを用いてｐｕｂ／ｓｕｂメッセージングシステムを構築することが可能となる。その結果、負荷分散を実現する際の自由度が高くなり、すなわち、負荷分散を実現できるシチュエーションが広がる。さらに、非同期メッセージングシステムの信頼性が向上する。
【００２５】
次に、図４および図５を参照して、第１の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムの動作例について説明する。
【００２６】
図４に示されるｐｕｂ／ｓｕｂメッセージングシステムでは、分散連携プロキシＤ１がブローカＢ１に対応して設けられ、分散連携プロキシＤ２がブローカＢ２に対応して設けられ、分散連携プロキシＤ１、Ｄ２が互いに接続されている。さらに、パブリッシャＰ１およびサブスクライバＳ１が分散連携プロキシＤ１に接続され、サブスクライバＳ２が分散連携プロキシＤ２に接続されている。
【００２７】
まず、サブスクライバＳ１が、ブローカＢ１に対して、所望するトピックにサブスクライブする。具体的には、サブスクライバＳ１が、サブスクライブメッセージを分散連携プロキシＤ１に送信し（図５のＳ５０１）、分散連携プロキシＤ１が、このサブスクライブメッセージをブローカＢ１に転送する（Ｓ５０２）。一方で、サブスクライバＳ２が、ブローカＢ２に対して、所望するトピック（ここでは、サブスクライバＳ１と同じトピック）にサブスクライブする。具体的には、サブスクライバＳ２が、サブスクライブメッセージを分散連携プロキシＤ２に送信し（Ｓ５０３）、分散連携プロキシＤ２が、そのサブスクライブメッセージをブローカＢ２に転送する（Ｓ５０４）。
【００２８】
次に、パブリッシャＰ１が、ブローカＢ１に対して、所望するトピック（ここでは、サブスクライバＳ１、Ｓ２がサブスクライブしたものと同じトピック）にメッセージをパブリッシュする。具体的には、パブリッシャＰ１が、パブリッシュメッセージを分散連携プロキシＤ１に送信し（Ｓ５０５）、分散連携プロキシＤ１が、このパブリッシュメッセージをブローカＢ１に転送する（Ｓ５０６）。分散連携プロキシＤ１は、擬似的なパブリッシャとして、分散連携プロキシＤ２の中継によってブローカＢ２にパブリッシュメッセージをパブリッシュする。具体的には、分散連携プロキシＤ１が、当該パブリッシュメッセージを分散連携プロキシＤ２に転送し（Ｓ５０７）、分散連携プロキシＤ２が、パブリッシュメッセージをブローカＢ２に転送する（Ｓ５０８）。
【００２９】
続いて、サブスクライバＳ１は、分散連携プロキシＤ１の中継によってブローカＢ１からパブリッシュメッセージを受信する。具体的には、ブローカＢ１が、パブリッシュメッセージを分散連携プロキシＤ１に転送し（Ｓ５０９）、分散連携プロキシＤ１が、このパブリッシュメッセージをサブスクライバＳ１に転送する（Ｓ５１０）。さらに、サブスクライバＳ２は、分散連携プロキシＤ２の中継によってブローカＢ２からパブリッシュメッセージを受信する。具体的には、ブローカＢ２が、パブリッシュメッセージを分散連携プロキシＤ２に転送し（Ｓ５１１）、分散連携プロキシＤ２が、このパブリッシュメッセージをサブスクライバＳ２に転送する（Ｓ５１２）。
このように、分散連携プロキシＤ１、Ｄ２は、異なるブローカに収容されたクライアント同士が単一ブローカを用いる場合と同様に通信可能となるように、相互連携する。
【００３０】
以上のように、第１の実施形態に係る分散連携プロキシは、クライアントとブローカとの間に設けられており、クライアントと通信を行なうローカル連携部と、隣接する分散連携プロキシと通信を行なうリモート連携部と、ブローカと通信を行なうブローカ連携部と、を備え、ローカル連携部およびブローカ連携部が、前記クライアントと前記ブローカとの間の通信の中継を行なうように連動し、リモート連携部が、ローカル連携部を介して前記クライアントから受信したメッセージまたはブローカ連携部を介してブローカから受信したメッセージに基づいて、ブローカと隣接する分散連携プロキシに接続された他のブローカとの間の通信の中継を行なう。すなわち、分散連携プロキシは、ブローカとクライアントとの通信を仲介し、ブローカとクライアントとの通信内容に応じて他の分散連携プロキシと連携する。上記の分散連携プロキシを用いることにより、複数台のブローカを含むｐｕｂ／ｓｕｂメッセージングシステムにおいて、実装に依存せず任意のブローカ間の連携が可能となる。その結果、負荷分散を実現する際の自由度が高くなり、非同期メッセージングシステムの信頼性が向上する。
【００３１】
［第２の実施形態］
第１の実施形態では、サブスクライブメッセージを伝搬させずに、パブリッシュメッセージを全てのブローカに伝搬させる連携方式（ＰＦＡ）を説明した。第２の実施形態では、サブスクライブメッセージを全てのブローカに伝搬させ、パブリッシュメッセージを必要なブローカにのみ転送する連携方式について説明する。この連携方式をＳＦＡ（Subscribe Flooding Algorithm）と称する。第２の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムは、第１の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムと同様の構成を有し、メッセージの転送処理を除いて同様の動作を行なうので、ここでは、第１の実施形態と異なる点について主に説明する。
【００３２】
図６を参照してＳＦＡについて説明する。図６（ａ）に示されるｐｕｂ／ｓｕｂメッセージングシステムでは、５台のブローカＢ１、Ｂ２、Ｂ３、Ｂ４、Ｂ５が分散連携プロキシＤ１、Ｄ２、Ｄ３、Ｄ４、Ｄ５にそれぞれ接続されており、分散連携プロキシＤ１は分散連携プロキシＤ２に接続され、分散連携プロキシＤ２は分散連携プロキシＤ１、Ｄ３、Ｄ４に接続され、分散連携プロキシＤ３は分散連携プロキシＤ２に接続され、分散連携プロキシＤ４は分散連携プロキシＤ２、Ｄ５に接続され、分散連携プロキシＤ５は分散連携プロキシＤ４に接続されている。
【００３３】
まず、図６（ａ）に示されるように、サブスクライバＳ１が、サブスクライブメッセージを分散連携プロキシＤ２に送信し、分散連携プロキシＤ２は、サブスクライバＳ１から受信したサブスクライブメッセージをブローカＢ２に転送するとともに、サブスクライブメッセージを分散連携プロキシＤ１、Ｄ３、Ｄ４に転送する。分散連携プロキシＤ１は、分散連携プロキシＤ２から受信したサブスクライブメッセージをブローカＢ１に転送する。分散連携プロキシＤ３は、分散連携プロキシＤ２から受信したサブスクライブメッセージをブローカＢ３に転送する。分散連携プロキシＤ４は、分散連携プロキシＤ２から受信したサブスクライブメッセージをブローカＢ３に転送し、さらに、サブスクライブメッセージを分散連携プロキシＤ５に転送する。分散連携プロキシＤ５は、分散連携プロキシＤ４から受信したサブスクライブメッセージをブローカＢ５に転送する。これにより、ブローカＢ１〜Ｂ５においてサブスクライバＳ１がトピックにサブスクライブした状態となる。図６（ｂ）に示される実線矢印は、サブスクライブ方向を表す。パブリッシュメッセージは、サブスクライブ方向と逆向きにのみ転送される。サブスクライブ方向に関する情報は、各分散連携プロキシのリモート連携部３０２（図３）によって管理される。
【００３４】
続いて、図６（ｂ）に示されるように、サブスクライバＳ２は、サブスクライブメッセージを分散連携プロキシＤ４に送信する。ここでは、サブスクライバＳ１、Ｓ２が同じトピックにサブスクライブしたものとする。分散連携プロキシＤ４は、サブスクライバＳ２から受信したサブスクライブメッセージをブローカＢ４に転送するとともに、分散連携プロキシＤ２にこのサブスクライブメッセージを転送する。分散連携プロキシＤ４は、以前に、サブスクライバＳ１からのサブスクライブメッセージを分散連携プロキシＤ５に転送しており、あるパブリッシャがブローカＢ５に対してパブリッシュメッセージを送信した場合には、そのパブリッシュメッセージは、分散連携プロキシＤ５から転送されることになっている。このため、分散連携プロキシＤ４がサブスクライバＳ２からのサブスクライブメッセージを分散連携プロキシＤ５に転送する必要がない。分散連携プロキシＤ２は、サブスクライバＳ１から受信したサブスクライブメッセージをブローカＢ２に転送する。上述したものと同様の理由により、分散連携プロキシＤ２は、サブスクライバＳ２からのサブスクライブメッセージを分散連携プロキシＤ１、Ｄ３に転送しなくてよい。これにより、図６（ｃ）に示されるように、ブローカＢ１〜Ｂ５においてサブスクライバＳ１がトピックにサブスクライブした状態となり、ブローカＢ２、Ｂ４においてサブスクライバＳ２がトピックにサブスクライブした状態となる。
【００３５】
次に、図６（ｄ）に示されるように、分散連携プロキシＤ５に接続されたパブリッシャＰ１は、分散連携プロキシＤ５にパブリッシュメッセージを送信し、分散連携プロキシＤ５は、パブリッシャＰ１から受信したパブリッシュメッセージをブローカＢ５に転送する。ブローカＢ５は、パブリッシュメッセージのトピックにサブスクライバＳ１がサブスクライブしていることを検出し、パブリッシュメッセージを分散連携プロキシＤ５に転送する。分散連携プロキシＤ５は、ブローカＢ５からのパブリッシュメッセージを受信すると、自身で管理しているサブスクライバ方向に関する情報を参照して、パブリッシュメッセージを分散連携プロキシＤ４に転送する。分散連携プロキシＤ４は、分散連携プロキシＤ５から受信したパブリッシュメッセージをブローカＢ４に転送する。ブローカＢ４は、パブリッシュメッセージのトピックにサブスクライバＳ１、Ｓ２がサブスクライブしていることを検出し、パブリッシュメッセージを分散連携プロキシＤ４に転送する。分散連携プロキシＤ４は、ブローカＢ４からのパブリッシュメッセージを受信すると、自身で管理しているサブスクライバ方向に関する情報を参照して、パブリッシュメッセージをサブスクライバＳ２および分散連携プロキシＤ２に転送する。同様にして、分散連携プロキシＤ２がパブリッシュメッセージをブローカＢ２に転送し、ブローカＢ２がパブリッシュメッセージを分散連携プロキシＤ２に転送し、分散連携プロキシＤ２がパブリッシュメッセージをサブスクライバＳ１および分散連携プロキシＤ１、Ｄ３に転送し、分散連携プロキシＤ１、Ｄ２がそれぞれブローカＢ１、Ｂ３に転送する。
【００３６】
再び図３を参照して、本実施形態に係るローカル連携部３０１、リモート連携部３０２、およびブローカ連携部３０３を説明する。
ローカル連携部３０１は、クライアントＣ１からメッセージを受信すると、ブローカ連携部３０３を介してブローカＢ１にこのメッセージを送信するとともに、リモート連携部３０２にこのメッセージを渡す。この場合において、リモート連携部３０２は、クライアントＣ１からのメッセージがサブスクライブメッセージである場合には、擬似的なサブスクライバとして分散連携プロキシＤ２にこのメッセージを送信するが、クライアントＣ１からのメッセージがパブリッシャメッセージである場合には、分散連携プロキシＤ２へのメッセージ送信を行なわない。
【００３７】
リモート連携部３０２は、分散連携プロキシＤ２からサブスクライブメッセージを受信すると、ブローカ連携部３０３を介してブローカＢ１にこのサブスクライブメッセージを送信する。分散連携プロキシＤ２以外に隣接する分散連携プロキシがある場合、リモート連携部３０２は、擬似的なサブスクライバとして、当該分散連携プロキシに、分散連携プロキシＤ２から受信したサブスクライブメッセージをさらに送信する。リモート連携部３０２は、分散連携プロキシＤ２からパブリッシュメッセージを受信すると、ブローカ連携部３０３を介してブローカＢ１にこのパブリッシュメッセージを送信する。ブローカ連携部３０３は、ブローカＢ１からパブリッシュメッセージを受信すると、ローカル連携部３０１を介してクライアントＣ１にこのパブリッシュメッセージを送信するとともに、リモート連携部３０２にこのパブリッシュメッセージを渡す。リモート連携部３０２は、必要に応じて、例えば、サブスクライブ方向に関する情報を参照して、隣接する分散連携プロキシにパブリッシュメッセージを送信する。
【００３８】
次に、図７および図８を参照して、第２の実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムの動作例について説明する。
図７に示されるｐｕｂ／ｓｕｂメッセージングシステムでは、分散連携プロキシＤ１がブローカＢ１に対応して設けられ、分散連携プロキシＤ２がブローカＢ２に対応して設けられ、分散連携プロキシＤ１、Ｄ２が互いに接続されている。さらに、パブリッシャＰ１およびパブリッシャＰ２が分散連携プロキシＤ１に接続され、サブスクライバＳ１が分散連携プロキシＤ２に接続されている。
【００３９】
まず、サブスクライバＳ１が、ブローカＢ２に対して、所望するトピックにサブスクライブする。具体的には、サブスクライバＳ１が、サブスクライブメッセージを分散連携プロキシＤ２に送信し（図８のＳ８０１）、分散連携プロキシＤ２が、このサブスクライブメッセージをブローカＢ２に転送する（Ｓ８０２）。分散連携プロキシＤ２は、擬似的なサブスクライバとして、ブローカＢ２と異なるブローカに対して、上記トピックにサブスクライブする。具体的には、分散連携プロキシＤ２は、隣接する分散連携プロキシＤ１にサブスクライブメッセージを転送し（Ｓ８０３）、分散連携プロキシＤ１が、サブスクライブメッセージをブローカＢ１に転送する（Ｓ８０４）。このようにして、サブスクライブメッセージが全てのブローカＢ１、Ｂ２に伝搬される。
【００４０】
続いて、パブリッシャＰ１は、ブローカＢ１に対して、サブスクライバＳ１がサブスクライブしたものと同じトピックにパブリッシュメッセージをパブリッシュする。具体的には、パブリッシャＰ１が、指定したトピックが付与されたパブリッシュメッセージを分散連携プロキシＤ１に送信し（Ｓ８０５）、分散連携プロキシＤ１が、パブリッシュメッセージをブローカＢ１に転送する（Ｓ８０６）。ブローカＢ１は、受信したパブリッシュメッセージに関するトピックがサブスクライブされていることを検出し、分散連携プロキシＤ１にパブリッシュメッセージを転送する（Ｓ８０７）。さらに、分散連携プロキシＤ１は、擬似的なパブリッシャとして、ブローカＢ１と異なるブローカに対して、パブリッシュメッセージをパブリッシュする。具体的には、分散連携プロキシＤ１が、隣接する分散連携プロキシＤ２にパブリッシュメッセージを転送し（Ｓ８０８）、分散連携プロキシＤ２が、ブローカＢ２にパブリッシュメッセージを転送する（Ｓ８０９）。ブローカＢ２は、受信したパブリッシュメッセージに関するトピックがサブスクライブされていることを検出し、分散連携プロキシＤ２にパブリッシュメッセージを転送し（Ｓ８１０）、分散連携プロキシＤ２が、サブスクライバＳ１にパブリッシュメッセージを転送する（Ｓ８１１）。
【００４１】
さらに、パブリッシャＰ２は、ブローカＢ１に対して、サブスクライバＳ１がサブスクライブしているトピックと異なるトピックにパブリッシュメッセージをパブリッシュする。具体的には、パブリッシャＰ１が、指定したトピックが付与されたパブリッシュメッセージを分散連携プロキシＤ１に送信し（Ｓ８１２）、分散連携プロキシＤ１が、パブリッシュメッセージをブローカＢ１に転送する（Ｓ８１３）。ブローカＢ１は、受信したパブリッシュメッセージに関するトピックがいずれのサブスクライバにもサブスクライブされていないことを検出し、パブリッシュメッセージの転送を行なわない。
このように、分散連携プロキシＤ１、Ｄ２は、異なるブローカに収容されたクライアント同士が単一ブローカを用いる場合と同様に通信可能となるように、相互連携する。
【００４２】
第２の実施形態によれば、第１の実施形態と同様の効果を得ることができる。第２の実施形態に係る連携方式ＳＦＡでは、必要な分散連携プロキシに対してパブリッシュメッセージを転送すればよいので、トラフィックを低減させることができる。
【００４３】
［第３の実施形態］
第１の実施形態で説明したＰＦＡおよび第２の実施形態で説明したＳＦＡにおいては、図９を参照して以下に説明するように、分散連携プロキシがメッセージを隣接する分散連携プロキシに転送することによって無限ループが発生することがある。第３の実施形態では、無限ループを回避する方法について説明する。
【００４４】
図９に示されるｐｕｂ／ｓｕｂメッセージングシステムでは、分散連携プロキシＤ１がブローカＢ１に対応して設けられ、分散連携プロキシＤ２がブローカＢ２に対応して設けられ、分散連携プロキシＤ１、Ｄ２が互いに接続され、パブリッシャＰ１およびサブスクライバＳ１が分散連携プロキシＤ１に接続され、サブスクライバＳ２が分散連携プロキシＤ２に接続されている。ここで、パブリッシャＰ１のパブリッシュメッセージに対してサブスクライバＳ１、Ｓ２がサブスクライブしているものとする。
【００４５】
まず、パブリッシャＰ１がパブリッシュメッセージを分散連携プロキシＤ１に送信する（Ｓ９０１）。分散連携プロキシＤ１は、パブリッシュメッセージをブローカＢ１に転送し（Ｓ９０２）、ブローカＢ１は、パブリッシュメッセージを分散連携プロキシＤ１に転送する（Ｓ９０３）。分散連携プロキシＤ１は、サブスクライバＳ１にパブリッシュメッセージを転送し（Ｓ９０４−１）、さらに、隣接する分散連携プロキシＤ２にパブリッシュメッセージを転送する（Ｓ９０４−２）。続いて、分散連携プロキシＤ２は、ブローカＢ２にパブリッシュメッセージを転送する（Ｓ９０５）。ブローカＢ２は、パブリッシュメッセージを分散連携プロキシＤ２に転送する（Ｓ９０６）。分散連携プロキシＤ２は、サブスクライバＳ２にパブリッシュメッセージを転送し（Ｓ９０７−１）、さらに、隣接する分散連携プロキシＤ１にパブリッシュメッセージを転送する（Ｓ９０７−２）。そして、分散連携プロキシＤ１は、パブリッシュメッセージをブローカＢ１に再び転送する（Ｓ９０８）。以降、Ｓ９０３〜Ｓ９０８に示す手順が繰り返される。このようにして、無限ループが発生する。
【００４６】
本実施形態では、リモート連携部３０２（図３）は、隣接する分散連携プロキシからメッセージを受信したときに、当該メッセージの同一性を確認可能な情報を、当該メッセージの送信元を示す情報とともに、伝搬ログ（履歴情報ともいう）として記録し保持する。メッセージの同一性を確認可能な情報としては、例えば、クライアントまたはブローカがメッセージに付与した識別情報（ＩＤ）を用いてもよく、メッセージのハッシュ値を計算して用いてもよい。そして、リモート連携部３０２は、クライアントまたはブローカから受信したメッセージを隣接する分散連携プロキシに送信するときに、当該メッセージの同一性を確認可能な情報で伝搬ログを参照して、メッセージ送信を行なうか否かを判定する。
【００４７】
あるいは、リモート連携部３０２は、隣接する分散連携プロキシにメッセージを送信するときに、当該メッセージの同一性を確認可能な情報を、当該メッセージの送信先を示す情報とともに、伝搬ログとして記録し保持してもよい。この場合、リモート連携部３０２は、クライアントまたはブローカから受信したメッセージを隣接する分散連携プロキシに送信するときに、当該メッセージの同一性を確認可能な情報で伝搬ログを参照して、メッセージ送信を行なうか否かを判定する。
【００４８】
例えば、分散連携プロキシＤ２のリモート連携部３０２は、図９の手順Ｓ９０４−２において受信したパブリッシュメッセージのＩＤとこのパブリッシュメッセージの送信元（この例では分散連携プロキシＤ１）を示す情報とのペアを伝搬ログとして記録し保管する。分散連携プロキシＤ２のリモート連携部３０２は、手順Ｓ９０６においてブローカＢ２から受信したパブリッシュメッセージのＩＤから当該パブリッシュメッセージの伝搬ログを参照し、過去に当該パブリッシュメッセージを分散連携プロキシＤ１から受信していることを確認する。これを受けて、分散連携プロキシＤ２のリモート連携部３０２は、手順Ｓ９０７−２の実行を中止する。これにより、無限ループの発生を回避することができる。
【００４９】
以上のように、第３の実施形態によれば、リモート連携部３０２において、メッセージの同一性を確認可能な情報とメッセージの送信先を示す情報とを伝搬ログとして保管することにより、隣接する分散連携プロキシ間で同じメッセージの転送を繰り返すことが防止され、無限ループを回避することができる。
【００５０】
［他の実施形態］
一実施形態に係るｐｕｂ／ｓｕｂメッセージングシステムは、第１の実施形態に係る連携方式ＰＦＡおよび第２の実施形態に係る連携方式ＳＦＡを選択的に使用してメッセージ配信を行なう。連携方式は、例えばシステムの通信状況に応じて、ＰＦＡまたはＳＦＡに切り替えられる。ＰＦＡは、パブリッシャメッセージを、接続されている全ての分散連携プロキシに転送するので、分散連携プロキシの処理は楽になる。しかしながら、本来メッセージを必要としない分散連携プロキシにも転送を行なうことになるため、トラフィックの無駄が生じることがある。一方、ＳＦＡは、要求のあったサブスクライバが接続されている分散連携プロキシに対してパブリッシュメッセージを転送するので、トラフィックの無駄はないが、分散連携プロキシの処理が難しくなる。このため、通信が全体に対して局所的に行なわれる部分がある場合には、ＰＦＡではトラフィックの無駄が大きくなるので、ＳＦＡが選択される。
【００５１】
本発明は、上記各実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記各実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、各実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態に亘る構成要素を適宜組み合せてもよい。
【符号の説明】
【００５２】
Ｂ１〜Ｂ５…ブローカ、Ｄ１〜Ｄ５…分散連携プロキシ、Ｐ１，Ｐ２…パブリッシャ、Ｓ１，Ｓ２…サブスクライバ、Ｃ１…クライアント、３０１…ローカル連携部、３０２…リモート連携部、３０３…ブローカ連携部。
【図１】
0006539617.tif 000002
【図２】
0006539617.tif 000003
【図３】
0006539617.tif 000004
【図４】
0006539617.tif 000005
【図５】
0006539617.tif 000006
【図６】
0006539617.tif 000007
【図７】
0006539617.tif 000008
【図８】
0006539617.tif 000009
【図９】
0006539617.tif 000010