我有一个应用程序处理目录中的文件,并将它们与处理后的输出一起移动到另一个目录。没什么特别的。引入了一个有趣的要求:
允许多个远程实例在同一个文件存储上工作,从而实现容错和处理吞吐量。
其他注意事项是我们不能假设文件系统,因为我们同时支持Windows和NFS。
当然问题是,我如何确保不同的实例不会尝试和处理相同的工作,可能会破坏工作或降低吞吐量?文件锁定可能会有问题,尤其是跨网络共享。我们可以使用更复杂的方法,例如简单的数据库或消息传递框架(jMS或类似的),但整个集群需要具有容错能力。我们不能拥有一个数据库或消息提供者,因为它引入了单点故障。
我们已经实施了一个解决方案,该解决方案使用多播消息来自我发现处理实例并选出分配工作的主管。如果主管垮台并进行另一次选举,则会超时。然而,我们的网络库不是很成熟,我们的消息实现很笨拙。
然而,我的直觉告诉我,有一种更简单的方法。
思想?
答案 0 :(得分:1)
我认为您可以放心地假设重命名操作在您关心的所有网络文件系统上都是原子操作。因此,如果您将大量工作安排为单个文件(或键入单个文件),则让每个服务器首先列出包含新工作的目录,选择一项工作,然后将其重命名为自己的文件服务器名称(例如,机器名称或IP地址)。对于同时执行相同操作的其中一个实例,重命名将成功,因此他们应该处理该工作。对于其他人来说,它会失败,所以他们应该从他们获得的列表中选择一个不同的文件。
为了创建新工作,假设目录创建(mkdir)是原子的,但文件创建不是(对于文件创建,第二个编写器可能会覆盖现有文件)。因此,如果还有多个工作生成器,请为每个工作创建一个新目录。