1

我建立了一些验证服务。

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

    System.Console.ReadLine();

    service.Stop();
}

ValidationManager用于ThreadPool执行Validate接收输入进行检查的方法。为了简化问题 -Validate方法只是做一些正则表达式检查。线程完成验证后,它应该将结果保存到数据库。如果不保存数据库,该服务会在 10 秒内完成 60,000 次验证。使用 DB 保存它可以进行大约 5,000 次验证。为了提高性能,我使用了一些BulkManager从线程接收验证结果并将结果批量保存到数据库的方法。BulkManager使用自己ThreadPool将批量保存到数据库。这确实有所改善。现在ValidationManager进行大约 11,000 次验证。

我认为如果我可以BulkManagerValidationManager不同的流程中解耦出来,它会改进得更多。所以,我在同一个解决方案中创建了控制台 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)
    {
    }
}

我添加了对项目的 web 服务引用ValidationManager,而是这样sqlManager.SaveLog(...)做了sqlBulkWCFServiceClient.SaveLog(...)。但是,现在ValidationManager只进行100 次验证

我认为它会更快,因为一个过程进行验证,另一个保存到数据库。而且我认为与 WCF 服务的通信会很快,因为客户端和服务器在同一台机器上。我的错误在哪里?

4

1 回答 1

1

如果我没听错,您已经创建了一项附加服务,用于进行保存。我不建议这样做,因为您会产生很多对我来说听起来不合理的开销。这解释了性能下降。

将验证与数据库保存分离真的可以吗?如果您进行验证,然后将其添加到缓冲区以进行批量操作,您可能会丢失数据,以防服务崩溃。如果这不行,我会保留链调用 -> 验证 -> 数据库保存,然后只玩 trottle 设置。随着 WCF 服务的更高并发性,如果数据库有容量,吞吐量应该会上升。

如果批量解决方案适合您,您可以使用 TPL 中的 BlockingCollection。因此,随着服务启动,您启动了一个保存线程,该线程使用 GetConsumingEnumerable 来保存传入的内容,并且所有 WCF 调用都在进行验证,最后将其结果添加到集合中。为了节省不必要的数据库调用,您可以使用一些线程休眠来等待一些结果在集合中累积。

hth,马丁

于 2012-06-25T09:31:24.337 回答