現在、私の会社で稼働しているWindowsサービスをスケールアウトする方法についていくつかの情報を探しています。私たちは、.NET 4.0を使用して(と将来のある時点で4.5にアップグレードされます可能)およびWindows Server 2012Windowsサービスのスケールアウト
サービスの仕事は、新しい行を照会することです
サービスについて上でこれを実行していますロギング・テーブル(Oracleデータベースを使用しています)、情報の処理、5つのテーブルの行の作成と更新(トラッキング・テーブルと呼ぶ)、ロギング・テーブルの更新と繰り返しを行います。
ロギングテーブルには、他の5つのトラッキングテーブルで選択して保存する必要がある大量のXMLがあります(行ごとに最大20 MBになる可能性があります)。新しい行は、1時間に最大50万行の割合で常に追加されます。
トラッキングテーブルのトラフィッキングは、最小のもので90,000の新しい行から、最大のテーブルの潜在的に何百万までの行まで、非常に高くなります。これらのテーブルに対してもUpdate操作があることは言うまでもありません。
を処理されているデータについて
私はこのビットは、これらのオブジェクトがグループ化されて処理される方法に基づいて解決策を見つけるために重要であると感じています。データ構造は次のようになります。
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によってグループ化されたバッチでレポートを処理します。この段階で
制限
- 私は私が合う任意のアーキテクチャを使用して、最初から書き直すこのサービスさせて頂いております。
- インスタンスがクラッシュした場合、他のインスタンスはクラッシュしたものがどこに残っているかを確認する必要があります。データが失われることはありません。
- この処理は、レポートがデータベースに挿入されてからできるだけリアルタイムで実行する必要があります。
私は、このようなプロジェクトをビルドする方法上の任意の入力やアドバイスを探しています。私はサービスがステートレスである必要があると思うか、あるいは何とかすべてのインスタンスのためにキャッシュを同期させる方法がありますか?すべてのインスタンスをどのように調整し、同じデータを処理していないことを確認する必要がありますか?どのように負荷を均等に分配できますか?もちろん、インスタンスをクラッシュさせ、その作業を完了させないようにするにはどうすればいいですか?あなたの作業項目に関しては無関係な情報
これはETLプロセスのように聞こえます。 SQL Server Integration Services(SSIS)のようなものを見て、このプロセスを定期的に実行するようスケジュールを設定できるパッケージを作成することを検討しましたか? –
私たちはOracleを使用していますが、上位のユーザーは残念ながらSQL Serverに関する言葉を聞きたくありません。 – Artless
私はSSISの部分だけを考えていましたが、データベースエンジンではありません:)代替案はPentaho Data Integration(http://www.pentaho.com/explore/pentaho-data-integration/)やTalend etl analytics http://www.talend.com/solutions/etl-analytics) –