4

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

現在、Mysql を使用して、タグとドキュメントのペアごとに 1 つの行を挿入しています。数百万行を Mysql に書き込むには、大量の挿入や高度な最適化を行っても、しばらく時間がかかります (I/O が高くなります)。これは、バッチ プロセスではなく、インタラクティブなプロセスである必要があります。

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

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

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

ここに私が見たいくつかの解決策があります:

  • レコードがメモリに書き込まれ、非同期的にデータベースに排出されるキャッシュ (Terracotta、Gigaspaces、Coherence) の後ろに書き込みます。これらは私が避けたいアプリにある程度の複雑さを追加しているように見えるので、私は少し怖がっています.
  • MongoDB、HBase、Tokyo Tyrant などの高度にスケーラブルなキー値ストア
4

4 に答える 4

2

これに Coherence を使用する予算がある場合は、使用することを強くお勧めします。Coherenceでは、後書きの結果整合性動作が直接サポートされており、データベースの停止とCoherenceクラスタ・ノードの停止の両方に対して非常に存続可能です(別々のJVM、できれば別々のホストで3つ以上のCoherenceノードを使用する場合)。フォーチュン 100 企業の e コマース サイトで大量の CRM を実行するためにこれを実装しましたが、非常にうまく機能します。

このアーキテクチャの優れた点の 1 つは、後書き動作がまったく行われていないかのように Java アプリケーション コードを記述し、それを実現する Coherence トポロジと構成をプラグインすることです。後でCoherenceの動作またはトポロジを変更する必要がある場合、アプリケーションを変更する必要はありません。これを行うための合理的な方法はおそらくいくつかあると思いますが、この動作は、方法を発明したり手動で作成したりする必要はなく、Coherence で直接サポートされています。

本当に良い点を言うと、アプリケーションの複雑さを追加することについてのあなたの心配は良いものです. Coherence を使用すると、キャッシュに更新を書き込むだけです (または、Hibernate を使用している場合は、L2 キャッシュ プロバイダーにすることができます)。Coherenceの構成とトポロジに応じて、後書きの分散型キャッシュを使用するようにアプリケーションをデプロイするオプションがあります。そのため、キャッシュの機能により、アプリケーションは複雑ではなくなります (率直に言って、認識されません)。

最後に、Coherence が Tangosol によって作成された 2005 年から 2007 年にかけて、上記のソリューションを実装し、可能な限り最高のサポートを受けました。オラクルの下で物事がどのようになっているのかはわかりません-うまくいけば、まだうまくいきます。

于 2009-11-19T18:56:54.890 に答える
2

私は非同期書き込みを使用する大規模なプロジェクトに取り組んできましたが、その場合はバックグラウンド スレッドを使用して手書きで作成されました。データベース書き込みプロセスを JMS キューにオフロードすることで、そのようなものを実装することもできます。

データベースへの書き込みを確実に高速化する 1 つの方法は、それらをバッチで実行することです。JDBC のバッチ更新は、個々の書き込みよりも桁違いに高速である可能性があり、非同期で実行している場合は、一度に 500 件だけ書き込むことができます。

于 2009-11-19T17:52:17.987 に答える
0

データの編成方法によっては、シャーディングを使用できる可能性があります。読み取りレイテンシが十分に低くない場合は、キャッシュを追加することもできます。Memcacheは人気のあるソリューションの1つです。

于 2009-11-19T16:35:43.197 に答える
0

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

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

(注: oracle は約 5 ~ 10 年前に berkeley db を購入しました。元の製品は 15 ~ 20 年前から存在しています)。

于 2009-11-19T22:21:44.290 に答える