2012-04-17 7 views
6

私は現在、データベース(A)からデータを取り込み、データを処理して別のデータベース(B)の別のテーブルにコピーします。私たちが処理しているデータの量は大きく、このプロセスには長時間(数週間)かかることが予想されます。WCFは長いデータインポートプロセスに適していますか?

WCFを使用するこの種のタスクでは、賢明な設計選択ですか?そのようにして、私は、クライアントアプリケーション/ Webフロントエンド(ビジネスの残りの部分が使用できる)をいくつか持っていて、全体的なインポートプロセスの進捗状況を「照会」することができると考えました。また、クライアントがサービスを通じてインポートプロセスを開始/一時停止/停止できるようにしたいと考えています。

これはWCFで可能ですか?これは正しい選択ですか?いくつかの点で、これは通常のWindowsサービスのように動作する必要があると思います(私はWCF経由で公開できるいくつかの方法でインポートの進捗状況を照会する方が簡単だろうと考えていました)

また、たとえば、1人のユーザが同じ時間にインポートプロセスを開始/停止しようとした場合、問題が発生する可能性があります。シングルトンパターンは、誰もが同じ単一のインポートプロセスで作業していることを確実にするためには適していますか?

どのような考えやアイデアも高く評価されています。

+0

多くのデータを転送しているので、別のシリアライザを使用したい場合は、在庫WCFを使用します。 [protobuf-netベンチマーク](http://code.google.com/p/protobuf-net/wiki/Performance)ページには、すべてのシリアライザの比較があります。 –

+0

私は間違っているかもしれませんが、私は彼がWCFを通して多くのデータを移動することを計画しているとは思っていません - 単にプロセスのステータスを照会するだけです。それが間違った前提だとすれば、私は修正する答えを持っています... – eouw0o83hf

+0

ああ、申し訳ありません - 実際のインポート作業をしているサービスを持っていることは好ましくありませんか? –

答えて

2

編集/序文:この答えは、あなただけのプロセスを持つユーザーとの対話のためにではなく、ソフトウェアスタック全体の通信のためのWCF を使用すること、およびコア作業が長時間実行サービスによって行われていることを前提としてい自体。

はい、これはWCFで実行可能ですが、おそらく適切な解決策です。いくつかのinteropプロパティのセットを頻繁に照会/更新する(たとえば、完了したパーセント、それが処理しているアイテム、および「一時停止」フラグなどを確認するなど)、頻繁に実行される長時間実行されるプロセッサスレッドがあります。 )。これらのプロパティは、WCFインターフェイスメソッドによって照会または設定されます。

シングルトンパターンはこれに最適です。スレッディングが正しく設定されていれば、長時間実行しているスレッド(またはスレッド)がチェックするいくつかのプロパティと対話します。

非常に高いレベルの観点から見ると、プロセッサクラスはおそらくコアでこれと同じように見えます(これは、それができる方法のモデルです。正確にこのようにするのではなく、悪夢があります) :

// IWcfProcessor is the ServiceContract interface 
// Processor runs as a singleton and does (or has a thread that does) the processing work 
class Processor : IWcfProcessor 
{ 
    public Processor() 
    { 
     new Thread(Process).Start(); 
    } 

    public void Process() 
    { 
     while (Run) 
     { 
      // Do long-running process stuff, update some tables 
      PercentDone += 0.1; 
     } 
    } 

    public decimal PercentDone { get; set; } 
    public bool Run { get; set; } 

    /// WCF method defined in IWcfProcessor 
    public void SetState(bool state) 
    { 
     Run = state; 
    } 

    /// WCF method defined in IWcfProcessor 
    public decimal GetStatus() 
    { 
     return PercentDone; 
    } 
} 

その後、WebまたはアプリケーションのエンドポイントからIWcfProcessorタッチポイントにフックすることができます。

また、1人のユーザーがインポートプロセスを同時に開始/停止しようとすると、問題が発生する可能性がありますか?

スレッドインターループを正しくセットアップすると、問題は発生しません。

シングルトンパターンは、誰もが同じ単一のインポートプロセスで作業していることを確認するためには適切ですか?

はい、これは完璧です。

+0

私はProcess()+ Runがどのように動作するかについてはあまり理解していません –

+0

virtual -1。私はこれがどのようにタイムアウトの問題を解決できるのか理解していません。 WCFでは、ペイロード全体を送信する必要があり、これは大きなペイロードでは実現できません。 – Aliostad

+0

@ daemonfire300それは長期的なプロセスの核心です。これはスレッドで実行されるメソッドです。コードを実行し、継続するか一時停止するかを定期的にチェックします。そのため、 'Run'がチェックされます。 – eouw0o83hf

2

はい。これはWCFストリーミングで動作します。ここで、私のanswerを見て、別の同様の質問をしてください。

関連する問題