質問

私は、多かれ少なかれインタラクティブに数百万のレコードに一括タグ付けする機能を含むアプリケーションを構築しています。ユーザー操作は Gmail に非常に似ており、ユーザーは個々のメールにタグを付けたり、大量のメールに一括でタグを付けたりできます。また、これらのタグ メンバーシップへの迅速な読み取りアクセスも必要ですが、読み取りパターンは多かれ少なかれランダムです。

現在、Mysql を使用し、タグとドキュメントのペアごとに 1 行を挿入しています。Mysql に数百万行を書き込むには、一括挿入や高度な最適化を行った場合でも、時間がかかります (I/O が高くなります)。これはバッチプロセスではなく、対話型プロセスである必要があります。

保存したり読み取ったりするデータの場合、データの一貫性と可用性は、パフォーマンスやスケーラビリティほど重要ではありません。したがって、書き込み中にシステム障害が発生した場合でも、ある程度のデータ損失には対処できます。ただし、データは必ず、ある時点でセカンダリ ストレージに保存する必要があります。

まとめると、要件は次のとおりです。

  • 潜在的に数千万のレコードの低遅延一括書き込み
  • データは何らかの方法で永続化する必要がある
  • 低レイテンシのランダム読み取り
  • 永続書き込みは必要ありません
  • 最終的な整合性は問題ありません

私が検討したいくつかの解決策は次のとおりです。

  • ライトビハインドキャッシュ (Terracotta、Gigaspaces、Coherence) では、レコードがメモリに書き込まれ、非同期でデータベースに排出されます。これらはアプリにある程度の複雑さを追加するように見えるため、私は少し怖いのですが、それは避けたいと思っています。
  • MongoDB、HBase、Tokyo Tyrant などの拡張性の高い Key-Value ストア
役に立ちましたか?

解決

あなたはこのためにコヒーレンスを使用するための予算を持っている場合は、

、私は非常にそうすることをお勧めします。 (あなたは別のJVMで> = 3つのCoherenceノードを使用する場合、好ましくは、別のホスト上で、)が直接サポートをするための後書き、コヒーレンスにおける最終的な一貫性の挙動であり、それはデータベースの停止とコヒーレンスクラスタノード機能停止の両方に非常に存続です。私はフォーチュン100企業のeコマースサイトのための大量のCRMを行うためにこれを実装した、それは素晴らしく働くます。

このアーキテクチャの最高の側面の一つは、あなたがライトビハインド動作のいずれも行われなかったかのようにJavaアプリケーションのコードを書き、それが起こる可能コヒーレンスのトポロジと構成のプラグインということです。後でコヒーレンスの行動やトポロジを変更する必要がある場合は、アプリケーションを変更する必要はありません。私はこれを行うために合理的な方法の一握りは、おそらくそこにある知っているが、この動作は、直接ではなく、それを行う方法を発明するか、手でロールすることよりも、Coherenceモードでサポートされています。

本当に細かい点を作成するには - アプリケーションの複雑さを追加することについてのあなたの心配は良いものです。コヒーレンスを使用すると、単純にキャッシュへの更新を書く(または使用している場合、それはL2キャッシュ・プロバイダーでき休止状態)。あなたのコヒーレンスの構成やトポロジーに応じて、あなたはライトビハインド、分散、キャッシュを使用するようにアプリケーションを配備するためのオプションを持っています。だから、あなたのアプリケーションが原因キャッシュの機能へのより複雑な(そして、率直に言って気づいていない)ではありません。

Coherenceでははtangosolによって作られた、彼らは可能な限り最高のサポートを持っていたとき、

最後に、私は2005年から2007年から、上記のソリューションを実装しました。私は物事がOracleの下に今あるかどうかはわかりません - 。うまくいけばまだ良い

他のヒント

私はasyncrhonousは、それがバックグラウンドスレッドを使用しただけで手書きしたような場合にはalthoguhを書き込ん使用大規模なプロジェクトに取り組んできました。また、JMSキューにDBの書き込み処理をオフロードすることによってそのような何かを実装することができます。

確かにDBは書き込みスピードアップの一つは、バッチでそれらを行うことです。 JDBCのバッチ更新は速く、個々の書き込みより桁違いにすることができ、あなたが非同期的にそれらをやっている場合は、あなただけの時間でそれら500を書き込むことができます。

あなたはシャーディングを使用することができるだろう、あなたのデータは、おそらく編成されている方法に応じてに、 読み出しレイテンシが十分に低くない場合にも、キャッシュを追加しようとすることができます。 Memcacheのは1つの一般的なソリューションです。

はBerkeley DBは、トランザクションをサポートして非常に高性能なディスクベースのハッシュテーブルを持っており、あなたがそれを必要とする場合は、Java EE環境と統合されています。あなたは、キー/値のペアとしてデータをモデル化することができるしている場合、これは非常にスケーラブルなソリューションすることができます。

http://www.oracle.com/technology /products/berkeley-db/je/index.htmlする

(注:Oracleが約5〜10年前デシベルバークレー買って、オリジナルの製品は15〜20年前から出回っているが)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top