私は金融業界向けのソリューションに取り組んできました。アプリケーションの主な機能は、大量の入力ファイルをロードし、ダイジェストし、永続ストア内の状態を更新し、要求に応じて永続ストアから抽出を生成する機能です。かなり簡単。Java EEアプリケーションのスケーラビリティ。どのようにそれにアプローチしますか?
入力ファイルは、多数の繰り返しエントリを含む業界標準の形式のXMLラージ(数百メガバイト以上)のメッセージです。永続ストレージはリレーショナルデータベースです。このエンジンは、J2EEアプリケーションサーバーにデプロイ可能なPOJOベースのJavaアプリケーションとして実装されています。
質問は、ソリューションのスケーラビリティとパフォーマンスについてです。アプリケーションがXMLからのエントリを順番に処理する場合、ソリューションのスケーラビリティはやや劣ります。アプリケーションの複数のインスタンスを1つのファイルの処理に関連付ける方法はありません。これが、入力XMLファイルの入力フォームに対する並列処理を導入した理由です。基本的には、個々のエントリの処理をプールから作業者にディスパッチすることです。私はディスパッチのためにJMSを使うことに決めました。ファイルをロードするコンポーネントはストリームを読み取り、単一のエントリを抽出してディスパッチキューに送ります。キューの反対側には多数のコンシューマコンシューマが存在します。それぞれがキューのメッセージを1つ取り出し、そのエントリを処理し、すぐに他のエントリを処理することができます。これは、Webコンテナ内のサーブレットと非常に似ています。私がこのアプローチについて特に強力に見いだしたのは、キューが共有されている限り、リモート・サーバーにデプロイされたアプリケーションの個別のインスタンス内にワーカーが常駐できるということです。残念ながら、すべてのワーカーは永続性ストレージを保持する同じデータベースに接続します。これは、データベースサーバーが同時のワーカーからの負荷を処理するのに十分強力でない場合、ボトルネックになる可能性があります。
このアーキテクチャに関するご意見はありますか?同様のアプリケーションを設計しましたか?あなたのデザインの選択肢は何でしたか?
あなたが提案する多層システムでは、Pregztはトランザクションの整合性に注意する必要があります。たとえば、キューを保持しているマシンがクラッシュすると、データが失われる可能性があります。 JMSにはトランザクション認識が含まれていますが、そのパフォーマンス特性は実装に依存します。 – joev
実際には、JMSセッションとJDBC接続間にまたがるXAグラバルトランザクションを使用します。したがって、すべてがトランザクション的です。さらに、JMSメッセージには永続メッセージとしてフラグが立てられます。これを持っていると、一度だけ配信特性を仮定することができます。 –
Terracottaのようなツールを使用して、JVMヒープの状態を透過的にハードディスクにミラーリングし、システムクラッシュから回復することもできます。 –