2016-04-27 8 views
6

私はいくつかのリアルタイムイベントを受け取り、それらをユーザーインターフェイスレイヤーにプッシュするJava Webアプリケーションを手に入れました。私はすべての知覚された出来事を記録したいと思います。情報量が膨大になるので、私はNoSQLデータベースを使うほうが好きです。NoSQL DBにリアルタイムデータを記録するためのベストプラクティス

この目的のために、イベントごとにドキュメントを挿入するmongodbをセットアップしました。問題は、このアプローチ(イベントごとのディスクアクセス)がプロセス全体を劇的に遅くすることです。

このような状況で私はどのようなアプローチを取ることができますか? mongodbではどのようなオプションが利用できますか(バルク挿入、非同期挿入、キャッシュなど)?いくつかの他のNoSQL db実装に切り替えると違いが生まれますか?ここでベストプラクティスは何ですか?

+1

のクラスs.w.s.m.m.a.RequestMappingHandlerMappingのフルネームを短縮する方法をご覧ください。どのように大きなスループットが期待されますか? 100/s? 10k/s? 1M/s?平均と可能なピーク?シリアル化されたときのあなたのイベントの大まかなサイズは? 100バイト? 1メガバイト?過去の出来事をまれに見直す必要がありますか、時間窓の順に再生するか、アドホックな質問をする必要がありますか?どのくらいの期間それらを保存する必要がありますか?そのDBは何年ものデータになるでしょうか、あるいは何らかの種類のクリーンアップ/アーカイブを毎週二次ストレージに行うことができますか? –

答えて

3

私はしばらくの間、他の回答を見るのを待っていましたが、私の忍耐を失います。私は3つのプロジェクト(Javaの場合は2つ、C#の場合は2つ)のログストレージとしてMongoDBを使用しています。これに基づいて、ログを整理するための重要なルールを理解することができます:

  1. インデックスを使用しないでください。ほとんどの場合、インデックスを作成するとパフォーマンスが低下します。後処理ログが必要な場合は、別のデータベースまたはコレクションに情報をコピーします。残念ながら、プライマリキー_idを削除することはできません。そのまま(GUID)のままにするか、自動インクリメントNumberLongに置き換えてください。

  2. 書き込みの心配がありません。 MongoDBには、書き込み操作の認識を制御する豊富なオプションがあります。 LogLevelと書き込みルールの一致を設定できます。例えば、DEBUG,INFO,WARNWriteConcern.UNACKNOWLEDGEDおよびERRORとなります。FATALWriteConcern.ACKNOWLEDGEDで保存できます。このように、優先度の低いメッセージの書き込み中に一時停止を回避することで、アプリケーションのパフォーマンスを向上させることができます。それと同時に、重要なメッセージ(めったにない)がストレージに保存されていることを確認します。

  3. コレクションインスタンスをキャッシュします。私はメッセージが到着するたびにMongoのオブジェクトをgetDBまたはgetCollectionで解決することを避けることを意味します。

  4. ネットワークを通過するデータの量を削減します。最小限のフィールドセットでメッセージを制限する。長すぎるスタックトレースを切り捨てます。春3.xのは、期待される性能制約に関するいくつかの詳細を知って良いでしょう代わりにsome.whatever.sub.main.minimal.agent.RequestMappingHandlerMapping

関連する問題