如何通过 WCF 服务或其他技术将验证过程与将结果保存到数据库分离



我构建了一些验证服务。

private static void Main(string[] args)
{            
    var service = new ValidationManager();
    service.Start();
    System.Console.ReadLine();
    service.Stop();
}

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

我想,如果我能BulkManagerValidationManager分离到不同的过程,它会得到更多的改善。因此,我在同一解决方案中使用netNamedPipeBinding创建了控制台 WCF 服务。

[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)
    {
    }
}

我在项目中添加了网络服务引用ValidationManager而不是做sqlManager.SaveLog(...)我做sqlBulkWCFServiceClient.SaveLog(...).但是,现在ValidationManager只进行了 100 次验证

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

如果我

猜对了,您已经创建了一个附加服务,正在保存。我不建议这样做,因为您会产生很多对我来说听起来不合理的开销。这解释了性能下降的原因。

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

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

hth,马丁

最新更新