基于文件系统的持久性或 MSMQ

File system based persistence or MSMQ

因此,在一个遗留项目中,我致力于以下策略用于数据(大量)persistence.It 在一定程度上工作正常,但现在看起来已达到极限。我正在考虑更改设计,但不确定该怎么做。

所以今天发生了以下情况, 有一个 ASMX WebService,它从各种客户端接收文件并按照文件夹方案将它们写入文件系统。 windows 服务持续监视文件夹中的更改并读取进入文件夹的文件,并根据该服务解析文件并将数据写入数据库。

现在我们看到的是文件不断堆积在文件夹中,windows 服务因读取和保存文件而不堪重负。它不像冻结或其他任何东西,只是在数据持久性方面落后了。好像晚了 36 小时。

我想知道我是否应该删除中间文件保存、文件读取代码,这些代码是遗留代码,因此不是并发或异步的,并用更 "standard" 的 messagequeue impl 替换它,这很可能会更好.

在那种情况下,Web 服务可以替换为消息队列,windows 服务可以读取消息并解析并将它们保存到数据库中。 我正在寻找有关如何分析此类案例的想法。

Now what we are seeing is files keep piling up in the folder and the windows service is overwhelmed with reading and saving them. Its no like freezing or anything but just way behind in terms of data persistence. Like 36 hours late.

这让我印象深刻,因为您的文件处理代码可能存在问题,而不是传输本身存在任何问题。如果您的文件处理代码性能不佳,那么将一种传输方式换成另一种传输方式将无济于事。出于这个问题的目的,我假设您已经针对这个问题优化了文件处理代码。

I am wondering whether i should remove the intermediary file saving , file reading code which is legacy code and hence not concurrent or asynchronous and replace that with a more "standard" messagequeue impl that will most likely be better performing.

所以我可以在这里检测到一种期望,即通过换掉您怀疑是问题所在的传输,您将解决问题。我并不是说这个假设不正确,但应该认为读取 Windows 中的文件通常非常非常快。事实上,我会惊讶地发现您的 IO 成本是导致您的处理速度减慢的原因。还要考虑用 MQ 传输替换文件传输仍然需要从磁盘读取文件 - 当它们在队列中时,您认为 MQ 子系统 stores the items 在哪里?

In that case the web service can be replaced with the message queue and the windows service can read messages and parse and save them to the database.

就是说,如果您真的优化了文件处理过程,并且文件在处理之前仍然在文件夹中排队很长时间,那么现代消息队列实施会给您带来一些好处。正如您之前提到的,我假设文件读取过程是单线程的。我这么认为是因为在多线程环境中管理文件系统锁定并不有趣。有了消息队列,许多消息消费者客户端库都内置了 competing consumers 模式,因此扩展线程数量(或队列数量 reader windows 服务)要容易得多.