【问题标题】:Distributed File Access Strategies分布式文件访问策略
【发布时间】:2011-05-09 06:49:43
【问题描述】:

我有一个用 C# 编写的 Windows 服务,它监视要处理的文件的文件夹。当文件被添加到这个文件夹时,服务应该获取文件并使用它执行任务,在这个过程中使用文件。

我想将工作分布在多个物理服务器上以实现容错。这些文件将放置在所有服务实例都可以访问的 NAS 上。

重要的要求是我希望每个服务都专门获取一个文件;一个文件不应由多个服务处理。

以这种方式处理文件有什么好的策略吗?

【问题讨论】:

    标签: .net file windows-services distributed


    【解决方案1】:

    在我看来,最简单的解决方案是创建一个 .lock 文件。因此,如果 ServiceA 看到一个名为 myfile.dat 的文件,它将寻找一个 myfile.dat.lock 文件。如果它没有找到它,它会创建一个;子序列服务将看到myfile.data.lock 文件并跳过该文件。

    仍有可能两个服务会尝试同时创建 .lock 文件,但其中一个服务会因尝试创建重复文件而收到异常。因此,您可以处理该异常并重试 .lock 文件检查(或跳过它)并从那里继续。

    【讨论】:

    • 我喜欢这种方法的声音,但是如何处理突然终止并留下.lock 文件的进程? (假设未完成的工作可以安全恢复)
    • 这总是一个问题;一种方法是编写一些“到期”逻辑。也就是说,处理文件的进程可以继续更新.lock 文件的时间戳,或者您可以将时间戳放入 .lock 文件中。然后其他进程可以检测到,基于时间戳在 5 分钟内未更改(仅作为示例)这一事实,并“接管”该锁定文件。
    • .lock 文件上的 Keep-alives 使这个解决方案对我来说足够好。
    【解决方案2】:

    您可以部署Apache ZooKeeper。当处理服务器想要处理文件时,它会创建并锁定一个“节点”,处理该文件,然后解锁该节点。如果文件的一次性处理是一项重要要求,我不会自己动手。它比听起来更难实现,ZooKeeper 会正确处理它。

    【讨论】:

    • 也许是“正确”的答案,但我认为我们没有现成的基础设施来实现这一点。将不得不审查。
    猜你喜欢
    • 2016-06-29
    • 2016-08-16
    • 2019-07-27
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2014-01-25
    相关资源
    最近更新 更多