何百万ものレコードを多かれ少なかれインタラクティブにタグ付けする機能を含むアプリケーションを構築しています。ユーザーの操作は Gmail と非常によく似ており、ユーザーは個々のメールにタグを付けたり、大量のメールに一括タグを付けたりできます。また、これらのタグ メンバーシップへの迅速な読み取りアクセスも必要であり、読み取りパターンは多かれ少なかれランダムです。
現在、Mysql を使用して、タグとドキュメントのペアごとに 1 つの行を挿入しています。数百万行を Mysql に書き込むには、大量の挿入や高度な最適化を行っても、しばらく時間がかかります (I/O が高くなります)。これは、バッチ プロセスではなく、インタラクティブなプロセスである必要があります。
保存および読み取りを行っているデータの場合、データの一貫性と可用性は、パフォーマンスとスケーラビリティほど重要ではありません。そのため、書き込み中にシステム障害が発生した場合、データの損失に対処できます。ただし、データはある時点で確実にセカンダリ ストレージに永続化する必要があります。
要約すると、要件は次のとおりです。
- 潜在的に数千万のレコードの低遅延一括書き込み
- 何らかの方法でデータを永続化する必要がある
- 低レイテンシのランダム読み取り
- 永続的な書き込みは不要
- 結果整合性は問題ありません
ここに私が見たいくつかの解決策があります:
- レコードがメモリに書き込まれ、非同期的にデータベースに排出されるキャッシュ (Terracotta、Gigaspaces、Coherence) の後ろに書き込みます。これらは私が避けたいアプリにある程度の複雑さを追加しているように見えるので、私は少し怖がっています.
- MongoDB、HBase、Tokyo Tyrant などの高度にスケーラブルなキー値ストア