2

マルチスレッド アプリケーションのアーキテクチャと設計は初めてです。

次のような場合はどのように設計すればよいか、設計パターンがあればなお良いです。

以下を実行できる Windows サービスを設計する必要があります。

SQL Server データベースには、Organization テーブルと Events テーブルと呼ばれる 2 つのテーブルがあり、それぞれ組織のリストとその組織で発生しているイベントのリストを保持しています。

Windows サービスは、すべての組織のイベントを非同期的に処理する必要があります。Windows サービスは、組織テーブルから組織のリストを読み取り、組織ごとにスレッドを作成します。各組織スレッドは、2 秒ごとにイベント テーブルをポーリングし、イベントをイベント リストに読み込みます。イベント リストに何かが置かれたり利用可能になったりした場合は、別のオブジェクト (ディスパッチャー) を呼び出す必要があり、ディスパッチャー オブジェクトは、これらの各イベントを処理するイベント ハンドラー スレッドを作成して実行します。イベントが処理されたら、イベント ハンドラー スレッドを終了する必要があります。

イベント リストにイベントを配置するイベントには、複数のソースが存在する場合があります。

Delphi 2009 および SQL Server 2008 Express エディションを使用。

助けてください。

4

1 に答える 1

3

組織ごとにスレッドを作成するのはなぜですか? 私が考えられる唯一の理由は、組織ごとに異なるポーリング時間を構成できるようにしたい場合です。そうでなければ、前回のポーリング以降のすべてのイベントをフェッチしてそれらのイベントを処理する 1 つのポーリング スレッドしかないでしょう。

イベントを処理するには、キューとワーカーのプールを使用してそれらを処理できます ( OmnithreadLibraryを見てください。そのため、イベントの処理 (時間がかかる場合がありますが、わかりません) はマルチスレッド化できます。

必要に応じて、組織ごとに 1 つのイベントのみが同時に処理されるようにすることもできますが、それがまったく意味があるかどうか疑問に思うはずです。

だから、私は持っているでしょう:

  • 新しいイベントを取得してキューに入れるための 1 つのポーリング スレッド。
  • これらのイベントを処理するための 1 つのキュー。
  • できれば組織の数ではなく CPU コアの数に基づいて、キューを処理する任意の数のワーカー。

組織全体でイベント メッセージングを行う必要がある場合は、RabbitMQなどのツールを検討することもできます。イベントを取得してすぐにRabbitMQに配置することをお勧めします。その後、そのツールはそれらを配布できます。

于 2013-06-28T09:27:22.620 に答える