はじめに
標準のJavaには欠けているものがあり、リアルタイムアプリケーションで使用するのに理想的な言語とは言えません(4ページ目補足解説1「リアルタイムとは」を参照)。1つを挙げるなら、ガベージコレクタ(古いオブジェクトを回収してヒープ領域を解放する内部JVMスレッド)は不測のタイミングで動作し、その実行時間も不特定であるため、アプリケーションの処理にレイテンシと不確定性が生じます。
しかし、標準Javaアプリケーションで問題となるのはガベージコレクタだけではありません。たとえばJavaコードを実行中のコンピュータに合わせて最適化するjust-in-time(JIT)コンパイラはいつでも呼び出し可能であり、コードが最適化済み(JITコンパイル済み)の場合でも呼び出される可能性があります。
また、一般にJava SE(Java Platform, Standard Edition)では、コードで指定したスレッドの優先順位が尊重されません。たとえば、スレッドが最高の優先順位で実行されるように指定しても、実際にはそうならない可能性があります。したがって、他のアプリケーションスレッドがJavaアプリケーションの実行に割り込んできて、不確定性に拍車をかけることがあります。SunのJava Real-time System(Java RTS)は、こういった問題点を解決することを狙っています。
Java RTS
2006年以来、Sunは金融業界(銀行、証券会社、証券取引所)の多数の顧客にJava RTSがタイムクリティカルな金融アプリケーションにもたらすメリットを訴えてきました。Java RTSを利用することで、1つのシステム上にリアルタイムのコンポーネントと非リアルタイムのコンポーネントを同居させ、データを共有することができます。リアルタイムのコンポーネントは、予測性とアプリケーション動作の確定性を向上させます。
Java RTSのバージョン2.0には、ミリ秒以下の有限のレイテンシで動作するリアルタイムガベージコレクタと、20マイクロ秒以下の有限のレイテンシで動作するRTSJ準拠プログラミングモデルが含まれています(詳細については4ページ目補足解説2「Java RTS仮想マシン」を参照)。Java RTS 2.0は、Intel、AMD、またはSPARCプロセッサ搭載のSolaris 10システムのみで動作し、Java 5に完全に準拠します。(Java RTS 2.0の詳細については、筆者が以前にDevXに掲載したリアルタイムJavaに関する記事「Go Inside the Java Real-time System」を参照)。
この記事では、ウォール街の企業や金融機関で一般的なユースケースにおけるJava RTSについて詳しく説明します。
Java RTSと金融システム
金融業界の企業が利用するシステムは、金融市場の動きに随時反応しなければならないため、リアルタイムの動作を必要とします。金融市場は常に動き続けています。この変化のペースが速いか遅いかにかかわらず、市場の急変とトレンドに対して厳密な時間内に対応できなければ、利益を得たり損失を回避したりすることはできません。ウォール街の常識では、市場の勝敗はミリ秒単位の差で決し、投資銀行はその勝負に勝てば年間1億米ドルの利益を上積みできる可能性があるとされています。
金融システムでは、データの受信側(トレーディングシステムなど)とデータの生成側(市場データフィードなど)の両方が、リアルタイム処理能力を必須とするタイムクリティカルなソフトウェアシステムで構成されます。金融システムの利用企業にとって、Javaガベージコレクタやその他の活動によってもたらされる不確定のレイテンシは重大な投資ロスを意味します。逆に、このようなレイテンシを取り除き、確定性を強化すれば、ライバルに対して著しく優位に立つことができます。
Java RTSは、リスクを取り除くことを目的としています。リアルタイム環境においてJava RTSが標準Javaに比べてどのような利点を持つのかを証明するため、本稿では、標準JavaとJava RTSの両方で動作するサンプルの指値/逆指値注文システムを作成しました(指値/逆指値の詳細については4ページ目補足説明3「指値/逆指値注文取引」を参照)。