現在、会社で実行されているWindowsサービスをスケールアウトする方法についての情報を探しています。.NET 4.0を使用しており(将来的には4.5にアップグレードできます)、これをWindowsServer2012で実行しています。
サービスについて
サービスの仕事は、ログテーブル(Oracleデータベースを使用)の新しい行のクエリ、情報の処理、他の5つのテーブル(トラッキングテーブルと呼びましょう)の一連の行の作成および/または更新です。 )、ログテーブルを更新して繰り返します。
ロギングテーブルには大量のXMLがあり(1行あたり最大20 MBになる可能性があります)、他の5つのトラッキングテーブルで選択して保存する必要があります。新しい行は、1時間あたり最大500,000行の割合で常に追加されます。
トラッキングテーブルのトラフィックははるかに高く、最小のテーブルの90,000の新しい行から、最大のテーブルの潜在的に数百万の行まで、1時間ごとに発生します。これらのテーブルにも更新操作があることは言うまでもありません。
処理中のデータについて、
これらのオブジェクトがどのようにグループ化および処理されているかに基づいて解決策を見つけるには、このビットが重要だと思います。データ構造は次のようになります。
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- レポートは、選択して処理する必要のあるログデータです
- メッセージごとに、平均5つのレポートがあります。これは、場合によっては1から数百の間で変化する可能性があります。
- メッセージには他のコレクションや他の関係がたくさんありますが、それらは質問とは無関係です。
現在、16コアサーバーの負荷をほとんど管理していないWindowsサービス(完全な仕様は覚えていませんが、このマシンは獣だと言っても過言ではありません)。私は、このすべてのデータを処理し、他のインスタンスに干渉しないマシンをスケールアウトして追加する方法を見つけるという任務を負っています。
現在、各メッセージは独自のスレッドを取得し、関連するレポートを処理します。データを処理するときにDBクエリの数を最小限に抑えるために、MessageIdでグループ化されたレポートをバッチで処理します。
制限事項
- この段階で、適切と思われるアーキテクチャを使用して、このサービスを最初から書き直すことができます。
- インスタンスがクラッシュした場合、他のインスタンスは、クラッシュしたインスタンスが残った場所をピックアップできる必要があります。データが失われることはありません。
- この処理は、データベースに挿入されるレポートから可能な限りリアルタイムに近い必要があります。
そのようなプロジェクトを構築する方法についての意見やアドバイスを探しています。サービスはステートレスである必要があると思いますか、それともすべてのインスタンスのキャッシュを何らかの方法で同期する方法はありますか?すべてのインスタンス間で調整し、それらが同じデータを処理していないことを確認するにはどうすればよいですか?どうすればそれらの間で負荷を均等に分散できますか?そしてもちろん、インスタンスがクラッシュして完了しないのを処理するにはどうすればよいですか?
編集
無関係な情報を削除しました