2009-04-06 14 views
2

私は現在、高性能のJavaストレージメカニズムが必要です。テラコッタ+コンパス= Hibernate + HSQLDB + JMS?

これは意味:

1) Iは1と10,000以上のオブジェクトを持っている - 多くの関係を。

2)オブジェクトは5秒ごとに更新され、システム障害が発生した場合は最新の更新が維持されます。

3)オブジェクトは、妥当な時間(1〜5秒)でクエリ可能である必要があります。 (IE:このタイムスタンプですべてのオブジェクトを渡すか、これらの位置境界内のすべてのオブジェクトを私に渡してください)。

4)オブジェクトは、さまざまなGlassfishインストールで使用できる必要があります。

現在:

私は必要なrecoverablityを提供するために、ORMとしてHibernateに、オブジェクトを配布するためにJMSを使用して、HSQLDBされています。

私はパフォーマンスに満足していません。特にこれのJMS部分。

Stack Overflowのリサーチを行った後、これがより良い解決策になるかどうか疑問に思っています。私はテラコッタが私に与えるものとは何の経験もないことを覚えておいてください。

私は、Terracottaを使用してシステムの周りにオブジェクトを配布し、それらのオブジェクトの属性を「照会」する能力を与える必要があります。

これは合理的ですか?これらのパフォーマンスの制約を満たすか?他にどのようなソリューションを検討すべきですか?

答えて

2

最初はLuceneはあなたの友人ではありません。 (読み取り専用)

テラコッタは論理レイヤー上で拡大縮小します!問題は処理ロジックに関連していないようです。これは、ストレージ/通信ポイントの周りにもっとあります。

  1. ボトルネックを特定してください!ストレージ/ロジック/ JMSの処理時間とオーバーヘッドのベンチマーク
  2. 良いJMSフレームワーク(例えば、ActiveMQ)と良い/チューニングされた設定でJMSを終了させる。
  3. おそらく、分散キー=>値ストアはあなたの友人です。試してくださいProject Voldemort
  4. HibernateとHSQLに滞在したい場合は、Hibernateの2次キャッシュと接続プーリング(c3po、コンテナ駆動...)をチェックしてください!
1

私は現在、set + listセマンティクスを提供する非常に(非常に)高速のKey/Value分散ハッシュDB用のクライアントを作成しています。 DBはC99であり、GCCが必要です。現在、私は現在の30,000ゲット/秒/秒の障壁を壊すために、良い古いJavaネットワークIOと戦っています。一週間以内にやりたいと思っています。私の口座に私のラインを落とすと、そのショーの時に戻ってきます。

+0

いずれかを含んでいるだろうとので、それはより速く作るためにあなたがアップデート非同期でもバッチすることができますキャッシュとデータベースオフロードメカニズムとしてレコードを使用テラコッタのシステムですこれについての更新? – systemoutprintln

+0

申し訳ありませんが、私はこれを逃しました。 http://github.com/alphazero/jredis/tree/master – alphazero

4

尋ねたことは分かりませんが、HSQLDBからH2に切り替えることから始めたいと思うかもしれません。 H2は比較的新しい純粋なJava DBです。 HSQLDBを書いた同じ人が書いたもので、パフォーマンスははるかに良いと主張しています。私はしばらくそれを使用しており、私はそれに非常に満足しています。それは非常に迅速な移行(Jarの追加、接続文字列の変更、データベースの作成)を行う必要があります。

一般に、私は、別のアーキテクチャでアプリケーションを書き直す前に、自分が持っているものを最大限に活用しようと考えています。最初にボトルネックを特定するためにプロファイリングしてみてください。

1

このような更新頻度が高いと、Luceneはほぼ確実にではありません。あなたが探しているものは、索引付けされた文書を更新する方法がないためです。インデックスにオブジェクトのすべてのバージョンを保存し、最新のタイムスタンプを持つものを選択すると、パフォーマンスが低下します。

私はDBの専門家ではありませんが、最近ニュースに載っている分散型DBソリューションのいずれかを調べるべきだと思います。(CouchDB、Cassandra)

1

あなたはJMSにどのベンダーを使用しているのかは言いませんが、そこにボトルネックがあると私は驚きません。私はActiveMqから100以上のメッセージを1秒間に得ることができませんでした。承認、キューサイズなどの設定に関して何を試しても、数%を超えてCPUを浸すことはできませんでした。

解決策は、多数のクエリを1つのJMSメッセージにバッチ処理することでした。 200個のクエリを取得したとき、またはタイムアウト(20msを使用)に達したときに一まとまりのメッセージを送信するシンプルなクラスがあり、メッセージスループットが大幅に向上しました。

1

多分あなたは見てみるべきです:Prevayler

あなたのオブジェクトは常にmemにあります。 オブジェクトに対する「変更」が保持されます。 時々スナップショットを撮ることができます。すべてのオブジェクトは永続化されます。

0

保証されたメッセージングは​​、揮発性メッセージングよりもはるかに遅くなります。すべてのオブジェクトが数秒ごとに更新されることを考えれば、更新を一括して(500回の変更や時間を使って1〜10ミリ秒で)、揮発性メッセージの送信、トランザクションのバッチ処理を検討することができます。この場合、帯域幅によって制限される可能性が高くなります。あなたのユースケースを調整することで、より小さなバッチサイズも効率的に動作します。帯域幅が重要な場合(10 MB以上の接続がある場合は、JMS経由で圧縮を使用できます)

カスタムソリューション(これは簡単かもしれません)を使用すると、より高いパフォーマンスを達成できます。 Hazelcast & JGroupsは無料です(メインアプリケーションが遅くならないようにデータベース同期を行うノードを追加できます)。 50万件の耐久性のあるメッセージ/秒のオーダで処理する商用製品があります。

2

いくつかのTerracottaユーザーは、これまでこのようなシステムを構築していました。 :)

コンパスはあなたを助けるかもしれないので、テラコッタでクラスタリングをサポートしています。クラスタリングされたデータ構造の作成方法に注意するだけで、さらに高速化する可能性があります。あなたの要件と兵馬について

1)10Kオブジェクトテラコッタの観点から

2は非常に小さい)5秒更新レートが問題のように見えるしていません。いくつのノードが存在しているか、そしてあなたが利用できる自然なパーティショニングがあるかどうかによって異なります。すべての更新は永続的です。

3)1〜5秒のクエリ時間は非常に簡単です。ルックアップのためのあなた自身のよく組織されたデータ構造を構築することは難しい部分です。明らかに、すべてのデータをスキャンしないようにする必要があります。

4)テラコッタは現在、Glassfish v1とv2をサポートしています。

Terracotta forumsに投稿すると、おそらくもっと多くのテラコッタの眼球が問題になる可能性があります。

0
テラコッタquerymapため

兵馬+ jofti =照会可能永続的なクラスタ化されたデータ構造 検索Googleやあなたのデータベースを更新するだけでなくtimasync統合することquerymapブログ ためtusharkhairnar.blogspot.comご覧ください。データベースがあり、私はDBはかなり最近のデータ

Tushar tusharkhairnar.blogspot.com