代码之家  ›  专栏  ›  技术社区  ›  Chris Scott

经典文件系统问题-目录上的并发远程处理

  •  2
  • Chris Scott  · 技术社区  · 17 年前

    另外需要注意的是,我们不能假设文件系统,因为我们支持Windows和NFS。

    当然,问题是,我如何确保不同的实例不会尝试和处理相同的工作,从而可能损坏工作或降低吞吐量?文件锁定可能会有问题,尤其是在网络共享中。我们可以使用更复杂的方法,例如简单的数据库或消息传递框架(la JMS或类似工具),但整个集群需要具有容错性。我们不能有一个数据库或消息传递提供程序,因为它引入了单点故障。

    我们已经实现了一个解决方案,该解决方案使用多播消息来自我发现处理实例,并选择一个分配工作的主管。如果主管关闭并进行另一次选举,则会有一个超时。然而,我们的网络库还不太成熟,我们的消息实现也很笨拙。

    1 回复  |  直到 17 年前
        1
  •  1
  •   Martin v. Löwis    17 年前

    我认为您可以放心地假设重命名操作在您关心的所有网络文件系统上都是原子性的。因此,如果将工作量安排为单个文件(或键入单个文件),则让每个服务器首先列出包含新工作的目录,选择一个工作,然后将文件重命名为自己的服务器名称(例如,机器名或IP地址)。对于同时执行相同操作的实例之一,重命名将成功,因此他们应该处理这项工作。对于其他实例,重命名将失败,因此他们应从获得的列表中选择一个不同的文件。

    对于新作品的创建,假设目录创建(mkdir)是原子的,但文件创建不是(对于文件创建,第二个编写者可能会覆盖现有文件)。因此,如果也有多个作品生产者,请为每件作品创建一个新目录。

    推荐文章