我有一个用C#编写的Windows服务,它监视文件夹以查找要处理的文件。将文件添加到此文件夹时,服务应该选择该文件并使用该文件执行任务,并在此过程中使用该文件。
我想在多个物理服务器上分配工作以实现容错。这些文件将放置在NAS上,可供所有服务实例访问。
重要的要求是我希望每项服务都专门提取文件;文件不应由多个服务处理。
以这种方式处理文件有什么好的策略吗?
答案 0 :(得分:3)
在我看来,最简单的解决方案是创建一个.lock文件。因此,如果ServiceA看到名为myfile.dat
的文件,它将查找myfile.dat.lock
文件。如果没有找到它,它会创建一个;子序列服务会看到myfile.data.lock
文件并跳过该文件。
两个服务仍有可能在同一时间尝试创建.lock文件,但其中一个服务会因尝试创建重复文件而收到异常。所以你可以处理那个异常并重试.lock文件检查(或者只是跳过它)并从那里继续。
答案 1 :(得分:1)
您可以部署Apache ZooKeeper。当处理服务器想要处理它创建并锁定“节点”的文件时,对该文件起作用,然后解锁该节点。如果一次只处理一次文件是一个重要的要求,我就不会自己动手。它实现起来比听起来更难,ZooKeeper会正确处理它。