gpt4 book ai didi

database - 在分布式系统中锁定文件

转载 作者:可可西里 更新时间:2023-11-01 10:37:09 26 4
gpt4 key购买 nike

我有一个分布式应用;也就是说,我有一个在多台计算机上运行的同构进程,它与中央数据库通信并访问网络文件共享。

此过程从网络文件共享(通过 CIFS)中获取集合文件,对这些文件运行转换算法并将输出复制回网络文件共享。

我需要锁定输入文件,以便运行相同进程的其他服务器不会处理相同的文件。为了便于争论,假设我的描述过于简单,并且锁是绝对必须的。

这是我提出的解决方案和一些想法。

1) 使用机会锁(oplocks)。此解决方案仅使用文件系统来锁定文件。这里的问题是,我们必须尝试获取锁才能确定锁是否存在。这似乎很昂贵,因为网络重定向器会协商锁定。这样做的好处是,机会锁可以以这样的方式创建,当出现错误时它们会自行删除。

2) 使用数据库应用程序锁(通过 sp_getapplock)。这样看起来会快很多,但是现在我们是用数据库来锁定一个文件系统。此外,数据库应用程序锁可以通过事务或 session 限定范围,这意味着如果我想保留并稍后释放应用程序锁,我必须保留连接。目前,我们正在使用连接池,这将不得不改变,而且这本身可能是一个更大的对话。这种方法的好处是,如果我们失去与服务器的连接,锁将被清除。当然,这意味着如果我们失去与数据库的连接,而不是网络文件共享,那么当我们仍在处理输入文件时,锁就会消失。

3) 创建一个数据库表和存储过程来表示我想锁定的项目。这个过程很简单。不利的一面当然是潜在的网络错误。如果由于某种原因,数据库变得不可访问,锁定将保持有效。然后我们需要推导出一些算法来在以后清理它。

什么是最好的解决方案,为什么?答案不限于上述那些。

最佳答案

对于您的情况,您应该使用共享模式锁。这正是它们的用途。

Oplocks 不会按照您的意愿进行 - oplock 不是锁,也不会阻止任何人做任何事情。这是一种通知机制,让客户端机器知道是否有人访问了该文件。这是通过“打破”你的 oplock 来传达给机器的,但这并不是进入应用程序层(即你的代码)的东西 - 它只是向客户端操作系统生成一条消息,告诉它使其缓存无效复制并再次从服务器获取。

在这里查看 MSDN:

有关当另一个进程打开您持有 oplock 的文件时发生的情况的解释如下:

然而重要的一点是机会锁不会阻止其他进程打开文件,它们只是允许客户端计算机之间的协调。因此,oplocks 不会在应用程序级别锁定文件 - 它们是网络文件系统堆栈用来实现缓存的网络协议(protocol)的一个功能。它们并不是真正供应用程序使用。


由于您是在 Windows 上编程,因此合适的解决方案似乎是共享模式锁定,即使用 SHARE_DENY_READ|SHARE_DENY_WRITE|SHARE_DENY_DELETE 打开文件。

如果 CIFS 服务器不支持共享模式锁,您可以考虑使用 flock() 类型的锁。 (以传统的 Unix 技术命名)。

如果您正在处理 xyz.xml 创建一个名为 xyz.xml.lock 的文件(使用 CREATE_NEW 模式,这样您就不会破坏现有的)。完成后,将其删除。如果您因为文件已经存在而无法创建该文件,则意味着另一个进程正在处理它。将对调试有用的信息写入锁定文件可能很有用,例如服务器名和 PID。您还必须有一些方法来清理废弃的锁定文件,因为这不会自动发生。

如果 CIFS 是一个复制系统,数据库锁可能是合适的,这样 flock() 锁就不会在整个系统中自动发生。否则我会坚持使用文件系统,因为只有一件事会出错。

关于database - 在分布式系统中锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com