分散オブジェクト環境を学ぶ
連載:HORBと遊ぼう(5)
コンフィグレーションファイルで遊ぼう
(4)HORB実験室 「マルチクライアント・マルチスレッドからの利用」 |
ここまでは、単純な1クライアントからのリモートオブジェクトの利用を想定して説明をしてきました。ここでは、マルチクライアントからマルチスレッドで使われる際に、HORBサーバがどのように送受信するのかを見ていきましょう。ここはちょっと難しいかもしれませんよ。理解できそうもないときはあっさり読み飛ばしてください。
まず、Test2クラスに長い処理を行うためのメソッド「longJob」を追加したクラスをTest3.javaとして作成します。このクラスのlongJobメソッドは、メソッドの入り口で出力し、4秒間スリープし、メソッドの出口で出力するだけのものです。
クライアントはRemoteTest2(リスト6)を使います。このクラスは、2つのスレッドを作成し、作成したスレッドのrunメソッドの中でTest3の代理オブジェクトを作成します。そして、永久ループでlongJobメソッドを呼び出すものです。
コンフィグレーションファイルは、リスト7を使います。この一連のネットワークプログラムはどのように動くか想像できますか? それは後でじっくりと説明します。まずはコンパイルして実行してみましょう。
001:public class Test3{ |
リスト5 Test3.java |
001:public class RemoteTest2{ |
リスト6 RemoteTest2.java |
行 | 記述 | 説明 |
01 |
# # HORB Servers # horbServer[0].name=HORBServer1(9000) horbServer[0].port=9000 # # auto start objects # object[0].className=Test3 object[0].objectID=testObj1 object[1].className=Test3 |
コメント行 HORBサーバの名前 HORBサーバのポート番号
|
リスト7 testconf4.conf |
■コンパイル
prompt>horbc -delete Test3.java |
図11 ソースのコンパイル |
■HORBサーバの起動
prompt>horb -conf testconf4.conf |
図12 testconf4.confを使用したHORBサーバの立ち上げ |
prompt>java RemoteTest2 localhost:9000/testObj1
localhost:9000/testObj2 |
図13 クライアントの立ち上げ |
実行結果から、起動された2つのスレッドが、HORBサーバから起動された2つのデーモンオブジェクトのメソッドを並行に呼び出していることが分かります。
prompt>horb -conf testconf4.conf |
図14 HORBサーバの実行結果 |
■動作イメージ
動作イメージは図4のとおりです。このイメージは、2つのスレッドがそれぞれのオブジェクトのlongJobメッセージを同時に送っているその瞬間をとらえたものです。この図のように、クライアント(JVM)がマルチスレッドで動作し、代理オブジェクトに並行呼び出しをかける場合は、それぞれの呼び出しにRequestServer(&
受信用ソケット)が対応します。その後、どちらかのメソッド呼び出しが完了すると、対応していたRequestServerは、ほかのメッセージ処理に再利用されるのです。
どうですか、動作イメージはつかめましたでしょうか?
図15 クライアントからのマルチスレッド呼び出し時の動作イメージ |
■マルチクライアントからの利用
次はマルチクライアントからの利用を実行してみましょう。まず、先ほどの手順で、サーバとクライアントを起動してください。その後、別のコマンドプロンプトを開いて、もう1つクライアントプログラムを起動してください。
prompt>java RemoteTest2 localhost:9000/testObj1
localhost:9000/testObj2 |
図16 もう1つのクライアントを起動する |
HORBサーバ側では、新たに起動したクライアントプログラムの出力結果が、すでに起動されているクライアントプログラムの出力結果と混在した形で表示されます。
処理名[ test1の1 ] 終了 |
図17 HORBサーバの実行結果 |
■動作イメージ
複数のクライアントからマルチスレッド環境で同時にメソッドを呼び出すと、それぞれのクライアント(JVM)の並行呼び出しの多重度ごとにRequestServerが割り当てられます。また並行的な呼び出しが終わった時点で、クライアントごとにSocketは一定期間プールされ、再度並行呼び出しがある際に再利用されています。また、RequestServerを実行するスレッドは、プロセスの単位で一定量プールされ複数のクライアントからの要求時に再利用されます(このスレッドプールはHORB
ver2.1からサポートされています)。
図18 マルチクライアントからのマルチスレッド呼び出し時の動作イメージ |
このようにHORBは、OSのソケットやスレッドといったコストのかかる資源を大切にしつつ、最大のパフォーマンスを出せるよう設計がなされています。
いかがでしたか。今回は、コンフィグレーションファイルを使ってHORBサーバの起動形態を説明しながら、HORBサーバのアーキテクチャについても説明しました。
Index | |
(1)接続モデルのおさらい (2)コンフィグレーションファイルの使い方 起動してみよう 動作イメージClientの起動 |
|
(3)コンフィグレーションファイルを使ったさまざまな起動方法 起動してみよう 動作イメージ そのほかの設定情報 代理オブジェクトの引数 |
|
(4)HORB実験室「マルチクライアント・マルチスレッドからの利用」 コンパイル 動作イメージ マルチクライアントからの利用 動作イメージ |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|