2009-03-12 8 views
1

私は金融業界向けのソリューションに取り組んできました。アプリケーションの主な機能は、大量の入力ファイルをロードし、ダイジェストし、永続ストア内の状態を更新し、要求に応じて永続ストアから抽出を生成する機能です。かなり簡単。Java EEアプリケーションのスケーラビリティ。どのようにそれにアプローチしますか?

入力ファイルは、多数の繰り返しエントリを含む業界標準の形式のXMLラージ(数百メガバイト以上)のメッセージです。永続ストレージはリレーショナルデータベースです。このエンジンは、J2EEアプリケーションサーバーにデプロイ可能なPOJOベースのJavaアプリケーションとして実装されています。

質問は、ソリューションのスケーラビリティとパフォーマンスについてです。アプリケーションがXMLからのエントリを順番に処理する場合、ソリューションのスケーラビリティはやや劣ります。アプリケーションの複数のインスタンスを1つのファイルの処理に関連付ける方法はありません。これが、入力XMLファイルの入力フォームに対する並列処理を導入した理由です。基本的には、個々のエントリの処理をプールから作業者にディスパッチすることです。私はディスパッチのためにJMSを使うことに決めました。ファイルをロードするコンポーネントはストリームを読み取り、単一のエントリを抽出してディスパッチキューに送ります。キューの反対側には多数のコンシューマコンシューマが存在します。それぞれがキューのメッセージを1つ取り出し、そのエントリを処理し、すぐに他のエントリを処理することができます。これは、Webコンテナ内のサーブレットと非常に似ています。私がこのアプローチについて特に強力に見いだしたのは、キューが共有されている限り、リモート・サーバーにデプロイされたアプリケーションの個別のインスタンス内にワーカーが常駐できるということです。残念ながら、すべてのワーカーは永続性ストレージを保持する同じデータベースに接続します。これは、データベースサーバーが同時のワーカーからの負荷を処理するのに十分強力でない場合、ボトルネックになる可能性があります。

このアーキテクチャに関するご意見はありますか?同様のアプリケーションを設計しましたか?あなたのデザインの選択肢は何でしたか?

答えて

2

私はアーキテクチャが一般的に健全だと思います。データベースがワーカーから同時に多数の更新を処理するのに問題がある場合は、アプリケーションのもう一方の側に第2のキューを導入することができます。各ワーカーがタスクを完了すると、そのタスクの結果をキュー。次に、1つのワーカープロセスが2番目のキューから結果オブジェクトを定期的に取得し、大きなバッチ処理でデータベースを更新しますか?これにより、データベースの並行性が低下し、更新の効率が向上する可能性があります。

+0

あなたが提案する多層システムでは、Pregztはトランザクションの整合性に注意する必要があります。たとえば、キュ​​ーを保持しているマシンがクラッシュすると、データが失われる可能性があります。 JMSにはトランザクション認識が含まれていますが、そのパフォーマンス特性は実装に依存します。 – joev

+0

実際には、JMSセッションとJDBC接続間にまたがるXAグラバルトランザクションを使用します。したがって、すべてがトランザクション的です。さらに、JMSメッセージには永続メッセージとしてフラグが立てられます。これを持っていると、一度だけ配信特性を仮定することができます。 –

+0

Terracottaのようなツールを使用して、JVMヒープの状態を透過的にハードディスクにミラーリングし、システムクラッシュから回復することもできます。 –

3

Map/Reduceジョブのための非常に便利なプラットフォームであるHadoopを見ることもできます。大きな利点は、すべてのインフラストラクチャがHadoopによって提供されるため、新しいハードウェアノードだけを適用して拡張できることです。マップとインプリメンテーションの実装は一度だけ行う必要があります。その後、大規模な負荷でクラスタをフィードすることができます。

+0

多分次回:)上記のようにアプリケーションは既に実装されています。私は全体を再実装し、開発者のための新しいプログラミングモデルを導入したくありません。しかし、HadoopやGridGainは私が間違いなく調査するフレームワークです。 –

1

また、Terracotaクラスタリングソリューションもご覧ください。

1

並列処理の場合、Mork0075によると、hadoopは素晴らしい解決策です。実際、多くの企業が非常に大規模なログ分析にこれを使用しています。興味深いプロジェクトHiveは、データウェアハウスのためのハープをベースに構築されています。

とにかく、あなたの現在のデザインはかなりスケーラブルであると思います。データベース上で働くすべての労働者の懸念事項については、ワーカーとデータベースの間にもう1つのメッセージキューを置くことができます。作業者は処理結果をキューに入れ、キューに登録してデータベースを更新する別のプログラムを作成します。欠点は、2つのキューがシステムを複雑にする可能性があることです。もちろん、既存のMQシステムに別のトピックを追加するだけでも構いません。それにより、システムがよりシンプルになります。もう1つのアプローチは、NFSなどの共有ファイルシステムを使用することです。各ワーカーマシンは共有ファイルサーバー上に同じディレクトリをマウントし、各ワーカーはその処理結果を共有ファイルサーバー上の別のファイルに書き込みます。次に、新しいファイルをチェックしてデータベースを更新するプログラムを作成します。このアプローチでは、もう1つの複雑さ、つまり共有ファイルサーバーを導入します。あなたのケースではどちらがよりシンプルであるかを判断することができます。

1

私は最近、Spring Batch 2.0を調査するために余裕を持っています。これはSpringフレームワークに基づくJavaバッチエンジンの新バージョンです。 Spring Batchを実装した人は、このリリースの同時実行と実行の並列化に集中しています。私はそれが有望そうだと言う必要があります!

0

すでにSpring/Java EEを使用している場合は、「同意アーキテクチャ」のソリューションとしてSpring Batchを適用するのは当然です。バットの右

2つの利点:(2.0から始まる)

  1. 春バッチフレームワークは別のパーティションの段階(StepExecution)にあなたのためのパーティションのデータの世話をすることを意味し、その、パーティショニングを実装します

  2. 春はXML +春のバッチヘクタールを扱うための素晴らしいOXMのパッケージを持っている(詳細など。、MessageChannelPartitionHandler配布する​​、例えばTaskExecutorPartitionHandlerまたは)複数のスレッドまたは他の分散システムにこれらのステップの実際の実行を委任春のバッチを試してみてください処理

のレコードに対応する入力XML文書からの断片を抽出StaxEventItemReaderをね。ご不明な点がございましたら、お気軽にお問い合わせください。

EDIT:

またScala/AKKA Actorsおよび/またはScala parallel collectionsを見てください。タスクがsharded/partitioned/distributed =>に該当する場合は、そのActorモデルが対象です。

非JVMソリューションを検討したい場合は、Erlang OTP =>シンプルでエレガントに見てください。ご質問への答えで

0

このアーキテクチャ上のあなたの意見は何ですか?同様のアプリケーションを設計しましたか?あなたのデザインの選択肢は何でしたか?

私はそれが良いアーキテクチャだと思うし、あなたはDBがあなたのボトルネックだと思います。ただし、設計には柔軟性があり、データベースへの入力量を制御できます。

私はノード間でマルチスレッド化を行っています。私は、Haddoopや他の分散処理システムが、データベースへのI/Oを単純に行っているので、あなたがすでに持っているものよりはるかに多くを与えるだろうということは完全にはわかりません。

私は、集中型ロギングのためにJMSキューを使用してsimliarを実装しました。これは、コードへの影響が少なく、ディスクにログを書き込むことで非常にうまく機能しました。あなたのアプリケーションでうまくいくと思います。

関連する問題