1

私の必要性は、Webアプリケーションサーバーのリアルタイム統計を集約することです。例えば:

  • コンテンツタイプXのリクエストがいくつ行われたか
  • タイプYのリクエストの処理にかかる時間

等々。

最高のパフォーマンスを得るには、このデータをファイルではなく完全にメモリに保存する必要があります。すべてのリクエストをログに記録するのではなく、さまざまな側面のカウンターのみを保存します。

私が知っている最も簡単な方法は、SQLのようなテーブルに値を格納し、SQLのようなクエリを実行することです。利点は、開発作業なしでインデックス作成が既成になることです。ApacheDerbyのようないくつかの組み込みJavaデータベースがその仕事をするだろうと思います。

もう1つの方法は、「インデックス列」ごとにコレクション(リストなど)とハッシュテーブルを実装することです。このように、すべてJava / ScalaコレクションAPIを使用して実行されますが、実際には、インデックスメカニズムを自分で実装し、テストし、保守する必要があります。

だから私の質問は、あなたはどのように好ましいと思いますか、そしてこの機能を簡単かつ迅速に実装する他の方法があるかどうかです。

ありがとう。

4

3 に答える 3

3

私はH2データベースを選択します、私はそれで非常に前向きな経験を持っています、パフォーマンスも素晴らしいです。

SQLデータベースがニーズに適していることを確認し、javamelodyを調べて、ニーズに合っているかどうかを確認しましたか、それとも適していない場合は、ローリングデータベースの実装についてJRobinを調べてください。

于 2010-12-14T11:46:02.103 に答える
0

収集する必要がある情報の種類ごとに 1 つのコレクションだけが必要だと思います。パフォーマンスを向上させるために、TObjectIntHashMap を使用するコードを簡素化します。例えば

コンテンツ タイプ X のリクエストが行われた回数

TObjectIntHashMap<ContentType> contentTypeCount 
     = new TObjectIntHashMap<ContentType>();

contentTypeCount.increment(contentType); 

タイプ Y のリクエストの処理にかかる時間

TObjectLongHashMap<ProcessType> contentTypeTime 
    = new TObjectLongHashMap<ProcessType>();

contentTypeTime.adjustValue(processType, processTime);

あなたが言及した他のアプローチを使用して、どのようにそれを短く/シンプル/高速にすることができるかわかりません。

私のマシンでインクリメント (キー) を実行する平均時間は 15 ns (10 億分の 1 秒) かかります

于 2010-12-14T11:47:42.400 に答える
0

また、Scala の統計ライブラリであるTwitter Ostrichについても注目されています。

カウンター、ゲージ、タイミングメーターが含まれています。

データは HTTP REST API からアクセスできます。

于 2010-12-15T08:44:45.470 に答える