批量数据实时处理

时间:2011-04-11 19:45:04

标签: .net sql-server multithreading design-patterns batch-processing

我的任务是优化线性数据处理程序的性能。以下是对现有内容的概述:

数据进入UDP端口,我们有多个侦听器侦听不同的端口并将原始数据写入SQL Server数据库(让我们将表调用为RawData)。然后我们有一个单线程线性应用程序的多个实例从RawData表中获取原始数据并处理各个数据行。处理方法是将原始数据与先前接收的给定实体数据进行比较,进行计算以计算不同读数的数量,然后为每个单独的数据行调用几个Web服务,最后为每个数据添加新记录ProcessedData表中的行。此外,相应的实体记录也会在其他表中更新。

我看到问题的方式,它可以分解为更小的部分,我可以利用生产者/消费者模式进行数据处理: 生产者的一个线程填充共享(阻塞)队列,多个使用者从队列中获取数据行并对它们进行并行处理。在完成消费者之后,他们将处理后的数据放到另一个共享队列中,然后由另一个消费者线程(单个)访问,该线程将执行SqlBulkCopy以插入新记录。在此过程中,将有其他共享队列将存储实体信息以进行更新,而另一个消费者将获取实体的更新信息并执行更新。

问题是,即使看起来很简单,但我认为这是一种繁琐的方法。我觉得有一种更好的方式来做我正在寻找的东西。有关实施上述生产者/消费者模式的任何建议?或者我应该为我的问题寻找不同的设计模式?

提前致谢

1 个答案:

答案 0 :(得分:2)

您提出的解决方案听起来很合理,我认为它根本不是很麻烦。它易于理解,易于实施,有效且高效。它还允许您调整生产者和消费者的数量,以实现最佳性能。将部件之间的通信分解成较小的部分是一件非常好的事情。

所以你有多个线程(生产者)从UDP读取数据并将这些项目存储在共享队列中。将其称为RawData队列。多个使用者从该队列读取,处理项目,并将结果放入另一个共享队列。将其称为ProcessedData队列。最后,您有一个单独的线程读取ProcessedData队列并将项目存储在数据库中。

.NET BlockingCollection非常适合这种情况。

这可能有所帮助:Question on C# threading with RFID