以下、本発明の実施の形態(実施形態)について説明する。以降の各実施形態では、例えばMQTT V3.1/V3.1.1等のプロトコル(すなわち、同一の処理を実行する複数のサブスクライバーの中から1つのサブスクライバーを選択する仕組みを備えていないプロトコル)を用いて送受信されるメッセージを処理するメッセージ処理システム1について説明する。なお、このようなプロトコルは、MQTT V3.1/V3.1.1以外にも、例えば、JMS1.0等が挙げられる。
[第一の実施形態]
<全体構成>
まず、本実施形態に係るメッセージ処理システム1の全体構成について、図1を参照しながら説明する。図1は、第一の実施形態に係るメッセージ処理システム1の全体構成の一例を示す図である。
図1に示すように、本実施形態に係るメッセージ処理システム1には、複数のメッセージ処理装置10と、1以上のメッセージブローカー装置20と、複数のメッセージ送信装置30と、共有情報管理装置40とが含まれる。メッセージ処理装置10とメッセージブローカー装置20とは、例えば、ネットワークや仮想的なネットワーク、プロセス間通信、内部配線等によってメッセージが送受信可能に接続される。同様に、メッセージブローカー装置20とメッセージ送信装置30とは、例えば、ネットワークや仮想的なネットワーク、プロセス間通信、内部配線等によってメッセージが送受信可能に接続される。また、同様に、メッセージ処理装置10と共有情報管理装置40は、例えば、ネットワークや仮想的なネットワーク、プロセス間通信、内部配線等によって通信可能に接続される。
メッセージ処理装置10は、Pub/Subモデルにおけるサブスクライバーとして機能する各種装置である。サブスクライバーとして機能する装置としては、例えば、アプリケーションサーバ等として機能する装置等が挙げられる。
メッセージ処理装置10は、メッセージブローカー装置20から送信(配信)されたメッセージに対して所定の処理を行う。ここで、本実施形態では、複数のメッセージ処理装置10は、同一のメッセージに対して同一の処理を行うものとする。
なお、1つの物理的な装置が1つのメッセージ処理装置10として機能する必要は必ずしもなく、例えば、1つ物理的な装置が複数のメッセージ処理装置10として機能しても良い。言い換えれば、物理的な装置をメッセージ処理装置10として機能させるプログラムが、この物理的な装置に複数インストールされていても良い。
以降では、複数のメッセージ処理装置10の各々を区別して表す場合は、「メッセージ処理装置10-1」、「メッセージ処理装置10-2」等と表す。
メッセージブローカー装置20は、Pub/Subモデルにおけるメッセージブローカーとして機能する各種装置である。メッセージブローカー装置20は、トピックが宛先に指定されたメッセージをメッセージ送信装置30から受信する。そして、メッセージブローカー装置20は、予め当該トピックの購読を登録しているメッセージ処理装置10に対して、当該メッセージを送信(配信)する。メッセージブローカーとして機能する装置としては、例えば、HUBやデータ集約サーバ、コンセントレータ等として機能する装置等が挙げられる。
なお、メッセージブローカー装置20は、例えば、メッセージ送信装置30から受信したメッセージを、トピック毎に、キュー等の記憶領域に格納した上で、この記憶領域に所定数のメッセージが格納された場合や記憶領域の容量が所定容量になった場合又は所定の時間経過後等に、この記憶領域に格納されているメッセージをメッセージ処理装置10に送信する。
メッセージ送信装置30は、Pub/Subモデルにおけるパブリッシャーとして機能する各種装置である。パブリッシャーとして機能する装置としては、例えば、各種センサやエッジデバイス、PLC(Programmable Logic Controller)や各種コントローラ等の制御装置等が挙げられる。
メッセージ送信装置30は、例えば、トピックを宛先に指定したメッセージをメッセージブローカー装置20に送信する。このメッセージには、メッセージ送信装置30に応じた種々のデータ(例えば、センシング対象をセンシングしたデータ、操作対象に対する操作ログデータ等)が含まれる。
共有情報管理装置40は、各メッセージ処理装置10が参照する情報を管理する装置である。共有情報管理装置40は、例えば、データベースサーバやネットワークストレージサーバ、共有メモリとして機能する装置等により実現される。
各メッセージ処理装置10は、共有情報管理装置40で管理されている情報を参照することで、メッセージブローカー装置20から受信したメッセージを自身で処理するか否かを判定する。
すなわち、例えば、或るトピックの購読を登録しているメッセージ処理装置10が複数存在する場合、メッセージブローカー装置20は、当該トピックが宛先に指定されたメッセージを、これら複数のメッセージ処理装置10に送信(配信)する。そこで、本実施形態では、これら複数のメッセージ処理装置10それぞれが当該メッセージを自身で処理するか否かを判定することで、これら複数のメッセージ処理装置10のうちの1つのメッセージ処理装置10のみが当該メッセージを処理するように制御する。
これにより、本実施形態に係るメッセージ処理システム1では、複数のメッセージ処理装置10間で複数のメッセージを分散して処理することができるようになる。より具体的には、例えば、複数のメッセージ処理装置10がそれぞれ複数のトピックの購読を登録している場合、或るトピックのメッセージについてはメッセージ処理装置10-1が処理し、他の或るトピックのメッセージについてはメッセージ処理装置10-2が処理する等のように、メッセージを処理するメッセージ処理装置10を分散させることができる。
また、上記のように、複数のメッセージ処理装置10のうちの1つのメッセージ処理装置10のみがメッセージを処理することで、例えば、同一のメッセージが複数のメッセージ処理装置10により処理されてしまい、意図しない処理結果となってしまう事態を防止することができる。
このように、本実施形態に係るメッセージ処理システム1では、複数のメッセージについて、メッセージの処理結果の整合性を確保しつつ、複数のメッセージ処理装置10間でメッセージ処理を分散させる。また、このようなメッセージ処理の分散によって、複数のメッセージ処理装置10で異なるメッセージの処理を並列に行うことができるようになる。したがって、本実施形態に係るメッセージ処理システム1によれば、システム全体で高い処理性能(例えば、単位時間あたりのメッセージ処理数)を確保することができるようになる。
<ハードウェア構成>
次に、本実施形態に係るメッセージ処理装置10及び共有情報管理装置40のハードウェア構成について説明する。これらの装置は、例えば、図2に示すコンピュータ600のハードウェア構成により実現される。図2は、コンピュータ600のハードウェア構成の一例を示す図である。
図2に示すコンピュータ600は、入力装置601と、表示装置602と、外部I/F603と、通信I/F604と、ROM(Read Only Memory)605と、RAM(Random Access Memory)606と、CPU(Central Processing Unit)607と、記憶装置608とを有する。これら各ハードウェアは、それぞれがバス609で通信可能に接続されている。
入力装置601は、キーボードやマウス、タッチパネル、各種ボタン等であり、ユーザが各種操作を入力するのに用いられる。表示装置602は、例えばディスプレイ等であり、処理結果等を表示する。なお、コンピュータ600は、入力装置601及び表示装置602のうちの少なくとも一方を有していなくても良い。
外部I/F603は、外部装置とのインタフェースである。外部装置には、記録媒体603a等がある。コンピュータ600は、記録媒体603a等の読み取りや書き込み等を行うことができる。記録媒体603aには、例えば、フレキシブルディスク、CD、DVD、SDメモリカード、USBメモリ等がある。
通信I/F604は、コンピュータ600が他の装置と通信するためのインタフェースである。ROM605は、電源を切ってもプログラムやデータを保持することができる不揮発性の半導体メモリである。ROM605には、例えば、OS(Operating System)設定やネットワーク設定等が格納されている。RAM606は、プログラムやデータを一時保持する揮発性の半導体メモリである。
CPU607は、ROM605や記憶装置608等からプログラムやデータをRAM606上に読み出し、処理を実行することで、コンピュータ600全体の制御や機能を実現する演算装置である。
記憶装置608は、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のメモリであり、プログラムやデータを格納している。記憶装置608に格納されるプログラムやデータには、コンピュータ600全体を制御する基本ソフトウェアであるOS、OS上において各種機能を提供するアプリケーションプログラム等がある。なお、記憶装置608は、格納しているプログラムやデータを所定のファイルシステムやDB(デーベース)等により管理している。
本実施形態に係るメッセージ処理装置10及び共有情報管理装置40は、例えば図2に示すコンピュータ600のハードウェア構成により、後述する各種処理を実現することができる。なお、本実施形態に係るメッセージ処理装置10及び共有情報管理装置40は、例えば、複数台のコンピュータ600を組み合わせたハードウェア構成により実現されていても良い。
(実施例1)
以降では、本実施形態に係るメッセージ処理システム1の実施例1について説明する。
<機能構成>
まず、実施例1におけるメッセージ処理システム1の機能構成について、図3を参照しながら説明する。図3は、第一の実施形態に係るメッセージ処理システム1の機能構成の一例を示す図(実施例1)である。
図3に示すように、実施例1におけるメッセージ処理装置10は、メッセージ送受信部110と、実行制御部120と、メッセージ処理部130とを有する。これら各部は、メッセージ処理装置10にインストールされた1以上のプログラムがCPUに実行させる処理により実現される。
メッセージ送受信部110は、例えばMQTT V3.1/V3.1.1等のプロトコルに従って、メッセージの送受信を行う。すなわち、メッセージ送受信部110は、トピックの購読を登録するためのメッセージ(購読登録メッセージ)をメッセージブローカー装置20に送信する。購読登録メッセージには、購読対象のトピックと、自身を識別する識別情報(すなわち、このトピックを購読するメッセージ処理装置10の装置ID等)とが指定される。
また、メッセージ送受信部110は、メッセージブローカー装置20から配信されたメッセージを受信する。なお、上述したように、メッセージブローカー装置20は、メッセージ送信装置30から受信したメッセージを、このメッセージのトピックの購読を登録しているメッセージ処理装置10に配信する。
実行制御部120は、メッセージ送受信部110によりメッセージが受信された場合、共有情報管理装置40で管理される情報(後述する処理調整情報1000)を参照して、当該メッセージを処理するか否かを判定する。
また、実行制御部120は、当該メッセージを処理しないと判定した場合(すなわち、当該メッセージが他のメッセージ処理装置10により処理される場合)、共有情報管理装置40で管理される情報(後述する処理管理情報2000)を参照して、他のメッセージ処理装置10による処理が完了したか否かを判定する。そして、実行制御部120は、当該他のメッセージ処理装置10による処理が完了せずに所定の時間経過した場合(すなわち、例えば、他のメッセージ処理装置10に障害等が発生し、当該メッセージの処理が完了しなかった場合)、当該他のメッセージ処理装置10以外のメッセージ処理装置10により当該メッセージが処理されるように制御する。
メッセージ処理部130は、実行制御部120によりメッセージを処理すると判定された場合、当該メッセージに応じた処理を行う。
なお、メッセージに対する処理(メッセージ処理)の処理内容は、メッセージ処理システム1の種類やメッセージの内容等によって異なるが、例えば、メッセージに含まれるデータを加工する、メッセージに含まれるデータ(又は当該加工後のデータ)を所定のDBサーバに格納する、メッセージに含まれるデータから何等かの判定を行った上で当該判定結果を所定の装置に通知する等が挙げられる。
図3に示すように、実施例1における共有情報管理装置40は、記憶部410を有する。当該記憶部は、例えば、記憶装置等を用いて実現可能である。
記憶部410には、処理調整情報1000と、処理管理情報2000とが記憶されている。
ここで、処理調整情報1000の詳細について、図4を参照しながら説明する。図4は、処理調整情報1000の一例を示す図(実施例1)である。
図4に示すように、処理調整情報1000は、1以上のレコードで構成される。また、各レコードには、トピックIDと、装置IDと、優先度と、稼働状態とが含まれる。
トピックIDは、トピックを識別する識別情報である。処理調整情報1000を構成する各レコードは、トピックIDによって特定される。
装置IDは、当該トピックIDにより識別されるトピックを購読登録しているメッセージ処理装置10を識別する識別情報である。優先度は、当該トピックIDにより識別されるトピックのメッセージを処理するメッセージ処理装置10の優先度である。稼働状態は、当該装置IDの稼働状態(例えば、メッセージ処理装置10が稼働していることを示す「稼働」、メッセージ処理装置10が停止していることを示す「停止」等)である。
例えば、図4に示す例では、トピックID「T001」のレコードには、装置ID「D001」、「D002」、「D003」が含まれ、これらの装置IDには、それぞれ優先度「1」、「2」、「3」と稼働状態「稼働」、「稼働」、「稼働」とが対応付けられている。これは、装置ID「D001」、「D002」、「D003」のメッセージ処理装置10は、トピックID「T001」のトピックを購読しており、これらのメッセージ処理装置10の優先度はそれぞれ「1」、「2」、「3」であり、かつ、これらのメッセージ処理装置10の稼働状態は全て「稼働」であることを示している。この場合、これらのメッセージ処理装置10に対して、トピックID「T001」のトピックが指定されたメッセージが配信されると、例えば、最も優先度が高い優先度「1」のメッセージ処理装置10(装置ID「D001」のメッセージ処理装置10)が当該メッセージを処理することになる。
また、例えば、図4に示す例では、トピックID「T002」のレコードには、装置ID「D001」、「D002」、「D004」が含まれ、これらの装置IDには、それぞれ優先度「2」、「3」、「1」と稼働状態「稼働」、「停止」、「稼働」とが対応付けられている。これは、装置ID「D001」、「D002」、「D004」のメッセージ処理装置10は、トピックID「T002」のトピックを購読しており、これらのメッセージ処理装置10の優先度はそれぞれ「2」、「3」、「1」であり、かつ、これらのメッセージ処理装置10の稼働状態はそれぞれ「稼働」、「停止」、「稼働」であることを示している。この場合、これらのメッセージ処理装置10に対して、トピックID「T002」のトピックが指定されたメッセージが配信されると、例えば、最も優先度が高い優先度「1」のメッセージ処理装置10(装置ID「D004」のメッセージ処理装置10)が当該メッセージを処理することになる。
このように、処理調整情報1000は、トピック毎に、当該トピックのメッセージを処理すべきメッセージ処理装置10の優先度等が含まれる情報である。各メッセージ処理装置10は、処理調整情報1000の優先度等を参照することで、自身がメッセージを処理するか否かを判定することができる。
なお、図4では、トピックID毎のレコードが含まれる処理調整情報1000を示したが、これに限られず、例えば、メッセージを識別する識別情報をメッセージIDとして、処理調整情報1000は、トピックID及びメッセージID毎のレコードが含まれていても良い。これにより、同一トピックに属する異なるメッセージに対して異なる優先度を設定することができるようになる。
次に、処理管理情報2000について、図5を参照しながら説明する。図5は、処理管理情報2000の一例を示す図(実施例1)である。
図5に示すように、処理管理情報2000は、1以上のレコードで構成される。また、各レコードには、トピックIDと、メッセージIDと、装置IDと、実行状態とが含まれる。
トピックIDは、トピックを識別する識別情報である。メッセージIDは、当該トピックのメッセージを識別する識別情報である。処理管理情報2000を構成する各レコードは、トピックIDとメッセージIDとの組(又は、メッセージIDが全トピックで一意である場合には、メッセージID)によって特定される。
装置IDは、当該メッセージ処理を実行しているメッセージ処理装置10の装置IDである。実行状態は、当該メッセージ処理の実行状態(例えば、メッセージ処理が実行中であることを示す「実行中」、メッセージ処理が完了したことを示す「完了」等)である。
例えば、図5に示す例では、トピックID「T001」及びメッセージID「M001」のレコードには、装置ID「D001」と、実行状態「実行中」とが含まれる。これは、トピックID「T001」及びメッセージID「M001」で特定されるメッセージ処理は、装置ID「D001」のメッセージ処理装置10で実行され、その実行状態は「実行中」であることを示している。
また、例えば、図5に示す例では、トピックID「T002」及びメッセージID「M010」のレコードには、装置ID「D005」と、実行状態「完了」とが含まれる。これは、トピックID「T002」及びメッセージID「M010」で特定されるメッセージ処理は、装置ID「D005」のメッセージ処理装置10で実行され、その実行状態は「完了」であることを示している。
このように、処理管理情報2000は、トピックID及びメッセージID毎(又はメッセージID毎)に、メッセージ処理を行っているメッセージ処理装置10の装置IDと、当該メッセージ処理の実行状態とが含まれる情報である。各メッセージ処理装置10は、処理管理情報2000の実行状態等を参照することで、他のメッセージ処理装置10が実行している処理が完了したか否かを判定することができる。
<メッセージ処理装置が実行する処理(メッセージ処理の実行制御処理)>
次に、実施例1におけるメッセージ処理装置10が実行する処理(メッセージ処理の実行制御処理)について、図6を参照しながら説明する。図6は、第一の実施形態に係るメッセージ処理装置が実行する処理(メッセージ処理の実行制御処理)の一例を示すフローチャート(実施例1)である。
まず、メッセージ処理装置10のメッセージ送受信部110は、購読登録メッセージをメッセージブローカー装置20に送信する(ステップS101)。購読登録メッセージには、購読対象のトピックと、このトピックを購読するメッセージ処理装置10の装置IDとが指定される。これにより、メッセージブローカー装置20には、メッセージ処理装置10の装置IDと、このメッセージ処理装置10が購読するトピックのトピックIDとが対応付けて登録される。
なお、メッセージ送受信部110は、例えば、メッセージ処理装置10が電源投入により起動された場合やメッセージ送受信を行うためのアプリケーションが起動された場合、トピックの購読登録がユーザにより指示された場合等に、購読登録メッセージをメッセージブローカー装置20に送信する。また、購読登録メッセージに指定されるトピック(購読対象トピック)は、予め設定されていても良いし、ユーザにより指定されても良い。
次に、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS102)。例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10の装置IDが含まれる場合、実行制御部120は、この装置IDに対応付けられている稼働状態を「稼働」に変更する。一方で、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10の装置IDが含まれない場合、実行制御部120は、当該レコードに対して、この装置IDと、優先度と、稼働状態「稼働」とを追加する。なお、優先度としては、任意の優先度を追加すれば良い。例えば、ランダムに決定された優先度が追加されても良いし、最も低い優先度を追加されても良いし、最も高い優先度が追加されても良いし、ユーザにより指定された優先度が追加されても良い。
以上のステップS101~ステップS102の処理が実行されることで、購読を登録したトピックのメッセージがメッセージブローカー装置20からメッセージ処理装置10に配信されるようになる。なお、例えば、購読対象のトピックを追加したい場合にも、メッセージ処理装置10は、上記のステップS101~ステップS102の処理を実行することで、購読対象のトピックを追加することができる。また、例えば、メッセージ処理装置10は、上記のステップS101の処理の代わりに購読解除の処理を行った後、ステップS102の処理を実行することで、購読対象のトピックを削除することができる。更に、例えば、メッセージ処理装置10は、購読解除の処理を行った後に、上記のステップS101~ステップS102の処理を実行することで、購読対象のトピックを変更することができる。
メッセージ処理装置10のメッセージ送受信部110は、メッセージブローカー装置20からメッセージを受信するまで待機する(ステップS103でNO)。そして、メッセージブローカー装置20からのメッセージをメッセージ送受信部110が受信した場合(ステップS103でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を参照して、当該メッセージを処理するか否かを判定する(ステップS104)。
ここで、実行制御部120は、例えば、処理調整情報1000に含まれるレコードのうち、当該メッセージのトピックに対応するレコードを特定する。そして、実行制御部120は、このレコードにおいて、自身の装置IDに対応付けられている優先度が最も高い場合、当該メッセージを処理すると判定する。一方で、実行制御部120は、自身の装置IDに対応付けられている優先度が最も高いとはいえない場合、当該メッセージを処理しないと判定する。
当該メッセージを処理すると判定された場合(ステップS104でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を更新する(ステップS105)。例えば、実行制御部120は、当該メッセージのトピックを示すトピックIDと、当該メッセージを示すメッセージIDと、自身の装置IDと、実行状態「実行中」とが含まれるレコードを処理管理情報2000に追加する。これにより、当該メッセージ処理装置10で当該メッセージに対する処理が実行されていることが管理される。
なお、当該トピックIDと当該メッセージIDとが含まれるレコードが処理管理情報2000に既に存在する場合、実行制御部120は、当該レコードの装置IDを、自身の装置IDに更新する。これは、他のメッセージ処理装置10によりメッセージ処理の実行が開始されたものの、障害等により完了前に実行されなくなったメッセージ処理と同一のメッセージ処理を実行する場合に該当する。
次に、メッセージ処理装置10のメッセージ処理部130は、メッセージ送受信部110が受信したメッセージに対する処理(メッセージ処理)を行う(ステップS106)。
上記のステップS106のメッセージ処理が完了した場合、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を更新する(ステップS107)。例えば、実行制御部120は、上記のステップS105で処理管理情報2000に追加したレコードの実行状態を「完了」に更新する。これにより、当該メッセージ処理が完了したことが管理される。
そして、メッセージ処理装置10は、上記のステップS103に戻る。すなわち、メッセージ処理装置10は、メッセージブローカー装置20からメッセージを受信するまで待機する。
一方で、上記のステップS104で当該メッセージを処理しないと判定された場合(ステップS104でNO)、当該メッセージは、他のメッセージ処理装置10によって処理される。すなわち、当該他のメッセージ処理装置10が上記のステップS105~ステップS107を実行することになる。
そこで、この場合、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を参照して、該当のメッセージ処理(すなわち、当該他のメッセージ処理装置10が実行しているメッセージ処理)が完了したか否かを判定する(ステップS108)。このとき、実行制御部120は、例えば、メッセージ送受信部110が受信したメッセージのトピックを示すトピックIDと、当該メッセージを示すメッセージIDとが含まれるレコードの実行状態を参照し、この実行状態が「完了」であるか否かを判定すれば良い。
そして、該当のメッセージ処理が完了したと判定した場合(ステップS108でYES)、メッセージ処理装置10は、上記のステップS103に戻る。一方で、該当のメッセージ処理が完了したと判定されなかった場合(ステップS108でNO)、メッセージ処理装置10の実行制御部120は、メッセージ送受信部110がメッセージを受信してから所定の時間が経過したか否かを判定する(ステップS109)。これは、所定の時間が経過した場合、他のメッセージ処理装置10に障害等が発生し、メッセージ処理が完了しなかった(メッセージ処理が失敗した)可能性が高いためである。なお、このような所定の時間の時間幅は、メッセージ処理の対象となるメッセージの長さによって異ならせることが好ましい。このため、メッセージの長さに応じて、当該時間幅が決定されても良い。
所定の時間が経過していないと判定された場合(ステップS109でNO)、メッセージ処理装置10は、上記のステップS108に戻る。すなわち、メッセージ処理装置10は、当該メッセージ処理の実行状態が「完了」となるか又は所定の時間が経過するまで、処理管理情報2000を繰り返し参照する。
一方で、所定の時間が経過したと判定された場合(ステップS109でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS110)。例えば、実行制御部120は、処理調整情報1000に含まれるレコードのうち、当該メッセージのトピックを示すトピックIDが含まれるレコードを特定し、特定したレコードに含まれる装置IDのうち、当該他のメッセージ処理装置10の装置IDに対応付けられている稼働状態を「停止」に更新すると共に、優先度を最も低くする。このように、実行制御部120は、メッセージ処理を行った他のメッセージ処理装置10で障害等が発生した場合、当該他のメッセージ処理装置10の稼働状態を「停止」に変更すると共に、当該他のメッセージ処理装置10の優先度を最も低くする(これに合せて、優先度を最も低くしたメッセージ処理装置10以外のメッセージ処理装置10の優先度を高くする。)。これにより、当該他のメッセージ処理装置10では、メッセージ処理が行われなくなる。また、当該他のメッセージ処理装置10の優先度を最も低くすることで、例えば、障害等から一時的に復旧したとしても、メッセージ処理が実行される事態を防止することができる。
そして、メッセージ処理装置10は、上記のステップS104に戻る。すなわち、メッセージ処理装置10の実行制御部120は、更新後の処理調整情報1000を参照して、当該メッセージを処理するか否かを判定する。これにより、例えば、稼働状態が「稼働」であるメッセージ処理装置10であって、最も優先度が高いメッセージ処理装置10により当該メッセージが処理される。
このように、或るメッセージ処理装置10-1でのメッセージ処理が障害等により失敗した場合、この或るメッセージ処理装置10-1とは異なるメッセージ処理装置10(例えば、メッセージ処理装置10-2)で同一のメッセージに対するメッセージ処理が実行される。ここで、メッセージ処理装置10-2は、メッセージ処理装置10-1で処理されていたメッセージを最初から処理しても良いが、メッセージ処理の内容によっては、メッセージ処理装置10-1で実行されたメッセージ処理を途中から引き継いでも良い。例えば、図7に示すように、メッセージ処理装置10-1がメッセージを60%まで処理したところで障害等により停止したものとする。この場合、メッセージ処理装置10-2は、このメッセージの60%以降の残りのメッセージに対する処理を実行しても良い。このような引き継ぎを行えるメッセージ処理としては、例えば、メッセージに含まれる各データをDBサーバに格納する処理やメッセージに含まれる各データをそれぞれ加工する処理等が挙げられる。
なお、上記のステップS110は、同一トピックを購読している複数のメッセージ処理装置10のうち、メッセージ処理を実行し障害等が発生した他のメッセージ処理装置10以外の複数のメッセージ処理装置10によって実行される場合がある。このため、上記のステップS110は、例えば、当該他のメッセージ処理装置10以外の複数のメッセージ処理装置10のうち、最も優先度が高いメッセージ処理装置10のみが実行したり、最初にステップS110の処理を実行したメッセージ処理装置10のみが実行したりする等、1台のメッセージ処理装置10のみが実行することが好ましい。
なお、上記のステップS103~ステップS111の処理は、マルチスレッド等によって1つのメッセージ処理装置10内で並列に実行されても良い。例えば、2つのスレッドを用いる場合、第1のスレッドによるステップS103~ステップS111の処理と、第2のスレッドによるステップS103~ステップS111の処理とが1つのメッセージ処理装置10内で並列に実行されても良い。
以上のように、本実施形態に係るメッセージ処理システム1では、同一トピックを購読しているメッセージ処理装置10のうち、稼働状態が「稼働」であり、かつ、優先度が最も高いメッセージ処理装置10が当該トピックのメッセージを処理する。また、本実施形態に係るメッセージ処理システム1では、メッセージを処理しているメッセージ処理装置10に障害等が発生し、メッセージ処理が完了しない場合には、このメッセージ処理装置10の稼働状態を「停止」に更新する。
これにより、本実施形態に係るメッセージ処理システム1は、メッセージ処理の不整合や漏れ等を防止しつつ、複数のメッセージ処理装置10間でメッセージ処理を分散することができる。
(実施例2)
以降では、本実施形態に係るメッセージ処理システム1の実施例2について説明する。実施例1では、或る1時点の時刻を考えた場合に、1つのメッセージを処理するメッセージ処理装置10は1台であった。しかしながら、メッセージ処理の内容によっては、1つのメッセージを複数のメッセージ処理装置10で並列に処理することができる場合がある。
そこで、実施例2では、1つのメッセージを複数のメッセージ処理装置10で処理する場合について説明する。これにより、例えば、大量のデータが含まれるようなメッセージに対する処理を複数のメッセージ処理装置10で並列に処理することができ、効率的なメッセージ処理を行うことができるようになる。このような並列処理が可能なメッセージとしては、例えば、メッセージに含まれる各データをDBサーバに格納する処理やメッセージに含まれる各データをそれぞれ加工する処理等が挙げられる。
なお、実施例2では、主に、実施例1との相違点について説明し、実施例1と同様の構成要素については、適宜、その説明を省略する。
<機能構成>
まず、実施例2におけるメッセージ処理システム1の機能構成について、図8を参照しながら説明する。図8は、第一の実施形態に係るメッセージ処理システム1の機能構成の一例を示す図(実施例2)である。
図8に示すように、実施例2における共有情報管理装置40の記憶部410には、更に、処理割当情報3000が記憶されている。
ここで、処理割当情報3000の詳細について、図9を参照しながら説明する。図9は、処理割当情報3000の一例を示す図(実施例2)である。
図9に示すように、処理割当情報3000は、1以上のレコードで構成される。また、各レコードには、トピックIDと、メッセージIDと、分割メッセージIDと、優先度と、割当範囲とが含まれる。
トピックIDは、トピックを識別する識別情報である。メッセージIDは、当該トピックのメッセージを識別する識別情報である。処理割当情報3000を構成する各レコードは、トピックIDとメッセージIDとの組(又は、メッセージIDが全トピックで一意である場合には、メッセージID)によって特定される。
分割メッセージIDは、後述する割当範囲を識別する識別情報である。優先度は、後述する割当範囲が割り当てられる優先度である。割当範囲は、メッセージに含まれるデータのうち、当該優先度のメッセージ処理装置10に割り当てられるデータの範囲である。割当範囲は、例えば、データの位置等で指定される。具体的には、例えば、メッセージに含まれるデータが全部で300バイト存在する場合、優先度「1」は先頭0バイト目~99バイト目、優先度「2」は先頭100バイト目~199バイト目、優先度「3」は先頭200バイト目~299バイト目等である。これにより、1つのメッセージを、優先度「1」~優先度「3」の3つのメッセージ処理装置10で並列処理することができるようになる。
このように、処理割当情報3000は、トピックID及びメッセージID毎(又はメッセージID毎)に、1つのメッセージが並列処理されるための割当範囲が含まれる情報である。各メッセージ処理装置10は、処理割当情報3000の優先度及び割当範囲を参照することで、自身が当該割当範囲のメッセージ処理を実行するか否かを判定することができる。なお、上述したように、実施例2では、各メッセージ処理装置10は、自身の優先度に対応する割当範囲のメッセージ処理を実行する。このため、実施例2でも「優先度」との名称を用いているが、実施例2では、メッセージ処理の優先順とは関係がない。したがって、実施例2では、「優先度」の代わりに、例えば、「割当番号」等の名称が用いられても良い。また、この割当番号としては、装置IDが用いられても良い。
また、実施例2では、処理管理情報2000が異なる。そこで、実施例2における処理管理情報2000について、図10を参照しながら説明する。図10は、処理管理情報2000の一例を示す図(実施例2)である。
図10に示すように、実施例2における処理管理情報2000を構成する各レコードには、更に、分割メッセージIDが含まれる。分割メッセージIDは、上述した通りである。
このように、実施例2における処理管理情報2000は、分割メッセージIDと装置IDと実行状態とが対応付けられることで、割当範囲に対するメッセージ処理の実行状態を管理することができる。各メッセージ処理装置10は、処理管理情報2000の分割メッセージID及び実行状態等を参照することで、当該分割メッセージIDにより識別される割当範囲に対するメッセージ処理が完了したか否かを判定することができる。
<メッセージ処理装置が実行する処理(メッセージ処理の実行制御処理)>
次に、実施例2におけるメッセージ処理装置10が実行する処理(メッセージ処理の実行制御処理)について、図11を参照しながら説明する。図11は、第一の実施形態に係るメッセージ処理装置が実行する処理(メッセージ処理の実行制御処理)の一例を示すフローチャート(実施例2)である。なお、図11のステップS201~ステップS203は、図6のステップS101~ステップS103と同様であるため、その説明を省略する。以降の図11の説明では、1つのメッセージのメッセージIDに対応する分割メッセージIDの数に対して、当該メッセージのトピックを購読しているメッセージ処理装置10の数は十分多い(例えば、分割メッセージIDの数が数個~十数個であるのに対して、当該メッセージのトピックを購読しているメッセージ処理装置10の数は少なくとも十数台である)ものとして説明する。
メッセージブローカー装置20からのメッセージをメッセージ送受信部110が受信した場合(ステップS203でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000及び処理割当情報3000を参照して、当該メッセージを処理するか否かを判定する(ステップS204)。
ここで、実行制御部120は、例えば、処理調整情報1000に含まれるレコードうち、当該メッセージのトピックに対応するレコードを特定した上で、更に、このレコードにおいて、自身の装置IDに対応付けられている優先度を特定する。そして、実行制御部120は、処理割当情報3000に含まれるレコードうち、当該トピック及び当該メッセージ対応するレコードに、特定した優先度が含まれる場合、当該メッセージを処理すると判定する。一方で、実行制御部120は、当該レコードに、特定した優先度が含まれない場合、当該メッセージを処理しないと判定する。
当該メッセージを処理すると判定された場合(ステップS204でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を更新する(ステップS205)。例えば、実行制御部120は、当該メッセージのトピックを示すトピックIDと、当該メッセージを示すメッセージIDと、上記のステップS204で特定した優先度に対応する分割メッセージIDと、自身の装置IDと、実行状態「実行中」とが含まれるレコードを処理管理情報2000に追加する。これにより、当該メッセージ処理装置10で当該メッセージの割当範囲に対する処理が実行されていることが管理される。
なお、当該トピックIDと当該メッセージIDと当該分割メッセージIDとが含まれるレコードが処理管理情報2000に既に存在する場合、実行制御部120は、当該レコードの装置IDを、自身の装置IDに更新する。これは、他のメッセージ処理装置10により当該割当範囲に対するメッセージ処理の実行が開始されたものの、障害等により完了前に実行されなくなったメッセージ処理と同一のメッセージ処理を実行する場合に該当する。
次に、メッセージ処理装置10のメッセージ処理部130は、メッセージ送受信部110が受信したメッセージの割当範囲に対する処理(メッセージ処理)を行う(ステップS206)。
上記のステップS206のメッセージ処理が完了した場合、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を更新する(ステップS207)。例えば、実行制御部120は、上記のステップS205で処理管理情報2000に追加したレコードの実行状態を「完了」に更新する。これにより、当該割当範囲に対するメッセージ処理が完了したことが管理される。そして、メッセージ処理装置10は、上記のステップS208に進む。
一方で、上記のステップS204で当該メッセージを処理しないと判定された場合(ステップS204でNO)又はステップS207に続いて、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理管理情報2000を参照して、他のメッセージ処理装置10に割り当てられた割当範囲に対するメッセージ処理が全て完了したか否かを判定する(ステップS208)。このとき、実行制御部120は、例えば、メッセージ送受信部110が受信したメッセージのトピックを示すトピックIDと、当該メッセージを示すメッセージIDとが含まれる全てのレコードの実行状態を参照し、これらの全てのレコードの実行状態が「完了」であるか否かを判定すれば良い。
そして、他のメッセージ処理装置10に割り当てられた割当範囲に対するメッセージ処理が全て完了したと判定した場合(ステップS208でYES)、メッセージ処理装置10は、ステップS203に戻る。一方で、他のメッセージ処理装置10に割り当てられた割当範囲に対するメッセージ処理が全て完了したと判定されなかった場合(ステップS208でNO)、メッセージ処理装置10の実行制御部120は、メッセージ送受信部110がメッセージを受信してから所定の時間が経過したか否かを判定する(ステップS209)。
所定の時間が経過していないと判定された場合(ステップS209でNO)、メッセージ処理装置10は、上記のステップS208に戻る。すなわち、メッセージ処理装置10は、他のメッセージ処理装置10に割り当てられた割当範囲に対するメッセージ処理の全ての実行状態が「完了」となるか又は所定の時間が経過するまで、処理管理情報2000を繰り返し参照する。
一方で、所定の時間が経過したと判定された場合(ステップS209でYES)、メッセージ処理装置10の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000及び処理割当情報3000を更新する(ステップS210)。例えば、実行制御部120は、処理調整情報1000に含まれるレコードのうち、当該メッセージのトピックを示すトピックIDが含まれるレコードを特定し、特定したレコードに含まれる装置IDのうち、当該他のメッセージ処理装置10の装置IDに対応付けられている稼働状態を「停止」に更新すると共に、優先度を、当該メッセージの割当範囲に対応付けられている優先度以外の優先度に変更する。また、実行制御部120は、自身の装置IDが対応付けられている優先度を、当該メッセージの割当範囲に対応付けられている優先度のうち、実行状態が「実行中」である分割メッセージIDの割当範囲に対応付けられている優先度に変更する。
そして、メッセージ処理装置10は、上記のステップS204に戻る。すなわち、メッセージ処理装置10の実行制御部120は、更新後の処理調整情報1000と、処理割当情報3000とを参照して、当該メッセージを処理するか否かを判定する。これにより、例えば、稼働状態が「稼働」であるメッセージ処理装置10であって、変更後の優先度に対応するメッセージ処理装置により、当該メッセージにおける処理が完了していない割当範囲が処理される。
以上のように、本実施形態に係るメッセージ処理システム1では、1つのメッセージを複数のメッセージ処理装置10で並列して処理することができる。これにより、例えば、1つのメッセージに大量のデータが含まれている場合(すなわち、メッセージの長さが長い場合)等に、複数のメッセージ処理装置10で並列して処理し、効率的なメッセージ処理を行うことができるようになる。
[第二の実施形態]
次に、第二の実施形態について説明する。第一の実施形態に係るメッセージ処理システム1では、例えば、同一のトピックを購読しているサブスクライバー(メッセージ処理装置10)が高負荷状態となっていたり、異常の発生により停止状態となっていたりした場合等には、このトピック宛のメッセージ処理が遅れたり、停止したりしてしまうことがあった。また、これとは逆に、例えば、同一のトピックを購読しているサブスクライバーが全体的に低負荷状態である場合等には、優先度の低いメッセージ処理装置10はメッセージ処理を行うことなく起動したままの状態となり、物理サーバの消費電力に無駄が生じることがあった。更に、この場合、外部のクラウドサービス等によってメッセージ処理装置10を実現しているときには、例えばクラウドサービスの利用時間に応じた費用等に無駄が生じることがあった。
そこで、第二の実施形態では、同一のトピックを購読しているサブスクライバーが高負荷状態となったり、停止状態となったりした場合には当該トピックを購読するサブスクライバーを追加する一方で、同一のトピックを購読しているサブスクライバーが全体的に低負荷状態である場合等には当該トピックを購読するサブスクライバーを削減するメッセージ処理システム1について説明する。
なお、第二の実施形態では、主に、第一の実施形態との相違点について説明し、第一の実施形態と同様の構成要素については、適宜、その説明を省略する。
<全体構成>
まず、本実施形態に係るメッセージ処理システム1の全体構成について、図12を参照しながら説明する。図12は、第二の実施形態に係るメッセージ処理システム1の全体構成の一例を示す図である。
図12に示すように、本実施形態に係るメッセージ処理システム1には、更に、購読制御装置50が含まれる。購読制御装置50は、例えば、ネットワークや仮想的なネットワーク、プロセス間通信、内部配線等により、メッセージブローカー装置20及び共有情報管理装置40と通信可能に接続される。
購読制御装置50は、同一のトピックを購読しているメッセージ処理装置10の負荷状態や停止状態(異常発生による停止状態)に応じて、当該トピックを購読するメッセージ処理装置10を追加又は削減するための制御を行う。なお、購読制御装置50のハードウェア構成は、例えば、図2に示すコンピュータ600のハードウェア構成により実現される。
<機能構成>
次に、本実施形態に係るメッセージ処理システム1の機能構成について、図13を参照しながら説明する。図13は、第二の実施形態に係るメッセージ処理システム1の機能構成の一例を示す図である。
図13に示すように、本実施形態に係る購読制御装置50は、メッセージ送受信部510と、リソース監視部520とを有する。これら各部は、購読制御装置50にインストールされた1以上のプログラムCPUに実行させる処理により実現される。
メッセージ送受信部510は、メッセージ処理装置10に異常が発生したことを示す異常通知メッセージを購読するための購読登録メッセージをメッセージブローカー装置20に送信する。
また、メッセージ送受信部510は、異常通知メッセージをメッセージブローカー装置20から受信した場合や高負荷状態を検知した場合等に、例えば起動されていないメッセージ処理装置10に対して、当該メッセージ処理装置10を起動させるためのメッセージ(起動依頼メッセージ)と、トピックの購読登録を依頼するメッセージ(購読登録依頼メッセージ)とを送信する。一方で、メッセージ送受信部510は、同一のトピックを購読しているメッセージ処理装置10で低負荷状態を検知した場合等に、例えば優先度の最も低いメッセージ処理装置10のトピックの購読解除を依頼するメッセージ(購読解除メッセージ)と、当該メッセージ処理装置10の稼働を停止させるためのメッセージ(稼働停止メッセージ)とを送信する。
リソース監視部520は、共有情報管理装置40の記憶部410に記憶されているリソース情報4000を参照して、同一のトピックを購読しているメッセージ処理装置10のリソース使用量を監視する。ここで、リソース情報4000には、例えば、トピック毎に、当該トピックを購読しているメッセージ処理装置10のリソース使用量が格納されている。リソース使用量としては、例えば、CPU使用量(又はCPU使用率)やネットワーク使用量等が挙げられる。
そして、リソース監視部520は、例えば、同一のトピックを購読しているメッセージ処理装置10のリソース使用量の合計が、予め設定された第1の閾値を超えた場合に、高負荷状態を検知する。一方で、リソース監視部520は、例えば、同一のトピックを購読しているメッセージ処理装置10のリソース使用量の合計が、予め設定された第2の閾値を下回った場合に、低負荷状態を検知する。又は、リソース監視部520は、例えば、同一のトピックを購読しているメッセージ処理装置10のうち、最も優先度が低いメッセージ処理装置10のリソース使用量が第3の閾値以下である場合に、低負荷状態を検知しても良い。
また、本実施形態に係るメッセージ処理装置10のメッセージ送受信部110は、更に、異常通知依頼メッセージをメッセージブローカー装置20に送信する。ここで、異常通知依頼メッセージとは、メッセージ処理装置10に異常が発生した場合に、メッセージブローカー装置20が異常通知を送信することを依頼するためのメッセージである。この異常通知依頼メッセージは、例えば、MQTTのwill機能を用いて実現することができる。
更に、本実施形態に係るメッセージ処理装置10の実行制御部120は、例えば、所定の時間毎に、CPU使用量やネットワーク使用量等のリソース使用量を用いて、リソース情報4000を更新する。これにより、本実施形態に係る共有情報管理装置40の記憶部410に記憶されているリソース情報4000が所定の時間毎に更新される。ただし、例えば、共有情報管理装置40が、所定の時間毎に、各メッセージ処理装置10からリソース使用量を収集(取得)しても良い。
<全体処理(通常時)>
次に、本実施形態に係るメッセージ処理システム1の全体処理(通常時)について、図14を参照しながら説明する。図14は、第二の実施形態に係るメッセージ処理システム1の全体処理の一例を示すシーケンス図(通常時)である。なお、通常時とは、メッセージ処理装置10に何等の異常も発生しておらず、かつ、高負荷状態及び低負荷状態のいずれでもない場合である。以降では、一例として、同一のトピックを購読するメッセージ処理装置10-1及びメッセージ処理装置10-2に対して、メッセージ送信装置30からのメッセージが送信される場合について説明する。
メッセージ処理装置10-1が電源の投入やプログラムの実行等により起動されると、当該メッセージ処理装置10-1のメッセージ送受信部110は、購読登録メッセージと、異常通知依頼メッセージとをメッセージブローカー装置20に送信する(ステップS301)。購読登録メッセージには、購読対象のトピックと、自身を識別する識別情報(例えば、装置ID等)とが指定される。また、異常通知依頼メッセージには、例えば、自身を識別する識別情報(例えば、装置ID等)が含まれる。これにより、当該メッセージ処理装置10-1がトピックを購読することと、異常が発生した場合に異常通知メッセージを送信することとがメッセージブローカー装置20に登録される。
次に、メッセージ処理装置10-1の実行制御部120は、図6のステップS102と同様に、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS302)。すなわち、実行制御部120は、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-1の装置IDが含まれる場合、実行制御部120は、この装置IDに対応付けられている稼働状態を「稼働」に変更する。一方で、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-1の装置IDが含まれない場合、実行制御部120は、当該レコードに対して、この装置IDと、優先度と、稼働状態「稼働」とを追加する。
同様に、メッセージ処理装置10-2が電源の投入やプログラムの実行等により起動されると、当該メッセージ処理装置10-2のメッセージ送受信部110は、購読登録メッセージと、異常通知依頼メッセージとをメッセージブローカー装置20に送信する(ステップS303)。購読登録メッセージには、購読対象のトピックと、自身を識別する識別情報(例えば、装置ID等)とが指定される。また、異常通知依頼メッセージには、例えば、自身を識別する識別情報(例えば、装置ID等)が含まれる。なお、購読対象のトピックを示すトピックIDは、上記のステップS301でメッセージ処理装置10-1が指定したトピックIDと同一であるものとする。
次に、メッセージ処理装置10-1の実行制御部120は、図6のステップS102と同様に、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS304)。
購読制御装置50が電源の投入やプログラムの実行等により起動されると、当該購読制御装置50のメッセージ送受信部510は、異常通知メッセージを購読するための購読登録メッセージをメッセージブローカー装置20に送信する(ステップS305)。これにより、メッセージ処理装置10-1やメッセージ処理装置10-2に異常が発生した場合に、購読制御装置50には、メッセージブローカー装置20から異常通知メッセージが送信される。
以上のステップS301~ステップS305が初期処理である。この初期処理は、例えば、メッセージ送信装置30によるメッセージ送信の前に、事前に実行される。
メッセージ送信装置30は、メッセージ(メッセージ処理装置10により処理される処理対象のメッセージ)をメッセージブローカー装置20に送信する(ステップS306)。ここで、メッセージには、宛先として、トピックが指定される。なお、メッセージ処理装置10-1及び10-2は、当該トピックを購読しているものとする。
メッセージブローカー装置20は、メッセージ送信装置30から受信したメッセージを、当該メッセージの宛先として指定されているトピックを購読しているメッセージ処理装置10-1に送信する(ステップS307)。同様に、メッセージブローカー装置20は、当該メッセージをメッセージ処理装置10-2に送信する(ステップS308)。
そして、メッセージ処理装置10-1及び10-2は、図6のメッセージ処理の実行制御処理のステップS103~ステップS110を実行する(ステップS309)。これにより、メッセージ処理装置10-1及び10-2のいずれか一方(すなわち、優先度の高いメッセージ処理装置10)により当該メッセージが処理される。なお、メッセージ処理装置10-1及び10-2は、図11のメッセージ処理の実行制御処理のステップS203~ステップS210を実行しても良い。
<全体処理(異常発生時)>
次に、本実施形態に係るメッセージ処理システム1の全体処理(異常発生時)について、図15を参照しながら説明する。図15は、第二の実施形態に係るメッセージ処理システム1の全体処理の一例を示すシーケンス図(異常発生時)である。なお、図15では、図14と同様に、同一のトピックを購読するメッセージ処理装置10-1及びメッセージ処理装置10-2に対して、メッセージ送信装置30からのメッセージが送信される場合について説明する。また、初期処理(図14のステップS301~ステップS305)は実行済みであるものとする。
メッセージ送信装置30は、メッセージ(メッセージ処理装置10により処理される処理対象のメッセージ)をメッセージブローカー装置20に送信する(ステップS401)。ここで、メッセージには、宛先として、トピックが指定される。なお、メッセージ処理装置10-1及び10-2は、当該トピックを購読しているものとする。
メッセージブローカー装置20は、メッセージ送信装置30から受信したメッセージを、当該メッセージの宛先として指定されているトピックを購読しているメッセージ処理装置10-1に送信する(ステップS402)。同様に、メッセージブローカー装置20は、当該メッセージをメッセージ処理装置10-2に送信する(ステップS403)。
そして、メッセージ処理装置10-1及び10-2は、図6のメッセージ処理の実行制御処理のステップS103~ステップS110を実行する(ステップS404)。ここで、一例として、メッセージ処理装置10-1の方がメッセージ処理装置10-2よりも優先度が高いものとして、メッセージ処理装置10-1が当該メッセージの処理中に異常が発生し、停止状態となったものとする。この場合、当該メッセージは、メッセージ処理装置10-2により処理される。
メッセージブローカー装置20は、メッセージ処理装置10-1に異常が発生したことを検知すると、異常通知メッセージを購読制御装置50に送信する(ステップS405)。異常通知メッセージには、例えば、メッセージ処理装置10-1が購読しているトピックを示すトピックIDが指定される。なお、メッセージブローカー装置20は、同一のトピックを購読しているメッセージ処理装置10(すなわち、メッセージ処理装置10-2)にも異常通知メッセージを送信しても良い。これにより、メッセージ処理装置10-2は、メッセージ処理装置10-1に異常が発生したことを素早く検知することができる。
なお、メッセージブローカー装置20は、例えば、所定の時間毎に、各メッセージ処理装置10に対して死活確認を送信することで、異常が発生したメッセージ処理装置10を検知することができる。
購読制御装置50のメッセージ送受信部510は、異常通知メッセージを受信すると、起動依頼メッセージと、購読登録依頼メッセージとをメッセージ処理装置10-3に送信する(ステップS406)。購読登録依頼メッセージには、異常が発生したメッセージ処理装置10-1が購読しているトピックを示すトピックIDが指定される。
ここで、メッセージ処理装置10-3は、例えば、稼働停止状態のサブスクライバーである(したがって、この場合、メッセージ処理装置10-3は何等のトピックも購読していない。)。起動依頼メッセージによりメッセージ処理装置10-3が起動される。なお、メッセージ処理装置10-3が起動済である場合には、購読制御装置50のメッセージ送受信部510は、起動依頼メッセージを送信しなくても良い。ただし、この場合、メッセージ処理装置10-3は、購読登録依頼メッセージに指定されているトピックIDのトピックを購読していないものとする。
なお、本実施形態では、購読制御装置50は、異常通知メッセージを受信した場合に、上記のステップS406を実行するものとしたが、これに限られない。購読制御装置50は、メッセージ処理装置10の異常を任意の方法により検知した場合に、上記のステップS406を実行しても良い。このような方法としては、例えば、購読制御装置50がメッセージ処理装置10から応答があるか否かを監視しても良いし、エージェントがメッセージ処理装置10の異常を検知して、このエージェントから購読制御装置50が通知を受けても良い。
メッセージ処理装置10-3が起動されると、当該メッセージ処理装置10-3のメッセージ送受信部110は、購読登録メッセージと、異常通知依頼メッセージとをメッセージブローカー装置20に送信する(ステップS407)。購読登録メッセージには、購読対象のトピックとして、購読登録依頼メッセージに指定されているトピック(トピックID)が指定される。また、購読登録メッセージには、自身(メッセージ処理装置10-3)を識別する識別情報も指定される。また、異常通知依頼メッセージには、例えば、自身を識別する識別情報(例えば、装置ID等)が含まれる。これにより、当該メッセージ処理装置10-3が当該トピックを購読することと、異常が発生した場合に異常通知メッセージを送信することとがメッセージブローカー装置20に登録される。
次に、メッセージ処理装置10-3の実行制御部120は、図6のステップS102と同様に、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS408)。すなわち、実行制御部120は、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-3の装置IDが含まれる場合、実行制御部120は、この装置IDに対応付けられている稼働状態を「稼働」に変更する。一方で、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-3の装置IDが含まれない場合、実行制御部120は、当該レコードに対して、この装置IDと、優先度と、稼働状態「稼働」とを追加する。
このように、本実施形態に係るメッセージ処理システム1では、或るメッセージ処理装置10に異常が発生し、停止状態となった場合、購読制御装置50は、当該メッセージ処理装置10が購読しているトピックと同一のトピックを他のメッセージ処理装置10に購読させる。これにより、本実施形態に係るメッセージ処理システム1は、同一のトピックを購読しているメッセージ処理装置10のうちの1以上のメッセージ処理装置10が停止状態となった場合であっても、このトピックの宛のメッセージ処理が遅れたり、停止したりしてしまう事態を防止することができる。
<全体処理(高負荷時)>
次に、本実施形態に係るメッセージ処理システム1の全体処理(高負荷時)について、図16を参照しながら説明する。図16は、第二の実施形態に係るメッセージ処理システム1の全体処理の一例を示すシーケンス図(高負荷時)である。
購読制御装置50のリソース監視部520は、共有情報管理装置40の記憶部410に記憶されているリソース情報4000を参照して、同一のトピックを購読しているメッセージ処理装置10のリソース使用量を監視する(ステップS501)。
以降では、上記のステップS501の監視の結果、或るトピックを購読しているメッセージ処理装置10で高負荷状態が検知されたものとする。なお、高負荷状態が検知されなかった場合は、以降のステップS502~ステップS504は実行されない。
購読制御装置50のメッセージ送受信部510は、起動依頼メッセージと、購読登録依頼メッセージとをメッセージ処理装置10-4に送信する(ステップS502)。購読登録依頼メッセージには、当該トピックを示すトピックIDが指定される。
ここで、メッセージ処理装置10-4は、例えば、稼働停止状態のサブスクライバーである(したがって、この場合、メッセージ処理装置10-3は何等のトピックも購読していない。)。起動依頼メッセージによりメッセージ処理装置10-4が起動される。なお、メッセージ処理装置10-4が起動済である場合には、購読制御装置50のメッセージ送受信部510は、起動依頼メッセージを送信しなくても良い。ただし、この場合、メッセージ処理装置10-4は、当該トピックを購読していないものとする。
メッセージ処理装置10-4が起動されると、当該メッセージ処理装置10-4のメッセージ送受信部110は、購読登録メッセージと、異常通知依頼メッセージとをメッセージブローカー装置20に送信する(ステップS503)。購読登録メッセージには、購読対象のトピックとして、当該トピック(トピックID)が指定される。また、購読登録メッセージには、自身(メッセージ処理装置10-4)を識別する識別情報も指定される。また、異常通知依頼メッセージには、例えば、自身を識別する識別情報(例えば、装置ID等)が含まれる。これにより、当該メッセージ処理装置10-4が当該トピックを購読することと、異常が発生した場合に異常通知メッセージを送信することとがメッセージブローカー装置20に登録される。
次に、メッセージ処理装置10-4の実行制御部120は、図6のステップS102と同様に、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS504)。すなわち、実行制御部120は、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-4の装置IDが含まれる場合、実行制御部120は、この装置IDに対応付けられている稼働状態を「稼働」に変更する。一方で、例えば、購読対象トピックを示すトピックIDのレコードに、当該メッセージ処理装置10-4の装置IDが含まれない場合、実行制御部120は、当該レコードに対して、この装置IDと、優先度と、稼働状態「稼働」とを追加する。
このように、本実施形態に係るメッセージ処理システム1では、同一のトピックを購読しているメッセージ処理装置10が高負荷状態となった場合、購読制御装置50は、当該メッセージ処理装置10が購読しているトピックと同一のトピックを他のメッセージ処理装置10に購読させる。これにより、本実施形態に係るメッセージ処理システム1は、同一のトピックを購読しているメッセージ処理装置10が高負荷状態となった場合であっても、このトピックの宛のメッセージ処理が遅れてしまう事態を防止することができる。
<全体処理(低負荷時)>
次に、本実施形態に係るメッセージ処理システム1の全体処理(低負荷時)について、図17を参照しながら説明する。図17は、第二の実施形態に係るメッセージ処理システム1の全体処理の一例を示すシーケンス図(低負荷時)である。
購読制御装置50のリソース監視部520は、共有情報管理装置40の記憶部410に記憶されているリソース情報4000を参照して、同一のトピックを購読しているメッセージ処理装置10のリソース使用量を監視する(ステップS601)。
以降では、上記のステップS601の監視の結果、或るトピックを購読しているメッセージ処理装置10で低負荷状態が検知されたものとする。なお、低負荷状態が検知されなかった場合は、以降のステップS602~ステップS604は実行されない。
購読制御装置50のメッセージ送受信部510は、稼働停止依頼メッセージと、購読解除依頼メッセージとをメッセージ処理装置10-2に送信する(ステップS602)。購読登録依頼メッセージには、当該トピックを示すトピックIDが指定される。
ここで、メッセージ処理装置10-2は、例えば、当該トピックを購読しているメッセージ処理装置10のうち、最も優先度が低いメッセージ処理装置10である。このように、購読制御装置50は、或るトピックを購読しているメッセージ処理装置10で低負荷状態が検知された場合、当該トピックを購読しているメッセージ処理装置10のうち、最も優先度が低いメッセージ処理装置10に稼働停止依頼メッセージ及び購読解除依頼メッセージに送信する。
次に、メッセージ処理装置10-2の実行制御部120は、共有情報管理装置40の記憶部410に記憶されている処理調整情報1000を更新する(ステップS603)。すなわち、実行制御部120は、例えば、購読対象トピックを示すトピックID及び自身の装置IDが含まれるレコードの稼働状態を「停止」に更新する。
次に、メッセージ処理装置10-2のメッセージ送受信部110は、購読解除メッセージと、異常通知終了メッセージとをメッセージブローカー装置20に送信する(ステップS604)。購読解除メッセージには、購読解除の対象のトピックとして、当該トピック(トピックID)が指定される。また、購読解除メッセージには、自身(メッセージ処理装置10-4)を識別する識別情報も指定される。また、異常通知終了メッセージには、例えば、自身を識別する識別情報(例えば、装置ID等)が含まれる。これにより、当該メッセージ処理装置10-2が当該トピックを購読することと、異常が発生した場合に異常通知メッセージを送信することとの登録がメッセージブローカー装置20から削除される。
その後、メッセージ処理装置10-2は、稼働を停止する。ここで、稼働の停止とは、メッセージ処理装置10を実現する物理サーバの電源断に限られない。例えば、プログラムの終了、メッセージ処理の対象から外す設定に変更する等でも良い。また、メッセージ処理装置10が仮想サーバやコンテナで実現されている場合は、これらの仮想サーバやコンテナの破棄等の処理を実行することでも良い。
このように、本実施形態に係るメッセージ処理システム1では、同一のトピックを購読しているメッセージ処理装置10が低負荷状態となった場合、購読制御装置50は、当該トピックを購読しているメッセージ処理装置10のうち、最も優先度の低いメッセージ処理装置10の購読を解除させると共に稼働を停止させる。これにより、本実施形態に係るメッセージ処理システム1は、同一のトピックを購読しているメッセージ処理装置10が低負荷状態となった場合に、物理サーバの消費電力やクラウドサービスの利用時間に応じた費用等の無駄を防止することができる。
本発明は、具体的に開示された上記の実施形態に限定されるものではなく、特許請求の範囲から逸脱することなく、種々の変形や変更が可能である。