2

我有一个在多个 IIS 服务器上运行的应用程序,需要解析放置在公共网络驱动器上的 CSV 文件。如果我使用System.IO.FileSystemWatcher Created 事件在文件可用时收到事件通知,如何确保只有一台服务器解析文件?如果所有服务器都收到此更改的通知,所有服务器都将尝试解析它。第一台服务器是否应该在本地复制它然后解析它?这会导致其他服务器上的错误吗?我应该将远程目录访问权限设置为仅允许一台服务器读取访问权限吗?

该文件包含需要插入共享数据库的记录,但记录没有唯一键。因此,如果多台服务器同时抓取文件并插入记录,数据库中就会出现重复。

4

2 回答 2

2

关键问题是:当他们几乎同时尝试解析文件时,是否会发生不好的事情?文件系统级别基本上允许多次读取访问,因此仅此事实并不一定会破坏任何东西。

我可能会尝试在第一次文件访问时创建锁定文件的方法,并让服务器在访问文件之前查找锁定文件。完成后删除锁定文件。

您还可以在文件上设置排他锁,一次只有一台服务器能够执行此操作。其他人将无法尝试:

FileStream fs = new FileStream(
  FilePath, 
  FileMode.Open,
  FileAccess.ReadWrite, 
  FileShare.None
);
于 2008-10-21T06:22:15.663 回答
0

替代锁定的另一个选项是将文件重命名为目录。为每个服务器创建一个子目录,然后让服务器尝试将文件重命名到其目录中(重命名是原子操作)。成功者解析文件。

锁定问题将很棘手,因为每个服务器仍然可以看到该文件,并且他们可能会尝试打开该文件,然后重复出错。重命名对于文件的所有者来说是绝对的。

还要记住,无论您使用什么解决方案,都可能出现“丢失文件”。如果服务器停止处理文件(错误、异常、重新启动...),它可能会被放弃。这些类型问题的典型解决方案是除了诸如文件观察器之类的东西之外,您还让服务器不时地轮询。

Copying the file to a server dir will help a bit with this. One downside would be if a server goes completely off-line, then its file will sit in a dir until the server comes back on-line.

于 2008-10-29T01:58:36.513 回答