(57)【要約】【課題】ＦＢＰの実行環境において永続性を実現できる情報処理装置、情報処理システム、情報処理方法およびプログラムを提供する。【解決手段】ファンクションノード制御部は、入力メッセージとプログラムとの組をジャーナルログとして記録するとともに、入力メッセージとプログラムとを仮想マシン部に送る。仮想マシン部は、入力メッセージを引数としてプログラムを実行し、実行結果をファンクションノード制御部に送る。ファンクションノード制御部は、実行結果を出力メッセージとして出力する。リカバリ部は、情報処理装置の起動時に、仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録されたジャーナルログを順に取り出して、該ジャーナルログを構成する入力メッセージを引数としたプログラムの再実行を仮想マシン部において順次行わせ、仮想マシン部を最新の状態にロールフォワードする。【選択図】図５
2019008384.tif 000002
【特許請求の範囲】
【請求項１】
フローベースドプログラミングの実行環境となる情報処理装置であって、
プログラミング環境からデプロイされたファンクションノードに対応して設けられるファンクションノード制御部と、
前記ファンクションノードに関連付けられて前記プログラミング環境からデプロイされた永続的実行環境に対応して設けられ、仮想マシン部とリカバリ部とを有する永続的実行部と、を備え、
前記ファンクションノード制御部は、前記ファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、前記入力メッセージと前記プログラムとを前記仮想マシン部に送り、
前記仮想マシン部は、前記入力メッセージを引数として前記プログラムを実行し、実行結果を前記ファンクションノード制御部に送り、
前記ファンクションノード制御部は、前記仮想マシン部から受け取った前記実行結果を出力メッセージとして出力し、
前記リカバリ部は、前記情報処理装置の起動時に、前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記仮想マシン部において順次行わせることにより、前記仮想マシン部を最新の状態にロールフォワードする
情報処理装置。
【請求項２】
前記プログラミング環境からデプロイされた複数のファンクションノードに対応して複数の前記ファンクションノード制御部が設けられ、
前記永続的実行部は、複数の前記ファンクションノード制御部により共有される
請求項１に記載の情報処理装置。
【請求項３】
前記仮想マシン部は、前記永続的実行環境の初期化プログラム中で宣言された変数および前記永続的実行環境の予約変数が登録されるグローバルスコープと、前記プログラムを実行する際に生成され、前記プログラム中で宣言された変数および前記ファンクションノードの予約変数が登録されるファンクションスコープとを有し、前記プログラムの実行時における変数の参照は、前記プログラム中で宣言された変数、前記ファンクションノードの予約変数、前記初期化プログラム中で宣言された変数、前記永続的実行環境の予約変数、の順に行う
請求項１または２に記載の情報処理装置。
【請求項４】
前記プログラミング環境からデプロイされたイベントリスナノードに対応して設けられるイベントリスナノード制御部をさらに備え、
前記仮想マシン部は、前記永続的実行環境の予約変数に格納されるemit関数を実行すると、該emit関数の引数であるイベント名とメッセージを前記イベントリスナノード制御部に送り、
前記イベントリスナノード制御部は、前記仮想マシン部から受け取ったイベント名が前記イベントリスナノードに定義されたイベント名と一致する場合に、前記仮想マシン部から受け取ったメッセージを出力する
請求項３に記載の情報処理装置。
【請求項５】
前記プログラミング環境からデプロイされたテンプレート処理ノードに対応して設けられるテンプレート処理ノード制御部と、
前記仮想マシン部の前記グローバルスコープに登録された変数の値を取得するリードオンリアクセス部と、をさらに備え、
前記テンプレート処理ノード制御部は、前記テンプレート処理ノードの入力メッセージが入力されると、前記テンプレート処理ノードに定義されたテンプレートの埋め込み箇所に指定された変数名を前記仮想マシン部の前記グローバルスコープに登録された変数の変数名として、前記リードオンリアクセス部を通じて、前記仮想マシン部の前記グローバルスコープから値を読み出し、前記埋め込み箇所に前記値を埋め込んだ前記テンプレートを出力メッセージとして出力する
請求項３に記載の情報処理装置。
【請求項６】
前記プログラミング環境からデプロイされたリードオンリファンクションノードに対応して設けられ、前記リードオンリファンクションノードの入力メッセージが入力されると、該入力メッセージを引数として前記リードオンリファンクションノードに定義されたプログラムを実行し、実行結果を出力メッセージとして出力するリードオンリファンクションノード制御部と、
前記仮想マシン部の前記グローバルスコープに登録された変数の値を取得するリードオンリアクセス部と、をさらに備え、
前記リードオンリファンクションノード制御部は、前記リードオンリファンクションノードに定義されたプログラムを実行する際、該プログラム内で未定義の変数からの読み出しに関しては、前記リードオンリアクセス部を通じて、前記仮想マシン部の前記グローバルスコープから値を読み出す
請求項３に記載の情報処理装置。
【請求項７】
請求項１乃至６のいずれか一項に記載の情報処理装置と、該情報処理装置とネットワークを介して接続される再現装置とを含む情報処理システムであって、
前記再現装置は、
過去の任意の時刻を指定するユーザ操作を受け付けるコンソール部と、
前記ユーザ操作により指定された時刻よりもさらに過去のある時刻における前記情報処理装置の前記仮想マシン部の状態をメモリ上に再現し、該時刻から前記ユーザ操作により指定された時刻までの間に記録された前記ジャーナルログを前記情報処理装置から取得して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの実行を前記メモリ上で順次行うことにより、前記ユーザ操作により指定された時刻における前記情報処理装置の前記仮想マシン部の状態を再現する状態再現部と、
を備える情報処理システム。
【請求項８】
前記情報処理装置は、前記ジャーナルログにタグを付加するタグ付け部をさらに備え、
前記再現装置の前記コンソール部は、前記タグを表示するとともに、表示した前記タグのいずれかを選択することで過去の任意の時刻を指定する前記ユーザ操作を受け付ける
請求項７に記載の情報処理システム。
【請求項９】
前記情報処理装置は、
前記プログラミング環境からデプロイされたタグ付け処理ノードに対応して設けられ、前記タグ付け処理ノードの入力メッセージが入力されると、該入力メッセージに含まれる文字列を前記タグ付け部に送るタグ付け処理ノード制御部をさらに備え、
前記タグ付け部は、前記タグ付け処理ノード制御部から受け取った前記文字列を前記タグとして付加する
請求項８に記載の情報処理システム。
【請求項１０】
ネットワークを介して接続される第１情報処理装置と第２情報処理装置とを含み、前記第１情報処理装置および前記第２情報処理装置がそれぞれフローベースドプログラミングの実行環境となる情報処理システムであって、
前記第１情報処理装置は、
プログラミング環境から前記第１情報処理装置にデプロイされたファンクションノードに対応して設けられるファンクションノード制御部を備え、
前記第２情報処理装置は、前記ファンクションノードに関連付けられて前記プログラミング環境から前記第２情報処理装置にデプロイされた永続的実行環境に対応して設けられ、仮想マシン部とリカバリ部とを有する第１永続的実行部を備え、
前記ファンクションノード制御部は、前記ファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、前記入力メッセージと前記プログラムとを前記仮想マシン部に送り、
前記仮想マシン部は、前記入力メッセージを引数として前記プログラムを実行し、実行結果を前記ファンクションノード制御部に送り、
前記ファンクションノード制御部は、前記仮想マシン部から受け取った前記実行結果を出力メッセージとして出力し、
前記リカバリ部は、前記第２情報処理装置の起動時に、前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記仮想マシン部において順次行わせることにより、前記仮想マシン部を最新の状態にロールフォワードする
情報処理システム。
【請求項１１】
前記第１情報処理装置は、前記ファンクションノードに関連付けられて前記プログラミング環境から前記第１情報処理装置にデプロイされた前記永続的実行環境に対応して設けられ、仮想マシン部とリカバリ部とを有する第２永続的実行部をさらに備え、
前記ファンクションノード制御部は、前記ファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、前記入力メッセージと前記プログラムとを前記第１永続的実行部の前記仮想マシン部と、前記第２永続的実行部の前記仮想マシン部との双方に送り、前記第１永続的実行部の前記仮想マシン部から受け取った前記実行結果と前記第２永続的実行部の前記仮想マシン部から受け取った前記実行結果とのいずれかを出力メッセージとして出力し、
前記第２永続的実行部の前記リカバリ部は、前記第１情報処理装置の起動時に、前記第２永続的実行部の前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記第２永続定実行部の前記仮想マシン部において順次行わせることにより、前記第２永続的実行部の前記仮想マシン部を最新の状態にロールフォワードする
請求項１０に記載の情報処理システム。
【請求項１２】
フローベースドプログラミングの実行環境となる情報処理装置において実行される情報処理方法であって、
プログラミング環境から前記情報処理装置にデプロイされたファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、
前記ファンクションノードに関連付けられて前記プログラミング環境から前記情報処理装置にデプロイされた永続的実行環境に対応して設けられた仮想マシン部において、前記入力メッセージを引数として前記プログラムを実行し、実行結果を出力メッセージとして出力し、
前記情報処理装置の起動時は、前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記仮想マシン部において順次行わせることにより、前記仮想マシン部を最新の状態にロールフォワードする
情報処理方法。
【請求項１３】
フローベースドプログラミングの実行環境となるコンピュータに、
プログラミング環境からデプロイされたファンクションノードに対応して設けられるファンクションノード制御部の機能と、
前記ファンクションノードに関連付けられて前記プログラミング環境からデプロイされた永続的実行環境に対応して設けられ、仮想マシン部とリカバリ部とを有する永続的実行部の機能と、を実現させ、
前記ファンクションノード制御部は、前記ファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、前記入力メッセージと前記プログラムとを前記仮想マシン部に送り、
前記仮想マシン部は、前記入力メッセージを引数として前記プログラムを実行し、実行結果を前記ファンクションノード制御部に送り、
前記ファンクションノード制御部は、前記実行結果を出力メッセージとして出力し、
前記リカバリ部は、前記コンピュータの起動時に、前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記仮想マシン部において順次行わせることにより、前記仮想マシン部を最新の状態にロールフォワードする
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、情報処理装置、情報処理システム、情報処理方法およびプログラムに関する。
【背景技術】
【０００２】
例えばＩｏＴ機器の動作を設計・実装するための手法として、フローベースドプログラミング（Flow-Based  Programming；以下、「ＦＢＰ」と呼ぶ）が広く利用されている。ＦＢＰは、メッセージドリブンのソフトウェア部品（「ノード」と呼ばれる）をつなげて処理の流れ（フロー）を作成するプログラム開発手法であり、例えばＮｏｄｅ−ＲＥＤなどのオープンソースのツールが提供されている。
【０００３】
永続性が必要とされる機器のプログラムをＦＢＰにより作成する場合、ＦＢＰの実行環境自体には永続性がないため、機器の状態を外部のデータベースに保存する必要がある。また、機器の起動時（障害からのリカバリを含む）や、機器の永続的な状態を利用する場合は、外部のデータベースに保存しておいた状態を読み込んで、機器の状態を復元する必要がある。このため、例えばデータベースに接続して検索・更新等を行うデータベースノードと呼ばれる特殊なノードを追加するなど、本来のデータフローに対して永続化のための技巧的なフローを追加する必要があり、プログラム開発の負担になっている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１６−２４７９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
本発明が解決しようとする課題は、ＦＢＰの実行環境において永続性を実現できる情報処理装置、情報処理システム、情報処理方法およびプログラムを提供することである。
【課題を解決するための手段】
【０００６】
実施形態の情報処理装置は、フローベースドプログラミングの実行環境となる情報処理装置であって、プログラミング環境からデプロイされたファンクションノードに対応して設けられるファンクションノード制御部と、前記ファンクションノードに関連付けられて前記プログラミング環境からデプロイされた永続的実行環境に対応して設けられ、仮想マシン部とリカバリ部とを有する永続的実行部と、を備える。前記ファンクションノード制御部は、前記ファンクションノードの入力メッセージが入力されると、該入力メッセージと前記ファンクションノードに定義されたプログラムとの組をジャーナルログとして記録するとともに、前記入力メッセージと前記プログラムとを前記仮想マシン部に送る。前記仮想マシン部は、前記入力メッセージを引数として前記プログラムを実行し、実行結果を前記ファンクションノード制御部に送る。前記ファンクションノード制御部は、前記仮想マシン部から受け取った前記実行結果を出力メッセージとして出力する。前記リカバリ部は、前記情報処理装置の起動時に、前記仮想マシン部を過去のある時刻の状態に復元した後、該時刻以降に記録された前記ジャーナルログを順に取り出して、該ジャーナルログを構成する前記入力メッセージを引数とした該ジャーナルログを構成する前記プログラムの再実行を前記仮想マシン部において順次行わせることにより、前記仮想マシン部を最新の状態にロールフォワードする。
【図面の簡単な説明】
【０００７】
【図１】図１は、フロー作成ＵＩの一例を示す図である。
【図２】図２は、ファンクションノード設定ＵＩの一例を示す図である。
【図３】図３は、永続的実行環境設定ＵＩの一例を示す図である。
【図４】図４は、フロー作成ＵＩの一例を示す図である。
【図５】図５は、第１実施形態に係る情報処理装置の機能的な構成例を示すブロック図である。
【図６】図６は、ファンクションノード制御部の処理手順の一例を示すフローチャートである。
【図７】図７は、仮想マシン部の詳細を示すブロック図である。
【図８】図８は、仮想マシン部におけるスコープルールを説明する図である。
【図９】図９は、変数名解決部の処理手順の一例を示すフローチャートである。
【図１０】図１０は、リカバリ部の処理手順の一例を示すフローチャートである。
【図１１】図１１は、ファンクションノード制御部の処理手順の一例を示すフローチャートである。
【図１２】図１２は、プログラムＩＤとコンパイルされたプログラムとの対応表の一例を示す図である。
【図１３】図１３は、ファンクションノード制御部の処理手順の一例を示すフローチャートである。
【図１４】図１４は、仮想マシン部の処理手順の一例を示すフローチャートである。
【図１５】図１５は、リカバリ部の処理手順の一例を示すフローチャートである。
【図１６】図１６は、第２実施形態に係る情報処理装置の機能的な構成例を示すブロック図である。
【図１７】図１７は、仮想マシン部の処理手順の一例を示すフローチャートである。
【図１８】図１８は、イベントリスナノード制御部の処理手順の一例を示すフローチャートである。
【図１９】図１９は、第３実施形態に係る情報処理装置の機能的な構成例を示すブロック図である。
【図２０】図２０は、第４実施形態に係る情報処理装置の機能的な構成例を示すブロック図である。
【図２１】図２１は、第５実施形態に係る情報処理システムの概略構成を示すブロック図である。
【図２２】図２２は、第５実施形態に係る情報処理装置の機能的な構成例を示すブロック図である。
【図２３】図２３は、再現装置の処理手順の一例を示すフローチャートである。
【図２４】図２４は、変形例に係る情報処理装置の機能的な構成例を示すブロック図である。
【図２５】図２５は、第６実施形態に係る情報処理システムの概略構成を示すブロック図である。
【図２６】図２６は、第７実施形態に係る情報処理システムの概略構成を示すブロック図である。
【図２７】図２７は、情報処理装置のハードウェア構成の一例を示すブロック図である。
【発明を実施するための形態】
【０００８】
以下で示す実施形態では、本発明が適用される情報処理装置の一例として、ゲートウェイと呼ばれるＩｏＴ機器を想定する。ゲートウェイは、周辺のセンサ等からデータを収集し、そのデータを適宜に加工した後にサーバ装置に転送したり、サーバ装置からの操作命令に基づき、周辺のＩｏＴ機器を制御したりといった役割を持つ。
【０００９】
ゲートウェイは、汎用のコンピュータとしてのハードウェア資源を備え、現場の状況に合わせてソフトウェア的にカスタマイズされる。そのカスタマイズのためにＦＢＰが利用される。ＦＢＰを利用して様々な周辺機器との接続の状況をフローとして表現することにより、視覚的にわかりやすいカスタマイズが可能である。ゲートウェイ内でのデータ加工処理等の内容は、ファンクションノードと呼ばれる処理ノードを使って定義する。
【００１０】
処理ノードは、ＦＢＰにおいてフローを構成するソフトウェア部品であり、一般に、１つの入力ポートと複数の出力ポートをもつ。出力ポートは他の処理ノードの入力ポートにつながる。処理ノードのうち、JavaScript（登録商標）のプログラムをユーザ定義可能なソフトウェア部品がファンクションノードである。ファンクションノードを使ってゲートウェイ内でのデータ加工処理等の内容を定義することにより、ゲートウェイの動作を任意にカスタマイズすることができる。
【００１１】
一般的なＦＢＰの実行環境は、永続性を持たない。そこで本実施形態では、永続的実行環境とよばれるJavaScriptの仮想マシンを内蔵した機能をＦＢＰに組み込むことにより、ＦＢＰの実行環境において永続性を実現する。ここで仮想マシンとは、独立したJavaScript等の実行環境であり、固有のグローバルスコープを持ち、その中で実行されるプログラムの暗黙的な作用は外部に影響しないという性質を持つ。永続的実行環境は処理ノードではなく、ファンクションノードが実行される環境としてファンクションノードに関連付けることによって現れるものである。
【００１２】
ここで、本実施形態のＦＢＰのプログラミング環境におけるフロー作成の手順について説明する。本実施形態のＦＢＰによるフローは、例えばブラウザベースのＵＩ上でのユーザ操作に応じて作成される。本実施形態のＦＢＰにおけるフロー作成ＵＩ１０の一例を図１に示す。このフロー作成ＵＩ１０は、ノード一覧領域１１とフロー作成領域１２とを有し、ノード一覧領域１１に用意されたノードのアイコンを例えばドラッグ＆ドロップ操作によりフロー作成領域１２に配置し、フロー作成領域１２に配置した複数のノードのアイコンをつなげることで所望のフローを作成できる構成となっている。ここでノード一覧領域１１には、永続的実行環境との関連付けが可能なファンクションノードのアイコン１３が用意され、このファンクションノードを用いてフローを作成できる。
【００１３】
フロー作成ＵＩ１０のフロー作成領域１２上で、フローを構成するファンクションノードのアイコン１３に対して例えばダブルクリックなどの操作を行うと、例えば図２に示すようなファンクションノード設定ＵＩ２０が表示される。このファンクションノード設定ＵＩ２０は、ファンクションノードのノード名を書き込むテキストボックス２１と、永続的実行環境を他のファンクションノードと共有する場合にチェックするチェックボックス２２と、チェックボックス２２がチェックされた場合に他のファンクションノードと共有する永続的実行環境を選択するためのプルダウンメニュー２３と、永続的実行環境を新たに設定する場合に操作する「設定」ボタン２４と、ファンクションノードのプログラムを記述するプログラム記述領域２５とを有する。ユーザはこのファンクションノード設定ＵＩ２０上でファンクションノードのノード名を定義し、ファンクションノードと関連付ける永続的実行環境を指定し、ファンクションノードのプログラムを定義することで、上述のフローを構成するファンクションノードを設定できる。
【００１４】
このファンクションノード設定ＵＩ２０の「設定」ボタン２４を押すと、例えば図３に示すような永続的実行環境設定ＵＩ３０が表示される。この永続的実行環境設定ＵＩ３０は、永続的実行環境の名前を書きこむテキストボックス３１と、永続的実行環境の初期化プログラムを記述するプログラム記述領域３２とを有する。ユーザはこの永続的実行環境設定ＵＩ３０上で永続的実行環境の名前と初期化プログラムを定義することで、ファンクションノードが使用する永続的実行環境を新たに設定できる。
【００１５】
上述のフローを構成するファンクションノードの設定が終了すると、図４に示すようなフロー作成ＵＩ１０が再度表示され、フローを構成するファンクションノードのアイコン１３にファンクションノードのノード名と、そのファンクションノードに関連付く永続的実行環境の名前が反映される。また、このフロー作成ＵＩ１０上で「デプロイ」ボタン１５が表示され、この「デプロイ」ボタン１５が押されると、上述のフローを構成するファンクションノードと、このファンクションノードに関連付く永続的実行環境が、指定されたデプロイ先にデプロイされる。
【００１６】
本実施形態に係る情報処理装置は、ＦＢＰの実行環境となる情報処理装置であって、デプロイされたファンクションノードのプログラムを永続的実行環境で実行するものである。以下では、本実施形態に係る情報処理装置、情報処理システム、情報処理方法およびプログラムの詳細を説明する。なお、以下の説明において、同様の機能を持つ構成要素については同一の符号を付して、重複した説明を適宜省略する。
【００１７】
＜第１実施形態＞
図５は、第１実施形態に係る情報処理装置１００の機能的な構成例を示すブロック図である。この情報処理装置１００は、１つ以上のファンクションノード制御部１１０と、１つ以上の永続的実行部１２０とを備える。永続的実行部１２０は、仮想マシン部１３０、リカバリ部１４０およびスナップショット書き出し部１５０を有する。また、情報処理装置１００は、ジャーナルログ記憶部１６０と、スナップショット記憶部１７０とを備える。これらジャーナルログ記憶部１６０およびスナップショット記憶部１７０は、永続的実行部１２０ごとに設けられていてもよいし、複数の永続的実行部１２０が設けられた場合にこれらで共有される構成であってもよい。
【００１８】
ファンクションノード制御部１１０は、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされたファンクションノード１８０に対応して設けられ、永続的実行部１２０は、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされた永続的実行環境１９０に対応して設けられる。図５では、１つのファンクションノード１８０に対応する１つのファンクションノード制御部１１０と、１つの永続的実行環境１９０に対応する１つの永続的実行部１２０のみを図示しているが、ファンクションノード制御部１１０はデプロイされたファンクションノード１８０ごとに設けられる。デプロイされたファンクションノード１８０が複数あれば、各々のファンクションノード１８０に対応する複数のファンクションノード制御部１１０が設けられる。また、永続的実行部１２０は、ファンクションノード１８０に関連付けられてデプロイされた永続的実行環境１９０の数だけ設けられる。上述したように、複数のファンクションノード１８０で共有される永続的実行環境１９０に対応する永続的実行部１２０は、永続的実行環境１９０を共有する複数のファンクションノード１８０に対応する複数のファンクションノード制御部１１０によって使用される。また、１つのファンクションノード１８０が占有する永続的実行環境１９０に対応する永続的実行部１２０は、そのファンクションノード１８０に対応するファンクションノード制御部１１０のみにより使用される。
【００１９】
ＦＢＰのプログラミング環境からデプロイされたファンクションノード１８０は、ユーザ定義された永続的実行環境名１８１およびプログラム１８２を含む。また、ＦＢＰのプログラミング環境からデプロイされた永続的実行環境１９０は、ユーザ定義された永続的実行環境名１９１および初期化プログラム１９２を含む。本実施形態では、ファンクションノード１８０と永続的実行環境１９０との関連付けが、永続的実行環境１９０の名前を用いて実現される。すなわち、ファンクションノード１８０とこれに関連付く永続的実行環境１９０では、双方でユーザ定義された永続的実行環境名１８１，１９１が一致する。
【００２０】
ファンクションノード制御部１１０は、永続的実行部１２０を使用してファンクションノード１８０の機能を実現するための制御部である。ファンクションノード制御部１１０の処理手順の一例を図６に示す。この図６のフローチャートで示す一連の処理は、ファンクションノード１８０の入力メッセージが入力ポート１１１に入力されるたびに、ファンクションノード制御部１１０によって繰り返し実行される。
【００２１】
ファンクションノード１８０の入力メッセージが入力ポート１１１に入力されると、ファンクションノード制御部１１０は、まず、ファンクションノード１８０に定義された永続的実行環境名１８１をキーとして、ファンクションノード１８０に関連付いた永続的実行環境１９０を特定する（ステップＳ１０１）。そして、ファンクションノード制御部１１０は、入力ポート１１１から入力された入力メッセージと、ファンクションノードに定義されたプログラム１８２との組をジャーナルログとして、ジャーナルログ記憶部１６０に記録する（ステップＳ１０２）。さらに、ファンクションノード制御部１１０は、これら入力メッセージとプログラム１８２とを、ステップＳ１０１で特定した永続的実行環境１９０に対応する永続的実行部１２０の仮想マシン部１３０に送る（ステップＳ１０３）。その後、仮想マシン部１３０からプログラム１８２の実行結果が送られてくると、ファンクションノード制御部１１０は、その実行結果を仮想マシン部１３０から受け取って、出力メッセージとして出力ポート１１２から出力する（ステップＳ１０４）。
【００２２】
仮想マシン部１３０は、ファンクションノード制御部１１０から入力メッセージとプログラム１８２を受け取ると、入力メッセージを引数としてプログラム１８２を実行し、実行結果をファンクションノード制御部１１０に返す。図７は、仮想マシン部１３０の詳細を示すブロック図である。仮想マシン部１３０は、ファンクション準備部１３１と、解釈実行部１３７と、変数名解決部１３６とを備える。ファンクション準備部１３１は、スコープ生成部１３２と構文解析部１３３とを有する。
【００２３】
スコープ生成部１３２は、ファンクションノード制御部１１０から送られたプログラム１８２の実行に先立ち、ファンクションスコープ１３４を生成する。ファンクションスコープ１３４は、プログラム１８２の実行ごとに生成される変数記憶域のことであり、そのプログラム１８２の中からのみアクセスされる。ファンクションスコープ１３４は、プログラム１８２の実行が終了し、利用されなくなると消滅する。仮想マシン部１３０は、ファンクションノード制御部１１０から送られたプログラム１８２を構文解析部１３３で構文解析し、スコープ生成部１３２によって生成されたファンクションスコープ１３４に、プログラム１８２中で宣言された変数を登録する。また、仮想マシン部１３０は、ファンクションノード１８０の予約変数をファンクションスコープ１３４に登録する。例えば、ファンクションノード制御部１１０から送られた入力メッセージを保存する予約変数“msg”をファンクションスコープ１３４に登録し、同時にその値（つまり、送られてきた入力メッセージ）も登録する。
【００２４】
また、仮想マシン部１３０は、固有のグローバルスコープ１３５を持つ。グローバルスコープ１３５は、仮想マシン部１３０内に一つだけある変数記憶域のことであり、あらゆるスコープからアクセス可能である。仮想マシン部１３０は、永続的実行環境１９０の初期化プログラム１９２をグローバルスコープ１３５で実行することにより、初期化プログラム１９２中で宣言された変数をグローバルスコープ１３５に登録する。また、仮想マシン部１３０は、永続的実行環境１９０の予約変数もグローバルスコープ１３５に登録する。なお、永続的実行環境１９０の初期化プログラム１９２が実行されるのは、永続的実行環境１９０がデプロイされた直後、ユーザが明示的に実行を指示した場合、情報処理装置１００全体の初期化時に限定される。情報処理装置１００の起動時には、永続的実行環境１９０の初期化プログラム１９２は実行されない。
【００２５】
図８は、仮想マシン部１３０におけるスコープルールを説明する図である。ファンクションノード１８０のプログラム１８２を実行する際、ファンクションスコープ１３４に登録された変数（図中のｘ）については、ファンクションスコープ１３４でその値が参照される。一方、ファンクションノード１８０のプログラム１８２中で宣言されておらず、ファンクションスコープ１３４に登録されていない変数（図中のｙ）については、グローバルスコープ１３５でその値が参照される。また、ファンクションスコープに登録されていない関数（図中のｇ）についても、グローバルスコープ１３５が参照される。
【００２６】
仮想マシン部１３０は、ファンクション準備部１３１によるプログラム１８２の実行準備が完了すると、ファンクションスコープ１３４を使って、解釈実行部１３７によりプログラム１８２を実行し、実行結果をファンクションノード制御部１１０に返す。このプログラム１８２を実行する際に変数へのアクセスがあった場合には、変数名解決部１３６が動作する。
【００２７】
図９は、変数名解決部１３６の処理手順の一例を示すフローチャートである。変数名解決部１３６は、ファンクションノード１８０のプログラム１８２から変数が参照された場合、まず、その変数がプログラム１８２中で宣言された変数か否かを判断し（ステップＳ２０１）、プログラム１８２中で宣言された変数であれば（ステップＳ２０１：Ｙｅｓ）、ファンクションスコープ１３４に登録されているその変数を参照して値を決定する（ステップＳ２０５）。一方、プログラム１８２中で宣言された変数でなければ（ステップＳ２０１：Ｎｏ）、変数名解決部１３６は、次に、その変数がファンクションノード１８０の予約変数か否かを判断し（ステップＳ２０２）、ファンクションノード１８０の予約変数であれば（ステップＳ２０２：Ｙｅｓ）、ファンクションスコープ１３４に登録されているその変数を参照して値を決定する（ステップＳ２０５）。
【００２８】
一方、ファンクションノード１８０の予約変数でなければ（ステップＳ２０２：Ｎｏ）、変数名解決部１３６は、次に、その変数が永続的実行環境１９０の初期化プログラム１９２中で宣言された変数か否かを判断し（ステップＳ２０３）、初期化プログラム１９２中で宣言された変数であれば（ステップＳ２０３：Ｙｅｓ）、グローバルスコープ１３５に登録されているその変数を参照して値を決定する（ステップＳ２０５）。一方、初期化プログラム１９２中で宣言された変数でなければ（ステップＳ２０３：Ｎｏ）、変数名解決部１３６は、次に、その変数が永続的実行環境１９０の予約変数か否かを判断し（ステップＳ２０４）、永続的実行環境１９０の予約変数であれば（ステップＳ２０４：Ｙｅｓ）、グローバルスコープ１３５に登録されているその変数を参照して値を決定する（ステップＳ２０５）。なお、永続的実行環境１９０の予約変数でもない場合は（ステップＳ２０４：Ｎｏ）、参照エラーとなる（ステップＳ２０６）。
【００２９】
仮想マシン部１３０の状態は、スナップショットとして定期的にスナップショット記憶部１７０に記録される。スナップショットは、ある時刻の仮想マシン部１３０内の全状態を表したバイナリデータであり、スナップショット書き出し部１５０により定期的に書き出され、スナップショット記憶部１７０に記録される。記録されたスナップショットは、後述のリカバリ部１４０が仮想マシン部１３０の状態を過去のある時刻の状態に復元するために利用される。
【００３０】
スナップショットはデータサイズが比較的大きいため、頻繁に書き出して記録することは望ましくない。そのため、スナップショット書き出し部１５０は、例えば、後述のロールフォワードに許容される時間が１秒程度であることを想定し、仮想マシン部１３０の累積の正味実行時間が１秒に達するたびに、スナップショットを書き出してスナップショット記憶部１７０に記録するものとする。
【００３１】
リカバリ部１４０は、情報処理装置１００の電源が一旦オフした後の起動時（障害からの復旧時を含む）に、仮想マシン部１３０の状態を電源オフの前の状態（最新の状態）に復元する。リカバリ部１４０は、情報処理装置１００の起動時に、スナップショット記憶部１７０に記録されたスナップショットを仮想マシン部１３０に展開することで仮想マシン部１３０を過去のある時刻の状態に復元した後、該時刻以降に記録されたジャーナルログをジャーナルログ記憶部１６０から順に取り出して、該ジャーナルログを構成する入力メッセージを引数としたプログラム１８２の再実行を仮想マシン部１３０において順次行わせることにより、仮想マシン部１３０を最新の状態にロールフォワードする。なお、再実行したプログラム１８２の実行結果は、ファンクションノード制御部１１０に送られることなく破棄される。
【００３２】
図１０は、リカバリ部１４０の処理手順の一例を示すフローチャートである。情報処理装置１００の起動時に、リカバリ部１４０は、まず、最新のスナップショットをスナップショット記憶部１７０から読み出し、仮想マシン部１３０内に展開する（ステップＳ３０１）。そして、リカバリ部１４０は、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあるかどうかを確認する（ステップＳ３０２）。そして、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあれば（ステップＳ３０２：Ｙｅｓ）、ジャーナルログの読み出し位置を最新のスナップショット直後に設定する（ステップＳ３０３）。一方、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがなければ（ステップＳ３０２：Ｎｏ）、そのまま処理を終了する。
【００３３】
次に、リカバリ部１４０は、ジャーナルログ記憶部１６０から、設定した読み出し位置のジャーナルログを読み出す（ステップＳ３０４）。そして、読み出したジャーナルログを構成する入力メッセージを引数として、その読み出したジャーナルログを構成するプログラム１８２を仮想マシン部１３０内で実行する（ステップＳ３０５）。その後、リカバリ部１４０は、ジャーナルログの読み出し位置を次のジャーナルログの記録時刻にシフトし（ステップＳ３０６）、読み出し位置のジャーナルログがあるか否かを確認する（ステップＳ３０７）。そして、読み出し位置のジャーナルログがあれば（ステップＳ３０７：Ｙｅｓ）、ステップＳ３０４に戻って以降の処理を繰り返す。一方、読み出し位置のジャーナルログがなければ（ステップＳ３０７：Ｎｏ）、処理を終了する。
【００３４】
なお、ＭＲＡＭ（Magnetoresistive  Random  Access  Memory）等の不揮発メモリ技術を永続的実行部１２０に適用するならば、情報処理装置１００が正常に電源オフした後に起動する際は、上述のリカバリ部１４０の処理を実施せずとも仮想マシン部１３０の状態を最新の状態とすることができる。しかし、不揮発メモリ技術を永続的実行部１２０に適用した場合であっても、障害からの復旧時には上述のリカバリ部１４０の処理を実施することで、アトミシティ（原子性）などの耐障害機能を実現することができる。また、上述のジャーナルログ記憶部１６０やスナップショット記憶部１７０にはストレージデバイスを利用することを想定しているが、ＭＲＡＭ等の不揮発メモリ技術を用いてこれらジャーナルログ記憶部１６０やスナップショット記憶部１７０を実現した場合は、処理速度の向上が見込まれる。
【００３５】
以上、具体的な例を挙げながら詳細に説明したように、本実施形態によれば、ＦＢＰの実行環境となる情報処理装置１００において永続性を実現することができる。したがって、これまでのように本来のデータフローに対して永続化のための技巧的なフローを追加する必要がなくなり、プログラム開発の効率向上を図ることができるとともに、プログラムの可読性を向上させることができる。また、永続的な状態がJavaScriptの変数としてアクセスできるため、プログラミングが容易になる。また、ファンクションノードの実行がアトミックになり、信頼性が向上する。
【００３６】
（変形例）
上述の第１実施形態の情報処理装置１００は、様々なかたちでの最適化が可能である。つまり、構成等に若干の追加・変更を加えることにより、性能的な改善が実現される。以下では、プログラムに対応するプログラムＩＤの概念を導入することによる最適化の例を変形例として説明する。なお、以下で示す変形例以外にも、当業者が成し得るさまざまな既存技術による最適化が可能である。
【００３７】
プログラムＩＤは、ファンクションノード１８０のプログラム１８２に対して割り当てられる固有の識別情報であり、プログラム１８２を表すコードそのものよりもデータサイズが十分に小さい（例えば１６バイト長）。そのため、プログラム１８２の代わりにプログラムＩＤを用いることにより、データサイズが小さくなり、容量の削減や転送時間の短縮などの効果がある。
【００３８】
本実施形態では、情報処理装置１００にファンクションノード１８０がデプロイされる際に、そのファンクションノード１８０にユーザ定義されたプログラム１８２に対応するプログラムＩＤが決定される。そして、ファンクションノード制御部１１０は、プログラムＩＤとプログラム１８２の組をジャーナルログとしてジャーナルログ記憶部１６０に記録するとともに、プログラムＩＤとプログラム１８２の組を永続的実行部１２０の仮想マシン部１３０に送る。仮想マシン部１３０に送られたプログラムＩＤとプログラム１８２の組は、仮想マシン部１３０内に登録される。このとき、仮想マシン部１３０は、プログラム１８２を構文解析し、内部形式に合せてコンパイルしたプログラム１８２をプログラムＩＤと対応付けて記憶しておくことが望ましい。なお、ファンクションノード１８０のプログラム１８２が変更される際は、変更されたプログラム１８２を含む新たなファンクションノード１８０がデプロイされるので、同様の処理が行われる。
【００３９】
また、本実施形態では、ファンクションノード１８０の入力メッセージが入力されると、ファンクションノード制御部１１０が、その入力メッセージとプログラム１８２の本体との組ではなく、入力メッセージとプログラムＩＤとの組をジャーナルログとしてジャーナルログ記憶部１６０に記録する。また、ファンクションノード制御部１１０は、入力メッセージとプログラムＩＤとを、永続的実行部１２０の仮想マシン部１３０に送る。仮想マシン部１３０は、ファンクションノード制御部１１０から送られた入力メッセージとプログラムＩＤを引数として後述するcallScriptを実行することにより、ファンクションノード１８０のプログラム１８２を実行し、実行結果をファンクションノード制御部１１０に返す。
【００４０】
また、リカバリ部１４０は、情報処理装置１００の起動時に仮想マシン部１３０を最新の状態にロールフォワードする際に、入力メッセージとプログラムＩＤの組からなるジャーナルログをジャーナルログ記憶部１６０から読み出して、仮想マシン部１３０内で入力メッセージとプログラムＩＤを引数としてcallScriptを実行させる。
【００４１】
以下では、本変形例のファンクションノード制御部１１０、仮想マシン部１３０およびリカバリ部１４０の処理手順を、フローチャートに沿って説明する。図１１は、本変形例におけるファンクションノード制御部１１０の処理手順の一例を示すフローチャートであり、情報処理装置１００にファンクションノード１８０がデプロイされたときに実行される処理の流れを示している。
【００４２】
情報処理装置１００にファンクションノード１８０がデプロイされると、ファンクションノード１８０に定義されたプログラム１８２に対応するプログラムＩＤが決定される（ステップＳ４０１）。ファンクションノード制御部１１０は、まず、ファンクションノード１８０に定義された永続的実行環境名１８１をキーとして、ファンクションノード１８０に関連付いた永続的実行環境１９０を特定する（ステップＳ４０２）。そして、ファンクションノード制御部１１０は、ステップＳ４０１で決定されたプログラムＩＤとプログラム１８２との組をジャーナルログとして、ジャーナルログ記憶部１６０に記録する（ステップＳ４０３）。さらに、ファンクションノード制御部１１０は、これらプログラムＩＤとプログラム１８２とを、ステップＳ４０２で特定した永続的実行環境１９０に対応する永続的実行部１２０の仮想マシン部１３０に送る（ステップＳ４０４）。
【００４３】
仮想マシン部１３０は、ファンクションノード制御部１１０からプログラムＩＤとファンクションノード１８０のプログラム１８２を受け取ると、上述の構文解析部１３３でプログラム１８２を構文解析し、プログラム１８２を仮想マシン部１３０の内部形式に合せて変換（コンパイル）する。コンパイルされたプログラム１８２は、例えば図１２に示す対応表１３８のように、プログラムＩＤと対応付けられて仮想マシン部１３０の内部に登録される。
【００４４】
図１３は、本変形例におけるファンクションノード制御部１１０の処理手順の一例を示すフローチャートであり、ファンクションノード１８０の入力メッセージが入力されたときに実行される処理の流れを示している。ファンクションノード１８０の入力メッセージが入力ポート１１１に入力されると、ファンクションノード制御部１１０は、まず、ファンクションノード１８０に定義された永続的実行環境名１８１をキーとして、ファンクションノード１８０に関連付いた永続的実行環境１９０を特定する（ステップＳ５０１）。そして、ファンクションノード制御部１１０は、入力ポート１１１から入力された入力メッセージと、ファンクションノードに定義されたプログラム１８２に対応するプログラムＩＤとの組をジャーナルログとして、ジャーナルログ記憶部１６０に記録する（ステップＳ５０２）。さらに、ファンクションノード制御部１１０は、これら入力メッセージとプログラムＩＤとを、ステップＳ５０１で特定した永続的実行環境１９０に対応する永続的実行部１２０の仮想マシン部１３０に送る（ステップＳ５０３）。その後、仮想マシン部１３０からプログラム１８２の実行結果が送られてくると、ファンクションノード制御部１１０は、その実行結果を仮想マシン部１３０から受け取って、出力メッセージとして出力ポート１１２から出力する（ステップＳ５０４）。
【００４５】
図１４は、本変形例における仮想マシン部１３０の処理手順の一例を示すフローチャートであり、ファンクションノード制御部１１０から入力メッセージとプログラムＩＤを受け取ったときのcallScriptの実行手順を示している。ファンクションノード制御部１１０から入力メッセージとプログラムＩＤを受け取ると、仮想マシン部１３０は、例えば図１２に示した対応表１３８を参照し、ファンクションノード制御部１１０から受け取ったプログラムＩＤに対応するコンパイルされたプログラム１８２を取得する（ステップＳ６０１）。そして、仮想マシン部１３０は、ファンクションノード制御部１１０から受け取った入力メッセージを引数として、ステップＳ６０１で取得したコンパイルされたプログラム１８２を実行し（ステップＳ６０２）、実行結果をファンクションノード制御部１１０に送る（ステップＳ６０３）。
【００４６】
図１５は、本変形例におけるリカバリ部１４０の処理手順の一例を示すフローチャートである。情報処理装置１００の起動時に、リカバリ部１４０は、まず、最新のスナップショットをスナップショット記憶部１７０から読み出し、仮想マシン部１３０内に展開する（ステップＳ７０１）。そして、リカバリ部１４０は、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあるかどうかを確認する（ステップＳ７０２）。そして、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあれば（ステップＳ７０２：Ｙｅｓ）、ジャーナルログの読み出し位置を最新のスナップショット直後に設定する（ステップＳ７０３）。一方、最新のスナップショットの書き出し時刻よりも後に記録されたジャーナルログがなければ（ステップＳ７０２：Ｎｏ）、そのまま処理を終了する。
【００４７】
次に、リカバリ部１４０は、ジャーナルログ記憶部１６０から、設定した読み出し位置のジャーナルログを読み出す（ステップＳ７０４）。そして、読み出したジャーナルログが入力メッセージとプログラムＩＤとの組であるかを確認する（ステップＳ７０５）。ここで、読み出したジャーナルログが入力メッセージとプログラムＩＤとの組であれば（ステップＳ７０５：Ｙｅｓ）、ジャーナルログを構成する入力メッセージとプログラムＩＤを引数として、仮想マシン部１３０内でcallScriptを実行させる（ステップＳ７０６）。一方、読み出したジャーナルログがプログラムＩＤとファンクションノード１８０のプログラム１８２との組であれば、これらプログラムＩＤとプログラム１８２との組を仮想マシン部１３０内に登録させる（ステップＳ７０７）。
【００４８】
その後、リカバリ部１４０は、ジャーナルログの読み出し位置を次のジャーナルログの記録時刻にシフトし（ステップＳ７０８）、読み出し位置のジャーナルログがあるか否かを確認する（ステップＳ７０９）。そして、読み出し位置のジャーナルログがあれば（ステップＳ７０９：Ｙｅｓ）、ステップＳ７０４に戻って以降の処理を繰り返す。一方、読み出し位置のジャーナルログがなければ（ステップＳ７０９：Ｎｏ）、処理を終了する。
【００４９】
以上のように、本変形例では、ファンクションノード１８０の入力メッセージが入力されたときに、ファンクションノード１８０のプログラム１８２の本体に代えてプログラムＩＤを入力メッセージとともにジャーナルログとして記録したり、仮想マシン部１３０に送ったりしている。したがって、ジャーナルログのサイズを小さくし、ジャーナルログ記憶部１６０の容量削減を図ることができるとともに、仮想マシン部１３０に送るデータサイズを小さくし、転送時間の短縮を図ることができる。さらに、本変形例では、ファンクションノード１８０のプログラム１８２を仮想マシン部１３０内に登録する際に、事前にプログラム１８２の構文解析を行いコンパイルしておくことで、ファンクションノード１８０の入力メッセージが入力されたときに、プログラム１８２の実行時間を短縮することができる。
【００５０】
＜第２実施形態＞
本実施形態は、上述の第１実施形態に機能を加えたものである。追加の機能は、永続的実行部１２０を起点とするメッセージをフロー内に送り込む機能である。
【００５１】
永続的実行環境１９０に対応して設けられる永続的実行部１２０は、単なる永続的なデータストアとして機能するというだけでなく、実行環境自体が永続的であるから、その中でのプログラムの実行もまた永続的である。したがって、これを積極的に利用するならば、永続的実行部１２０を起点としたメッセージが外部に伝達されるような設計も可能である。しかし、他機器へのアクセス等は通常ＦＢＰの処理ノードとして表現されており、これは永続的実行環境１９０と関連していない既存の処理ノードである。そこで本実施形態では、イベントリスナノードと呼ぶ処理ノードを用いることにより、この間の接続を可能にする。イベントリスナノードは、永続的実行環境名とイベント名がユーザ定義される処理ノードである。
【００５２】
図１６は、本実施形態に係る情報処理装置１００の機能的な構成例を示すブロック図である。本実施形態に係る情報処理装置１００は、図１６に示すように、上述の第１実施形態の構成に対して、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされたイベントリスナノード２００に対応して設けられるイベントリスナノード制御部２１０が追加された構成である。ＦＢＰのプログラミング環境からデプロイされたイベントリスナノード２００は、ユーザ定義された永続的実行環境名２０１およびイベント名２０２を含む。イベントリスナノード２００の永続的実行環境名２０１と永続的実行環境１９０の永続的実行環境名１９１とを一致させることで、これらイベントリスナノード２００と永続的実行環境１９０とが関連付けられる。
【００５３】
本実施形態における仮想マシン部１３０は、上述の第１実施形態と同様にファンクションノード１８０のプログラムを実行するが、このプログラムの実行中にemit関数を実行すると、該emit関数の引数であるイベント名とメッセージをイベントリスナノード制御部２１０に送る。emit関数は、永続的実行環境１９０の予約変数として、仮想マシン部１３０に固有のグローバルスコープ１３５に登録された予約変数“emit”に格納されるJavaScriptの関数であり、イベント名とメッセージを引数とする。
【００５４】
イベントリスナノード制御部２１０は、仮想マシン部１３０からイベント名とメッセージを受け取ると、受け取ったイベント名がイベントリスナノード２００にユーザ定義されたイベント名２０２と一致するか否かを確認し、一致する場合に仮想マシン部１３０から受け取ったメッセージを出力ポート２１１から出力する。
【００５５】
図１７は、本実施形態における仮想マシン部１３０の処理手順の一例を示すフローチャートであり、ファンクションノード１８０のプログラム１８２を実行する際の処理の流れを示している。仮想マシン部１３０は、ファンクションノード制御部１１０から入力メッセージとプログラム１８２を受け取ると、受け取った入力メッセージを引数とするプログラム１８２の実行を開始する（ステップＳ８０１）。そして、プログラム１８２の実行中、emit関数の実行を監視し（ステップＳ８０２）、emit関数を実行した場合は（ステップＳ８０２：Ｙｅｓ）、emit関数の引数であるイベント名とメッセージをイベントリスナノード制御部２１０に送る（ステップＳ８０３）。その後、プログラム１８２の実行が終了すると（ステップＳ８０４：Ｙｅｓ）、仮想マシン部１３０は、プログラム１８２の実行結果をファンクションノード制御部１１０に送り（ステップＳ８０５）、処理を終了する。
【００５６】
図１８は、イベントリスナノード制御部２１０の処理手順の一例を示すフローチャートである。イベントリスナノード制御部２１０は、仮想マシン部１３０からイベント名とメッセージを受け取ると、受け取ったイベント名がイベントリスナノード２００に定義されたイベント名２０２と一致するか否かを確認する（ステップＳ９０１）。そして、仮想マシン部１３０から受け取ったイベント名がイベントリスナノード２００に定義されたイベント名２０２と一致する場合は（ステップＳ９０１：Ｙｅｓ）、仮想マシン部１３０から受け取ったメッセージを出力メッセージとして、出力ポート２１１から出力する（ステップＳ９０２）。一方、仮想マシン部１３０から受け取ったイベント名がイベントリスナノード２００に定義されたイベント名２０２と一致しない場合は（ステップＳ９０１：Ｎｏ）、仮想マシン部１３０から受け取ったメッセージを破棄して処理を終了する。
【００５７】
以上のように、本実施形態では、ＦＢＰのプログラミング環境から情報処理装置１００にイベントリスナノード２００をデプロイすることで情報処理装置１００にイベントリスナノード制御部２１０が設けられ、永続的実行環境１９０の予約変数に格納したemit関数が実行されるとemit関数の引数となるメッセージを出力する。したがって、永続的実行部１２０を起点としたメッセージを外部に伝達することができる。
【００５８】
＜第３実施形態＞
本実施形態は、上述の第１実施形態に機能を加えたものである。追加の機能は、読み込み専用（リードオンリ）での永続的実行部１２０へのアクセス機能である。
【００５９】
上述の第１実施形態では、例えば単純にグローバルスコープ１３５の変数ｘの値を参照するだけだとしても、ｘの値を返すプログラム“return  x”を実行しなければならない。内部的には、このプログラムがジャーナルログとしてジャーナルログ記憶部１６０に記録され、このプログラムを実行するためのファンクションスコープ１３４が生成され、プログラムが実行され、変数名解決部１３６が変数ｘを解決しその値を得るといった手順が取られる。しかし、リードオンリのアクセスは仮想マシン部１３０の状態を変更するものではないため、そもそも仮想マシン部１３０の状態を復元することに備えて上述の手順で処理を行う必要はない。そこで、本実施形態では、リードオンリで永続的実行部１２０にアクセスするための機能としてリードオンリアクセス部を設け、グローバルスコープ１３５に登録された変数の値を参照するだけであれば、このリードオンリアクセス部を通じて永続的実行部１２０にアクセスできるようにする。
【００６０】
また、本実施形態では、グローバルスコープ１３５に登録された変数の値を参照する処理ノードとして、テンプレート処理ノードを例示する。テンプレート処理ノードは、ＨＴＭＬ（HyperText  Markup  Language）文書等のテンプレートがユーザ定義される処理ノードであり、埋め込み箇所には変数名や変数名を使った式が指定される。また、本実施形態で使用するテンプレート処理ノードは、永続的実行環境名がユーザ定義されることで、永続的実行環境１９０と関連付けられる。
【００６１】
図１９は、本実施形態に係る情報処理装置１００の機能的な構成例を示すブロック図である。本実施形態に係る情報処理装置１００は、図１９に示すように、上述の第１実施形態の構成に対して、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされたテンプレート処理ノード２２０に対応して設けられるテンプレート処理ノード制御部２３０と、リードオンリアクセス部２４０とが追加された構成である。ＦＢＰのプログラミング環境からデプロイされたテンプレート処理ノード２２０は、ユーザ定義された永続的実行環境名２２１およびテンプレート２２２を含む。テンプレート処理ノード２２０の永続的実行環境名２２１と永続的実行環境１９０の永続的実行環境名１９１とを一致させることで、これらテンプレート処理ノード２２０と永続的実行環境１９０とが関連付けられる。
【００６２】
リードオンリアクセス部２４０は、上述のようにリードオンリで永続的実行部１２０にアクセスするための機能であり、仮想マシン部１３０のグローバルスコープ１３５に登録された変数の値を取得する。リードオンリアクセス部２４０が値を取得する際、仮想マシン部１３０の状態を変化させない。
【００６３】
テンプレート処理ノード制御部２３０は、テンプレート処理ノード２２０の入力メッセージが入力ポート２３１に入力されると、テンプレート処理ノード２２０にユーザ定義されたテンプレート２２２の埋め込み箇所に指定された変数名を、仮想マシン部１３０のグローバルスコープ１３５に登録された変数の変数名として、リードオンリアクセス部２４０を通じて、仮想マシン部１３０のグローバルスコープ１３５からその値を読み出す。そして、テンプレート処理ノード制御部２３０は、テンプレート２２２の埋め込み箇所に、リードオンリアクセス部２４０を通じて仮想マシン部１３０のグローバルスコープ１３５から読み出した値を埋め込み、この値を埋め込んだテンプレート２２２を出力メッセージとして出力ポート２３２から出力する。なお、変数名を使った式の場合は、同様にリードオンリアクセス部２４０を通じて変数名を値に置き換えた後、式が計算され、その結果がテンプレート２２２に埋め込まれる。この式の計算は永続的実行部１２０の仮想マシン部１３０の外、つまり仮想マシン部１３０とは別のインスタンスで実行される。
【００６４】
以上のように、本実施形態では、リードオンリで永続的実行部１２０にアクセスするリードオンリアクセス部２４０を設け、テンプレート処理ノード制御部２３０が仮想マシン部１３０のグローバルスコープ１３５に登録された変数の値を参照する際に、リードオンリアクセス部２４０を通じて値を取得するようにしている。したがって、永続的実行部１２０にアクセスするたびにジャーナルログを記録するといった手順を踏む必要はなく、その分、実行性能が向上するとともに、情報処理装置１００の起動時に仮想マシン部１３０の状態を復元するのに要するリカバリ時間が短縮される。
【００６５】
＜第４実施形態＞
本実施形態は、永続的実行部１２０にリードオンリでアクセスするためのリードオンリアクセス部２４０を備える点は上述の第３実施形態と共通であるが、グローバルスコープ１３５に登録された変数の値を参照する処理ノードが第３実施形態とは異なる。すなわち、本実施形態では、グローバルスコープ１３５に登録された変数の値を参照する処理ノードとして、リードオンリファンクションノードを例示する。
【００６６】
リードオンリファンクションノードは、プログラムをユーザ定義できる点で上述のファンクションノード１８０と同様であるが、プログラムの実行自体は独自のインスタンスで行い、プログラム内で未定義の変数からの読み出しに関しては永続的実行環境１９０を利用する処理ノードである。
【００６７】
図２０は、本実施形態に係る情報処理装置１００の機能的な構成例を示すブロック図である。本実施形態に係る情報処理装置１００は、図２０に示すように、上述の第３実施形態のテンプレート処理ノード制御部２３０に代えて、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされたリードオンリファンクションノード２５０に対応して設けられるリードオンリファンクションノード制御部２６０を備える。ＦＢＰのプログラミング環境からデプロイされたリードオンリファンクションノード２５０は、ユーザ定義された永続的実行環境名２５１およびプログラム２５２を含む。リードオンリファンクションノード２５０の永続的実行環境名２５１と永続的実行環境１９０の永続的実行環境名１９１とを一致させることで、これらリードオンリファンクションノード２５０と永続的実行環境１９０とが関連付けられる。
【００６８】
リードオンリファンクションノード制御部２６０は、リードオンリファンクションノード２５０の入力メッセージが入力ポート２６１に入力されると、その入力メッセージを引数としてリードオンリファンクションノード２５０にユーザ定義されたプログラム２５２を実行し、実行結果を出力メッセージとして出力ポート２６２から出力する。リードオンリファンクションノード制御部２６０によるプログラム２５２の実行は、永続的実行部１２０の仮想マシン部１３０とは別の固有のインスタンスで行われ、仮想マシン部１３０の状態に影響を及ぼさない。
【００６９】
リードオンリファンクションノード制御部２６０は、プログラム２５２を実行する際、プログラム２５２内で未定義の変数からの読み出しに関しては、リードオンリアクセス部２４０を通じて、仮想マシン部１３０のグローバルスコープ１３５からその値を読み出す。なお、プログラム２５２内で未定義の変数への書き込みがあった場合には、リードオンリファンクションノード制御部２６０は、まずリードオンリアクセス部２４０を通じて仮想マシン部１３０のグローバルスコープ１３５からその値を読み出す。そして、読み出した値を書き込もうとしている値と比較して、異なっているならば参照エラーのエクセプションとする。一方、仮想マシン部１３０のグローバルスコープ１３５から読み出した値が書き込もうとしている値と一致している場合には、実際の書き込みは行わずに、書き込みが成功したかのようにふるまう。
【００７０】
なお、リードオンリファンクションノード２５０は、上述のファンクションノード１８０とシームレスに切り替えられるようにしておくと、プログラミング環境での使い勝手が向上する。具体的には、プログラミング環境で表示するＵＩ上ではファンクションノード１８０とリードオンリファンクションノード２５０とを兼用の処理ノードとして見せ、リードオンリの属性をチェックボックス等で切り替えられるようにするといった方法が考えられる。
【００７１】
以上のように、本実施形態では、リードオンリファンクションノード制御部２６０が仮想マシン部１３０のグローバルスコープ１３５に登録された変数の値を参照する際に、リードオンリアクセス部２４０を通じて値を取得するようにしている。したがって、上述の第３実施形態と同様に、永続的実行部１２０にアクセスするたびにジャーナルログを記録するといった手順を踏む必要はなく、その分、実行性能が向上するとともに、情報処理装置１００の起動時に仮想マシン部１３０の状態を復元するのに要するリカバリ時間が短縮される。
【００７２】
＜第５実施形態＞
本実施形態は、上述の各実施形態の情報処理装置１００の機能を利用して、過去の任意の時刻における仮想マシン部１３０の状態を再現できるようにしたものである。すなわち、情報処理装置１００は電源オフ後の起動時に、スナップショット記憶部１７０に記録されたスナップショットとジャーナルログ記憶部１６０に記録されたジャーナルログとを利用して、永続的実行部１２０の仮想マシン部１３０を最新の状態にロールフォワードする。これと同様の手順で、スナップショットとジャーナルログとを利用することにより、過去の任意の時刻における仮想マシン部１３０の状態を再現することができる。
【００７３】
なお、仮想マシン部１３０の状態を再現する装置（以下、これを「再現装置」と呼ぶ）は、その仮想マシン部１３０を備える情報処理装置１００とは別の装置である。再現装置は、例えば、ネットワークを介して情報処理装置１００と接続される。あるいは、情報処理装置１００に対して再現装置を直接接続する構成であってもよい。また、情報処理装置１００のスナップショット記憶部１７０に記録されたスナップショットとジャーナルログ記憶部１６０に記録されたジャーナルログを記録媒体に格納し、この記録媒体を再現装置に接続する構成であってもよい。上述の各実施形態では、情報処理装置１００としてゲートウェイと呼ばれるＩｏＴ機器を想定するため再現装置を情報処理装置１００とは別の装置としているが、情報処理装置１００自体がユーザインタフェースとなるコンソールを備える構成であれば、再現装置を情報処理装置１００内部の機能として実現することもできる。再現装置は、情報処理装置１００のトラブル解析などで過去の状態を詳細に解析したい場合に強力なツールとなり、実用上有用な機能である。
【００７４】
本実施形態では、情報処理装置１００と再現装置とがネットワークを介して接続された情報処理システムを例に説明する。図２１は、本実施形態に係る情報処理システムの概略構成を示すブロック図である。情報処理システムは、図２１に示すように、上述の実施形態として説明したいずれかの情報処理装置１００と再現装置３００とがネットワーク３５０を介して接続された構成である。再現装置３００は、例えば、情報処理装置１００と同様に汎用のコンピュータとしてのハードウェア資源と、コンピュータの周辺機器としてユーザインタフェースとなるコンソールとを備える。再現装置３００は、コンピュータ上で実行されるプログラム（ソフトウェア）とコンソールとを用いて実現される機能的な構成要素として、図２１に示すように、コンソール部３１０と状態再現部３２０とを備える。
【００７５】
コンソール部３１０は、過去の任意の時刻（情報処理装置１００の仮想マシン部１３０の状態を再現しようとする対象となる時刻）を指定するユーザ操作を受け付ける。状態再現部３２０は、情報処理装置１００のリカバリ部１４０と同様の手法により、ユーザ操作により指定された時刻における情報処理装置１００の仮想マシン部１３０の状態を再現する。すなわち、状態再現部３２０は、ユーザ操作により指定された時刻よりもさらに過去のある時刻に記録されたスナップショットを情報処理装置１００から取得して再現装置３００の内部メモリ上に展開することで、その時刻における仮想マシン部１３０の状態を内部メモリ上に再現する。そして、状態再現部３２０は、その時刻からユーザ操作により指定された時刻までの間に記録されたジャーナルログを情報処理装置１００から取得し、各ジャーナルログを構成する入力メッセージを引数としたプログラムの実行を内部メモリ上で順次行うことにより、ユーザ操作により指定された時刻における仮想マシン部１３０の状態を再現する。
【００７６】
どの時刻の仮想マシン部１３０の状態を再現するかは、例えば、ジャーナルログに付けられたタグにより識別することができる。標準では、ジャーナルログに対して記録日時を表すタグとしてタイムスタンプが付加されるが、記録するジャーナルログが所定の条件を満たしたときに、その条件を表す文字列などをタグとして付加したり、ジャーナルログ記憶部１６０に記録されているジャーナルログに繰り返し現れる連続パターンを認識することにより、パターンに変化があったときに自動的にタグを付加したりといったことも可能である。
【００７７】
コンソール部３１０は、例えば、タグが付加されたジャーナルログの一覧を表示して、その中から所望のジャーナルログを選択するユーザ操作を受け付ける構成とすることができる。この場合、一般にジャーナルログ記憶部１６０に記録されたジャーナルログは大量にあるので、時系列での範囲限定や、特定のタグの文字列の検索・絞り込み機能などを備えて、その表示を行うことが望ましい。
【００７８】
なお、タグは、ジャーナルログに付加する形態ではなく、通常のジャーナルログとは別のエントリとして、タグエントリをジャーナルログ記憶部１６０に記録する構成であってもよい。この場合、コンソール部３１０は、タグエントリの一覧を表示して、その中から所望のタグエントリを選択するユーザ操作を受け付ける構成とすることができる。この構成の場合、ユーザ操作により選択されたタグエントリの直前に記録されたジャーナルログを仮想マシン部１３０に反映させた状態が、再現すべき仮想マシン部１３０の状態となる。
【００７９】
図２２は、本実施形態に係る情報処理装置１００の機能的な構成例を示すブロック図である。本実施形態に係る情報処理装置１００は、図２２に示すように、上述の第１実施形態の構成に対して、タグ付け部２７０が追加された構成である。なお、上述の第１実施形態では、リカバリ部１４０が仮想マシン部１３０を最新の状態に復元するために利用するのは、最新のスナップショットとそれ以降に記録されたジャーナルログであるため、最新のスナップショットが記録されるたびにそれ以前に記録されたスナップショットおよびジャーナルログを削除してもよい。これに対し本実施形態では、過去の任意の時刻における仮想マシン部１３０の状態を再現するため、スナップショット記憶部１７０およびジャーナルログ記憶部１６０の容量に応じて、可能な限り過去のスナップショットとジャーナルログを保存しておくことが望ましい。
【００８０】
タグ付け部２７０は、ジャーナルログの記録時に、そのジャーナルログに対して日付や任意の文字列などをタグとして付加する。タグ付け部２７０は、上述のように、ジャーナルログが所定の条件を満たしたときに、その条件を表す所定の文字列などをタグとして付加する構成であってもよいし、ジャーナルログ記憶部１６０に記録されているジャーナルログに繰り返し現れる連続パターンを認識することにより、パターンに変化があったときに、変化の内容を表す文字列などを自動的にタグとして付加する構成であってもよい。また、このような構成の場合には、タグ付け部２７０は上述のように、通常のジャーナルログとは別のエントリとして、タグエントリをジャーナルログ記憶部１６０に記録してもよい。
【００８１】
情報処理装置１００がこのようなタグ付け部２７０を備えることで、再現装置３００のコンソール部３１０は、タグが付与されたジャーナルログの一覧あるいはタグエントリの一覧を表示して、この一覧の中から所望のジャーナルログあるいはタグエントリを選択する操作を、仮想マシン部１３０の状態を再現すべき時刻を指定するユーザ操作として受け付けることができる。
【００８２】
図２３は、再現装置３００の処理手順の一例を示すフローチャートである。まず、コンソール部３１０が、仮想マシン部１３０の状態を再現すべき時刻を指定するユーザ操作を受け付ける（ステップＳ１００１）。そして、状態再現部３２０が、ユーザ操作により指定された時刻の直前に記録されたスナップショットを情報処理装置１００から取得し、取得したスナップショットをメモリ上に展開する（ステップＳ１００２）。
【００８３】
次に、状態再現部３２０は、取得したスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあるかどうかを確認する（ステップＳ１００３）。そして、取得したスナップショットの書き出し時刻よりも後に記録されたジャーナルログがあれば（ステップＳ１００３：Ｙｅｓ）、情報処理装置１００から取得するジャーナルログの時刻を、取得したスナップショットの直後に設定する（ステップＳ１００４）。一方、取得したスナップショットの書き出し時刻よりも後に記録されたジャーナルログがなければ（ステップＳ１００３：Ｎｏ）、そのまま処理を終了する。
【００８４】
次に、状態再現部３２０は、設定したジャーナルログの時刻がユーザ操作により指定された時刻よりも後かどうかを確認する（ステップＳ１００５）。ここで、設定したジャーナルログの時刻がユーザ操作により指定された時刻以前であれば（ステップＳ１００５：Ｎｏ）、状態再現部３２０は、設定した時刻のジャーナルログを情報処理装置１００から取得し（ステップＳ１００６）、取得したジャーナルログを構成する入力メッセージを引数として、その取得したジャーナルログを構成するプログラム１８２をメモリ上で実行する（ステップＳ１００７）。その後、状態再現部３２０は、取得するジャーナルログの時刻を次のジャーナルログの記録時刻にシフトし（ステップＳ１００８）、ステップＳ１００５に戻って以降の処理を繰り返す。そして、情報処理装置１００から取得するジャーナルログの時刻がユーザ操作により指定された時刻よりも後になると（ステップＳ１００５：Ｙｅｓ）、処理を終了する。
【００８５】
なお、以上の説明では、再現装置３００が情報処理装置１００からジャーナルログを時刻順に順次取得するものとして説明したが、再現装置３００は情報処理装置１００からスナップショットを取得する際に、その書き出し時刻からユーザ操作により指定された時刻までの間に記録されたすべてのジャーナルログを一括して取得し、取得したジャーナルログを順次メモリ上に反映させるようにしてもよい。
【００８６】
再現装置３００の状態再現部３２０により再現された任意の時刻における情報処理装置１００の仮想マシン部１３０の状態は、例えば、コンソール部３１０がその状態を何らかのかたちで表示することよりユーザに提示できる。この場合、ユーザはコンソール部３１０を通じて対話的に変数の内容を参照したり、任意のプログラムを実行したりすることができる。
【００８７】
また、再現装置３００は、コンソール部３１０を利用したユーザ操作に応じて、状態再現部３２０により再現された任意の時刻における情報処理装置１００の仮想マシン部１３０の状態に変更を加えることができる。さらに、その再現した時刻以降に記録されたジャーナルログを任意の数だけ情報処理装置１００から取得してメモリ上で順次実行することにより、変更を加えた過去の仮想マシン部１３０の状態をロールフォワードすることができる。そして、例えばコンソール部３１０を利用したユーザ操作に応じて、ロールフォワードした仮想マシン部１３０の状態を再現装置３００から情報処理装置１００に送り、情報処理装置１００の仮想マシン部１３０の状態を、再現装置３００から送られた状態に置き換えることができる。
【００８８】
この機能は、情報処理装置１００の仮想マシン部１３０の過去の状態を変更し、この変更を反映させて仮想マシン部１３０の最新の状態を変更することを可能にする。つまり、情報処理装置１００が記録するジャーナルログは、仮想マシン部１３０の変更履歴ではなく、仮想マシン部１３０で実行されたプログラムとその引数であるため、仮想マシン部１３０の過去の状態を変えた後で最新の状態までロールフォワードすると、その変更を反映させた別の最新の状態が出現するということになる。これを実際の仮想マシン部１３０に適用することで、仮想マシン部１３０の最新の状態を変更することができる。例えば、過去のトラブルのあった時刻の仮想マシン部１３０の状態を再現装置３００により再現し、問題個所を修正した後で、ロールフォワード実行によって最新の状態まで進めると、トラブルの影響を除いた現在の状態が生成できる。
【００８９】
以上のように、本実施形態では、過去の任意の時刻における情報処理装置１００の仮想マシン部１３０の状態を、再現装置３００により再現することができる。そして、再現した仮想マシン部１３０の過去の状態に対して変更を加え、ロールフォワードして仮想マシン部１３０に適用することにより、仮想マシン部１３０の最新の状態を、例えばトラブルの原因となっている過去の問題個所に対する修正を反映した状態に変更することができる。
【００９０】
（変形例）
上述の第５実施形態に係る情報処理装置１００は、ジャーナルログにタグを付ける機能を、ＦＢＰのプログラミング環境で作成されるフローからは独立した機能として実現しているが、例えば、所定の処理が開始・完了するとその時刻のタグを付ける（タグエントリをジャーナルログ記憶部１６０に記録する）ためのタグ付け処理ノードを用いることで、フロー内からタグを付けることも可能である。
【００９１】
図２４は、本変形例に係る情報処理装置１００の機能的な構成例を示すブロック図である。本変形例に係る情報処理装置１００は、図２４に示すように、上述の第５実施形態の構成に対して、ＦＢＰのプログラミング環境から情報処理装置１００にデプロイされたタグ付け処理ノード２８０に対応して設けられるタグ付け処理ノード制御部２９０が追加された構成である。ＦＢＰのプログラミング環境からデプロイされたタグ付け処理ノード２８０は、ユーザ定義された永続的実行環境名２８１を含み、この永続的実行環境名２８１を永続的実行環境１９０の永続的実行環境名１９１と一致させることで、これらタグ付け処理ノード２８０と永続的実行環境１９０とが関連付けられる。
【００９２】
タグ付け処理ノード制御部２９０は、タグ付け処理ノード２８０の入力メッセージが入力ポート２９１に入力されると、その入力メッセージに含まれる文字列をタグ付け部２７０に送る。タグ付け部２７０は、タグ付け処理ノード制御部２９０から文字列を受け取ると、その文字列をファンクションノード制御部１１０が記録するジャーナルログにタグとして付加する。あるいはタグ付け部２７０は、タグ付け処理ノード制御部２９０から受け取った文字列をタグエントリとして、ジャーナルログ記憶部１６０に記録してもよい。
【００９３】
＜第６実施形態＞
上述の各実施形態では、ファンクションノードとこれに関連付けられた永続的実行環境とがＦＢＰのプログラミング環境から同一の情報処理装置１００にデプロイされることを想定したが、ファンクションノードと永続的実行環境とを別の情報処理装置にデプロイし、一方の情報処理装置にファンクションノード制御部１１０が設けられ、他方の情報処理装置に永続的実行部１２０が設けられる構成であってもよい。すなわち、ファンクションノードの入力メッセージが入力される情報処理装置とは別の情報処理装置において、ファンクションノードのプログラムが永続的に実行される構成としてもよい。
【００９４】
図２５は、本実施形態に係る情報処理システムの概略構成を示すブロック図である。本実施形態に係る情報処理システムは、図２５に示すように、ファンクションノード制御部１１０が設けられた情報処理装置１００Ａと、永続的実行部１２０が設けられた情報処理装置１００Ｂとがネットワーク３５０を介して接続された構成である。情報処理装置１００Ａは、例えばゲートウェイなどのＩｏＴ機器であり、情報処理装置１００Ｂはリモートのサーバ装置などである。なお、ジャーナルログ記憶部１６０とスナップショット記憶部１７０は、情報処理装置１００Ｂにある。
【００９５】
本実施形態においても、ファンクションノード制御部１１０と永続的実行部１２０の動作は、基本的には上述の各実施形態と同様である。ただし、ファンクションノード制御部１１０から永続的実行部１２０へ渡される入力メッセージやプログラムは、ＴＣＰ／ＩＰやＨＴＴＰなどの通信プロトコルに従って、情報処理装置１００Ａから情報処理装置１００Ｂへとネットワーク３５０経由で送られる。また、プログラムの実行結果は、同じ通信プロトコルに従って、情報処理装置１００Ｂから情報処理装置１００Ａへとネットワーク３５０経由で送られる。
【００９６】
また、本実施形態では、ファンクションノードと永続的実行環境とを関連付ける永続的実行環境名は、例えばＵＲＬ形式により情報処理装置１００Ｂを指定するなど、永続的実行環境がデプロイされた情報処理装置１００Ｂを含めた名前となる。また、ファンクションノードと永続的実行環境との関連付け以外にも、情報処理装置１００Ａと情報処理装置Ｂとの接続状態が管理され、情報処理装置１００Ａから情報処理装置Ｂへの接続が不能となった場合、ファンクションノードのプログラムの実行は、接続エラーとなって異常終了する。
【００９７】
また、本実施形態では、永続的実行部１２０のリカバリ部１４０が動作するのは、ファンクションノード制御部１１０が設けられた情報処理装置１００Ａ（例えばＩｏＴ機器）の起動時ではなく、永続的実行部１２０が設けられた情報処理装置１００Ｂ（例えばリモートのサーバ装置）の起動時である。
【００９８】
以上のように、本実施形態では、ファンクションノード制御部１１０と永続的実行部１２０とを別々の情報処理装置に設け、ファンクションノードの入力メッセージが入力される情報処理装置１００Ａとは別の情報処理装置１００Ｂにおいて、ファンクションノードのプログラムが永続的に実行される構成である。このため、情報処理装置１００Ａの処理負荷を低減させることができる。
【００９９】
また、本実施形態の構成では、ファンクションノード制御部１１０が設けられた複数の情報処理装置１００Ａ（例えばＩｏＴ機器）を、永続的実行部１２０が設けられた共通の情報処理装置１００Ｂ（例えばリモートのサーバ装置）に接続し、複数の情報処理装置１００Ａに各々設けられたファンクションノード制御部１１０が共通の永続的実行部１２０を共有することができる。
【０１００】
＜第７実施形態＞
本実施形態は、上述の第６実施形態に係る情報処理システムを改良するものである。第６実施形態では、情報処理装置１００Ａから情報処理装置１００Ｂへの接続が不能となった場合、ファンクションノードのプログラムの実行がエラーとなってしまう課題がある。そこで、本実施形態では、情報処理装置１００Ｂだけでなく情報処理装置１００Ａにも永続的実行部１２０を設け、ファンクションノードのプログラムを情報処理装置１００Ｂの永続的実行部１２０だけでなく、情報処理装置１００Ａの永続的実行部１２０においても実行することで、この課題を解決する。
【０１０１】
図２６は、本実施形態に係る情報処理システムの概略構成を示すブロック図である。本実施形態では、図２６に示すように、情報処理装置１００Ａにファンクションノード制御部１１０と永続的実行部１２０Ａとが設けられ、情報処理装置１００Ｂに永続的実行部１２０Ｂが設けられている。永続的実行部１２０Ａと永続的実行部１２０Ｂは、ＦＢＰのプログラミング環境から共通の永続的実行環境が情報処理装置１００Ａと情報処理装置１００Ｂとの双方にデプロイされることで設けられるものである。また、本実施形態では、ジャーナルログ記憶部１６０とスナップショット記憶部１７０が、情報処理装置１００Ａと情報処理装置１００Ｂの双方に設けられる。
【０１０２】
本実施形態では、情報処理装置１００Ａから情報処理装置１００Ｂへの接続が可能な場合（通常状態）、ファンクションノードの入力メッセージやプログラムは、情報処理装置１００Ａと情報処理装置１００Ｂの双方に設けられたジャーナルログ記憶部１６０にジャーナルログとして記録されるとともに、ファンクションノード制御部１１０から永続的実行部１２０Ａと永続的実行部１２０Ｂの双方に送られる。永続的実行部１２０Ａと永続的実行部１２０Ｂは、それぞれファンクションノード制御部１１０から受け取った入力メッセージを引数として、ファンクションノードのプログラムを仮想マシン部１３０で実行し、実行結果をファンクションノード制御部１１０に返す。
【０１０３】
このとき、永続的実行部１２０Ａと永続的実行部１２０Ｂの双方で、ファンクションノードのプログラムの実行順序は一致している必要がある。例えば、入力メッセージＡと入力メッセージＢとがほぼ同時のタイミングでファンクションノードに入力されたとき、入力メッセージＡを引数とするプログラムの実行と、入力メッセージＢを引数とするプログラムの実行とをどちらに先にするか（これはジャーナルログ記憶部１６０への記録順序と一致する）は、永続的実行部１２０Ａと永続的実行部１２０Ｂとで一致していなければならない。
【０１０４】
例えば、永続的実行部１２０Ａでは入力メッセージＡを引数としてプログラムを実行した後、入力メッセージＢを引数としてプログラムを実行し、一方、永続的実行部１２０Ｂでは入力メッセージＢを引数とするプログラムを実行した後、入力メッセージＡを引数としてプログラムを実行すると、双方の実行結果が異なる可能性が出てくるため、これは避けなければならない。プログラムの実行順序を一致させる方法としては、例えば、ファンクションノード制御部１１０がメッセージの送信元として順序番号を付与すればよい。あるいは、入力メッセージとプログラムの組をいったん情報処理装置１００Ａのジャーナルログ記憶部１６０に記録して順序を確定してから、情報処理装置１００Ｂの永続的実行部１２０Ｂに送る構成としてもよい。
【０１０５】
本実施形態では、通常状態であればファンクションノード制御部１１０が永続的実行部１２０Ａと永続的実行部１２０Ｂの双方からプログラムの実行結果を受け取るが、先に受け取った実行結果を出力メッセージとして出力し、後から受け取った実行結果は破棄すればよい。これにより、例えばプログラムの実行中に情報処理装置１００Ａから情報処理装置１００Ｂへの接続が不能になったとしても、有効な結果を得ることができる。また、情報処理装置１００Ｂがサーバ装置であれば、重い処理は情報処理装置１００Ｂで実行した方が速いため、情報処理装置１００Ｂに設けられた永続的実行部１２０Ｂによるプログラムの実行結果が利用され、処理の高速化が実現される。
【０１０６】
また、本実施形態では、情報処理装置１００Ａから情報処理装置１００Ｂへの接続が不能な場合、ファンクションノードの入力メッセージやプログラムは、情報処理装置１００Ａに設けられたジャーナルログ記憶部１６０にジャーナルログとして記録されるとともに、ファンクションノード制御部１１０から永続的実行部１２０Ａに送られる。永続的実行部１２０Ａは、それぞれファンクションノード制御部１１０から受け取った入力メッセージを引数として、ファンクションノードのプログラムを仮想マシン部１３０で実行し、実行結果をファンクションノード制御部１１０に返す。そして、ファンクションノード制御部１１０は、永続的実行部１２０Ａから受け取ったプログラムの実行結果を出力メッセージとして出力する。
【０１０７】
また、本実施形態では、情報処理装置１００Ａから情報処理装置１００Ｂへの接続が再開した場合、情報処理装置１００Ａに設けられたジャーナルログ記憶部１６０に記録されたジャーナルログのうち、情報処理装置１００Ｂ側に送信されていないジャーナルログが順次取り出され、情報処理装置１００Ａから情報処理装置１００Ｂに送られる。情報処理装置１００Ｂでは、情報処理装置１００Ａから送られるジャーナルログを順次ジャーナルログ記憶部１６０に記録するとともに、ジャーナルログを構成する入力メッセージを引数とするプログラムの実行を永続的実行部１２０Ｂの仮想マシン部１３０で順次行うことにより、結果として、永続的実行部１２０Ｂの仮想マシン部１３０の状態を、永続的実行部１２０Ａの仮想マシン部１３０の状態に同期させる。そして、この同期が完了した後、上述の通常状態に復帰する。
【０１０８】
なお、本実施形態では、ファンクションノードのプログラムの実行を２重化した例について説明したが、上述の第６実施形態で説明したように、複数の情報処理装置１００Ａを共通の情報処理装置１００Ｂに接続し、複数の情報処理装置１００Ａの各々に設けられたファンクションノード制御部１１０が情報処理装置１００Ｂに設けられた永続的実行部１２０Ｂを共有する場合には、３重化以上の多重実行の構成とすることも可能である。その場合、ファンクションノードの入力メッセージとプログラムの送信元となるファンクションノード制御部１１０が複数あるため、その間でプログラムの実行順序を一貫性をもって決定する必要がある。これを実現するには、いわゆる分散アルゴリズムの技術を用いればよい。具体的には、例えば特許第６１００３８４号公報にて開示される技術を利用してプログラムの実行順序を決定することができる。プログラムの実行順序が決定したならば、その後は上述の２重化の場合と同様に、それぞれの永続的実行部１２０Ａ，１２０Ｂで同様の処理を行えばよい。また、接続再開時におけるジャーナルログのコピーは、複数の情報処理装置１００Ａのうち、いずれかの情報処理装置１００Ａのジャーナルログ記憶部１６０からコピーすればよい。
【０１０９】
＜補足説明＞
上述した各実施形態における情報処理装置１００の機能は、例えば、一般的なコンピュータを構成するハードウェアと、コンピュータで実行されるプログラム（ソフトウェア）との協働により実現することができる。例えば、ＦＢＰの実行環境となるコンピュータにファンクションノード１８０や永続的実行環境１９０がデプロイされ、このコンピュータをＦＢＰの実行環境として動作させるためのプログラムが実行されることによって、上述したファンクションノード制御部１１０や永続的実行部１２０などの機能的な構成要素がコンピュータ上で実現される。
【０１１０】
図２７は、情報処理装置１００のハードウェア構成の一例を示すブロック図である。情報処理装置１００は、例えば図２７に示すように、ＣＰＵ（Central  Processing  Unit）やＧＰＵ（Graphics  Processing  Unit）などのプロセッサ１０１と、ＲＡＭ（Random  Access  Memory）やＲＯＭ（Read  Only  Memory）などの内部メモリ１０２と、ＨＤＤ（Hard  Disk  Drive）やＳＳＤ（Solid  State  Drive）などのストレージデバイス１０３と、各種周辺機器を接続するための入出力Ｉ／Ｆ１０４と、外部機器と通信を行う通信Ｉ／Ｆ１０５と、を備えた一般的なコンピュータのハードウェア構成を有する。そして、例えば、ストレージデバイス１０３などに、コンピュータをＦＢＰの実行環境として動作させるためのプログラムが格納され、ＦＢＰのプログラミング環境からファンクションノード１８０や永続的実行環境１９０がデプロイされると、これらもストレージデバイス１０３や内部メモリ１０２などに保存される。
【０１１１】
そして、プロセッサ１０１がストレージデバイス１０３などから、コンピュータをＦＢＰの実行環境として動作させるためのプログラムを読み出して内部メモリ１０２上で実行すると、デプロイされたファンクションノード１８０に対応するファンクションノード制御部１１０や、デプロイされた永続的実行環境１９０に対応する永続的実行部１２０などが内部メモリ１０２上に生成される。このほか、デプロイされた処理ノードがあれば、その処理ノードに対応する制御部が同様の手順で内部メモリ１０２上に生成される。また、上述のジャーナルログ記憶部１６０やスナップショット記憶部１７０は、ストレージデバイス１０３や内部メモリ１０２などの記憶装置を用いて実現される。
【０１１２】
コンピュータをＦＢＰの実行環境として動作させるためのプログラムは、例えば、磁気ディスク（フレキシブルディスク、ハードディスクなど）、光ディスク（ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＯＭ、ＤＶＤ±Ｒ、ＤＶＤ±ＲＷ、Ｂｌｕ−ｒａｙ（登録商標）Ｄｉｓｃなど）、半導体メモリ、またはこれに類する記録媒体に記録されて提供される。なお、プログラムを記録する記録媒体は、コンピュータが読み取り可能な記録媒体であれば、その記憶形式は何れの形態であってもよい。また、上記プログラムを、コンピュータに予めインストールするように構成してもよいし、ネットワークを介して配布される上記のプログラムをコンピュータに適宜インストールするように構成してもよい。
【０１１３】
なお、上述した各実施形態における情報処理装置１００は、上述した機能的な構成要素の一部または全部を、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field-Programmable  Gate  Array）などの専用のハードウェアにより実現する構成であってもよい。
【０１１４】
以上、本発明の実施形態を説明したが、この実施形態は例として提示したものであり、発明の範囲を限定することは意図していない。この新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１１５】
１００  情報処理装置
１１０  ファンクションノード制御部
１２０  永続的実行部
１３０  仮想マシン部
１３４  ファンクションスコープ
１３５  グローバルスコープ
１３６  変数名解決部
１４０  リカバリ部
１５０  スナップショット書き出し部
１６０  ジャーナルログ記憶部
１７０  スナップショット記憶部
１８２  プログラム
１９２  初期化プログラム
２１０  イベントリスナノード制御部
２２２  テンプレート
２３０  テンプレート処理ノード制御部
２４０  リードオンリアクセス部
２６０  リードオンリファンクションノード制御部
２７０  タグ付け部
２９０  タグ付け処理ノード制御部
３００  再現装置
３１０  コンソール部
３２０  状態再現部
３５０  ネットワーク
【図１】
2019008384.tif 000003
【図２】
2019008384.tif 000004
【図３】
2019008384.tif 000005
【図４】
2019008384.tif 000006
【図５】
2019008384.tif 000007
【図６】
2019008384.tif 000008
【図７】
2019008384.tif 000009
【図８】
2019008384.tif 000010
【図９】
2019008384.tif 000011
【図１０】
2019008384.tif 000012
【図１１】
2019008384.tif 000013
【図１２】
2019008384.tif 000014
【図１３】
2019008384.tif 000015
【図１４】
2019008384.tif 000016
【図１５】
2019008384.tif 000017
【図１６】
2019008384.tif 000018
【図１７】
2019008384.tif 000019
【図１８】
2019008384.tif 000020
【図１９】
2019008384.tif 000021
【図２０】
2019008384.tif 000022
【図２１】
2019008384.tif 000023
【図２２】
2019008384.tif 000024
【図２３】
2019008384.tif 000025
【図２４】
2019008384.tif 000026
【図２５】
2019008384.tif 000027
【図２６】
2019008384.tif 000028
【図２７】
2019008384.tif 000029