1

私はいくつかの検証サービスを構築しています。

private static void Main(string[] args)
{            
    var service = new ValidationManager();
    service.Start();

    System.Console.ReadLine();

    service.Stop();
}

ValidationManagerチェックする入力を受け取るメソッドThreadPoolを実行するために使用します。Validate問題を単純化するために、Validateメソッドは正規表現チェックを行うだけです。スレッドが検証を終了した後、結果を DB に保存する必要があります。DB を保存しないと、サービスは 10 秒以内に 60,000 回の検証を行います。DB 保存では、約 5,000 回の検証を行います。パフォーマンスを向上させるために、BulkManagerスレッドから検証結果を受け取り、その結果をまとめて DB に保存するものを使用します。BulkManager自身ThreadPoolを使用してバルクを DB に保存します。これで改善されました。現在ValidationManager、約 11,000 件の検証を行っています。

BulkManager別のプロセスに切り離すことができれば、さらに改善さValidationManagerれると思いました。そこで、同じソリューションでコンソール WCF サービスを作成しました。netNamedPipeBinding

[ServiceContract]
public interface ISqlBulkWCFService
{
    [OperationContract]
    void SaveLog(string email, string summary);
    [OperationContract]
    void SaveFinalResult(string email, byte resultType, string summary);    
}

public class SqlBulkWCFService: ISqlBulkWCFService
{
    public void SaveLog(string email, string summary)
    {
    }
    public void SaveFinalResult(string email, byte resultType, string summary)
    {
    }
}

プロジェクトに webservice 参照を追加しValidationManager、代わりに do sqlManager.SaveLog(...)I do を実行しsqlBulkWCFServiceClient.SaveLog(...)ました。しかし、今でValidationManager100 回の検証のみを行います。

1 つのプロセスが検証を行い、もう 1 つのプロセスが DB に保存するため、高速になると思います。また、クライアントとサーバーが同じマシンにあるため、WCF サービスとの通信は高速になると思いました。私の間違いはどこですか?

4

1 に答える 1

1

私があなたを正しければ、あなたは節約をしている追加サービスを作成しました。私には合理的に聞こえないオーバーヘッドをたくさん作成するので、これを行うことはお勧めしません。どのimがパフォーマンスの低下を説明しています。

検証をDB保存から切り離しても本当に大丈夫ですか?検証を行ってからそれをバルク操作用のバッファーに追加すると、サービスがクラッシュした場合などにデータが失われる可能性があります。これがうまくいかない場合は、チェーン呼び出し->検証-> DB保存を維持し、トロトル設定を試してみます。WCFサービスの同時実行性が高くなると、DBに容量がある場合、スループットが向上するはずです。

バルクソリューションで問題がない場合は、TPLのBlockingCollectionを利用できます。したがって、サービスの起動時に、GetConsumingEnumerableを使用して入ってくるものを保存する保存スレッドを開始し、すべてのWCF呼び出しが検証を実行し、最後にその結果をコレクションに追加します。不要なDB呼び出しを保存するために、いくつかのスレッドスリープを使用して、いくつかの結果がコレクションに蓄積されるのを待つことができます。

hth、マーティン

于 2012-06-25T09:31:24.337 に答える