ピーク時には毎秒数百に及ぶ可能性のある一連のイベントがあります。間隔ごとのイベント数を追跡して報告できるようにしたいと考えています (たとえば、過去 5 分間、過去 1 時間、過去 24 時間、過去 7 日間)。C#でこのタイプのデータを追跡するためのオプションは何ですか
4 に答える
イベントにタイムスタンプを割り当てることをお勧めします。先に進んで、何らかの方法でイベントを処理すると思います。したがって、イベントやそのデータを何らかの方法で保存する可能性があります。タイムスタンプ メンバーによってデータ構造を拡張し、イベント発生時のタイム スタンプを追加するだけです。このようにして、後でコードの別の時点で「着信」統計を作成できます。特定の時間枠で発生したイベントを簡単に評価できます。
GetSystemTimeAsFileTime()
妥当なタイムスタンプのソースとして、 APIをお勧めします。これは、最大イベント レートが 1 秒あたり最大数百の場合に、一意の値を提供できるはずです。ただし、タイムスタンプの目的が、タイム フレームがどのタイム フレームにあるかを示すことのみである場合、タイムスタンプは一意の値である必要はありません。より高い解像度が必要になった場合は、QueryPerformanceCounter()
API を見ると役立ちます。ここで説明する 2 つの API を組み合わせると、タイムスタンプの解決と数マイクロ秒の精度が得られます。
問題の説明から、システムのパフォーマンス、負荷、およびスループットを監視する必要があると思います。そうであれば、WMI を使用できると思います。
申し訳ありませんが、これ以上詳細な情報を提供することはできません。
これまでのところ、あなたの問題について私が知っていることをすべて念頭に置いて、受信したイベントの数をそれぞれ整数変数または長い変数でカウントするだけです。
手元にアイテムのタイムスタンプを持たずに特定の期間内のイベントをカウントするには、アプリオリに時間の粒度を決定し、結果の時間枠に従って着信イベントを追跡する必要があります。経過時間を測定するには、並行スレッドを利用できます。
つまり、5 分の粒度を決定した場合、1 つのカウンターを維持するスレッドを実装する必要があります。このカウンターは、着信イベントごとに増加します。スレッドは 5 分ごとに現在のカウンターをリストに保存し、それを 0 にリセットします。たとえば 60 分後に、受信したメッセージの数を反映した 12 項目のリストが作成されます。そのリストを使用すると、次のようなクエリを処理できます
- 最初の 5 分間のイベント数は?
- 最初の 10 分間にいくつのイベントが発生しましたか?
- 15 分間受信してから 5 分間に発生したイベントの数。
- ...
それ以降は、収集されてリストに保存されたカウンターを解釈するだけです。
一方、任意の粒度の時間間隔を照会できるようにしたい場合 (受信したイベントの数を知りたい時間間隔の事後を決定することを意味します)、データ構造を維持する方法は他にないと思いますタイムスタンプ付き。
したがって、イベントごとに、上記のクエリに応答するために、受信した時間を保存する必要があります。1 秒あたり数百のイベントを受信する場合は、お勧めできません。
ここには、イベントのログ記録とそれらの表示という 2 段階の問題があります。たとえば、先月のすべてのイベントを追跡している場合、過去 5 分間、過去 7 日間、または「12 日間の午前 1 時から午後 3 時までのすべてのイベント」などのより複雑なイベントのみを表示するように選択できます。前に"。
.NET のログ オプションの一部は、ここにあります。あなたの問題に頑張ってください!