2011-02-05 11 views
0

私たちは、1つのモジュールがいくつかのメッセージを別のリモートモジュールに高速で送信するメッセージングシステムを持っています。受信モジュールはこのメッセージを特定の形式でデコードし、2つのスレッドに転送します。 1つはロガースレッドと呼ばれ、もう1つはフォワーダスレッドです。どのデータ構造を使用するか

これらのスレッドにこのメッセージを送信する前に、これらのメッセージをグループ化する必要があります。

これらのメッセージは、毎秒約800件の高速で送信されます。

次のように警告構造は次のとおりです。

  1. INTタイプ
  2. INTシステムのIDを送信
  3. INT RECPTシステムID
  4. INTのタイムスタンプ
  5. INTコード
  6. INTソースポート
  7. INT宛先ポート
  8. ソースIPアドレス(IPv4またはIPv6)、我々は次の詳細と構造を維持する必要が試合の終わりに
  9. 宛先IPアドレス(IPv4またはIPv6)

struct{ 
    INT COUNT 
    INT First Alert Timestamp 
    INT Last Alert Timestamp 
    INT First Alert ID 
    INT Last Alert ID 
} 

8つの基準に一致する各アラートに対して、グループが作成/選択され、他の詳細とともにカウントが増分されます。

IPアドレスフィールドは、5つのフィールド(INTアドレスタイプ、INTアドレス1、INTアドレス2、INTアドレス3、INTアドレス4)の構造でも、文字列に変換して構造体に格納することもできます。

私たちはいつか頭を揺さぶっていますが、メモリと速度の両方に対応できるように構造やアルゴリズムを見つけることができませんでした。

あなたには、専門家の助けが必要です。

+0

最後に一致するものはありますか?どのような基準? – btilly

答えて

0

一致するアラートを格納するための二重リンクリスト。最初と最後のAlertIDを簡単に取得できます。二重リンクリストを拡張してカウントフィールドを持つようにしましょう。

パフォーマンス要件に応じて、アラートを識別子のハッシュを含むリストからグループ化することができます。それが十分に速くない場合、識別フィールドによってグループ化されるより複雑なツリー構造を実装します。

私が提案できる最も良いことは、できるだけ簡単な方法で作業できることです.1秒あたり800何もありません。パフォーマンスの問題がある場合は、最適化してください。テスト駆動型の開発を使っているような面白い書き物が、あなたの平均的なコードから逃れることができます!

0

これを書き込む予定はありますか?どんな提案も言語に大きく依存するだろう。

最初に、Dictionary<string, ContainerObject>のようなもので始めるのがいいでしょう。ここで、キーは、クイックルックアップのために連結された必要なパラメータで構成されています。このディクショナリをメモリに保存したまま、別のプロセスが値を適切に記録してDBまたはフラットファイルを作成するようにしてください。

簡単にして、800秒で問題ありません。しかし、コミュニケーションの手段は大きな要因になるでしょう。これはローカルですか、リモートですか。それが遠隔で単一の情報源から来るならば、あなたの敵対は、個々の要求で実行されるならば、レイテンシが増えるでしょう。

関連する問題