討論區: 公開討論 (Thread #3661)

アーキテクチャの変更/通信プロトコルについて (2003-11-01 13:45 by yqt00402 #6444)

 ずっと触っていませんでしたが、心を入れ替えて開発を再開します。で、心を入れ替えたついでにアーキテクチャも大幅に変更します。

 今まではサーブレットのプロセス中ですべての処理を行っていましたが、これからは機能ごとにプロセスを分割します。各プロセス間はTCPで通信し、複数のノードに分散配置することができるようにします。

 モジュールは3種類に分けます。
 ・サーブレットモジュール
 ・番組DBモジュール
 ・予約管理モジュール

 サーブレットモジュールは、番組表の表示や全体の予約管理などを行います。
 番組DBモジュールは、サーブレットモジュールからの要求に応じて番組情報を返します。インターネットから情報を取得し、内部DBにキャッシュしておきます。
 予約管理モジュールは、実際に録画するアプリケーション/ハードウェアの種類ごとに開発し、運用時には1ノードごとに実行されます。

 基本的には既存のコードを流用して書くモジュールを作成しますが、各モジュール間の通信プロトコルを決定する必要があります。逆にこのプロトコルさえ確定してしまえば、java / servletにとらわれないで開発することが可能になります。DBを使わない簡易版の番組DBモジュールなどを作っておくと、ユーザーにとっても敷居が低くなるでしょうし・・・

 そこで、まずはこの通信プロトコルについて考えていきたいと思います。

通信プロトコルについての素案 (2003-11-01 14:54 by yqt00402 #6445)

 モジュール間通信には主に4種類のメッセージがありえます。
 1 コマンド
 2 番組情報
 3 予約情報
 4 その他(コマンドの戻り値としての文字列)

 このうち、2と3については複数のデータが一つのセットとして通信されます。

 技術的には、2つの視点から以下の4つが妥当と考えられます。
 1 オブジェクト通信
  1 CORBA
  2 RMI
 2 XML通信
  1 非同期(SOAP)
  2 同期(TCPソケット通信)

 オブジェクト通信だと、野球延長などへの対応がやり易くなりますが、ネットワーク内での相互依存性が高くなります。リスクと敷居がかなり高いでしょう。
 使い方を考えると同期通信で十分だと思いますが、知見のある方が参加していただけるなら、SOAPもアリだと思います。
 個人的にはTCPソケット通信でXMLを送るのが無難だと考えています。

 
 最後に、メッセージXML(あるいはオブジェクト)の構造については、

 番組情報についてはIEPGを拡張してXML化したものを考えています。
- 例 -
<PROGRAM>
<id>1244124</id> <!-- DB用 -->
<version>1</version>
<station>フジテレビ</station>
<program-title>ギルガメ</program-title>
<program-subtitle>・・・</program-subtitle>
<year>2003</year>
<month>11</month>
<date>02</date>
<start>04:23</start>
<end>04:53</end>
</PROGRAM>

 予約情報についてはWhiteTableを使わずに予約した場合も考えて2通りを許します。
 WhiteTableを使わなかった場合は、開始時間、終了時間を明示します。
- 例 -
<RESERVE>
<reserve-module>localhost</reserve-module> <!-- 予約管理モジュール識別用 -->
<station>フジテレビ</station>
<reserve-name>ギルガメ</reserve-name>
<start>
<year>2003</year>
<month>11</month>
<date>02</date>
<hour>04</hour>
<min>23</min>
</start>
<end>
<year>2003</year>
<month>11</month>
<date>02</date>
<hour>04</hour>
<min>53</min>
</end>
<profile>標準画質</profile>
<note>毎週火曜</note> <!-- 参考情報です -->
</RESERVE>

 WhiteTableを使った場合は、予約する番組情報を明示します。
- 例 -
<RESERVE>
<reserve-module>localhost</reserve-module> <!-- 予約管理モジュール識別用 -->
<station>フジテレビ</station>
<reserve-name>ギルガメ</reserve-name>
<programs>
<program>1244124</program> <!-- 番組情報のID -->
</programs>
<profile>標準画質</profile>
</RESERVE>

コマンドについては、こんな感じ
- 例 -
<COMMAND>
<NAME>SELECT PROGRAMS</NAME>
<PARAMS>
<PARAM name="station">NHK総合</PARAM>
<PARAM name="start">2003/12/31 20:00</PARAM>
<PARAM name="end">2004/01/01 06:00</PARAM>
</PARAMS>
</COMMAND>

戻り値については、コマンドに応じて構成を変えます。
SOAPの場合はコマンドとの対応関係が必要になってきます。
- 例 -
<RETURN>
<COMMAND>SELECT PROGRAMS</COMMAND>
<PROGRAMS>
  <!-- 上記のPROGRAM要素が複数入る -->
<PROGRAM>
   ・
   ・
   ・
</PROGRAM>
</RETURN>

ネットから取得した番組情報を元に予約を行うという性格上、"繰り返し"録画は考えていません。このあたりを含めて異議や要望があればレスをつけていただければと思います。

回覆: #6444