[英]How to effectively monitor change on a remote location?
我们必须监控远程系统文件的变化,我们通过FTP,SMB访问。 我们没有任何SSH访问远程系统/ OS。 我们对远程系统的唯一看法是FTP或Samba让我们看到的。
我们今天做了什么:
定期扫描整个目录,在内存中构造一个表示来做我们的东西,然后将它与我们在数据库中的内容合并。
我们想做什么:
能够确定目录是否已更改,因此是否需要解析。 理想情况下,永远不必进行完整的解析。 我们不想过多依赖操作系统功能(inode ...),因为它可能会从安装变为另一个。
主要目标 :当数据量非常大时,此过程开始变慢。 此日期中只有几个是新的,需要进行解析。 如何解析并添加到我们的数据库只有这部分?
我们此时讨论的线索:
我们真正想要的是:
一些输入和最佳实践,因为这个问题接缝很好,并且应该已经讨论了bean,我们不想在这一点上做一些过于复杂的事情。
在此先感谢,一群同行开发人员;-)
我们使用java / spring / hibernate堆栈,但我不认为这里很重要。
编辑 :基本上,我们访问FTP服务器或等效服务器。 本地副本不是一个选项,因为数据量很大。
远程目录轮询器Java (rdp4j)库可以帮助您轮询FTP位置并通过以下事件通知您:文件在目录中添加/删除/修改。 它对目录中的每个文件使用lastModified日期,并将它们与之前的轮询进行比较。
请参阅完整的用户指南 ,其中包含以下API快速教程中的FtpDirectory
和MyListener
实现:
package example
import java.util.concurrent.TimeUnit;
import com.github.drapostolos.rdp4j.DirectoryPoller;
import com.github.drapostolos.rdp4j.spi.PolledDirectory;
public class FtpExample {
public static void main(String[] args) throws Exception {
String host = "ftp.mozilla.org";
String workingDirectory = "pub/addons";
String username = "anonymous";
String password = "anonymous";
PolledDirectory polledDirectory = new FtpDirectory(host, workingDirectory, username, password);
DirectoryPoller dp = DirectoryPoller.newBuilder()
.addPolledDirectory(polledDirectory)
.addListener(new MyListener())
.setPollingInterval(10, TimeUnit.MINUTES)
.start();
TimeUnit.HOURS.sleep(2);
dp.stop();
}
}
您无法使用目录大小或修改日期来判断子目录是否已更改。 完全停止。 至少你必须做一整个树的完整目录列表。
如果您满意,您可以避免阅读文件内容,您可以依赖修改日期和时间的组合。
我的建议是使用现成的软件来创建本地克隆(例如rsync,robocopy),然后对本地克隆进行比较/解析。 然后,问题“它是否已更新”是rsync要回答的问题。
如前所述,您无法通过FTP或SMB跟踪目录。 您可以做的是列出远程服务器上的所有文件并构建包含以下内容的快照:
使用此信息,您将能够确定需要查找哪些目录以及需要传输哪些文件。
安全且可移植的解决方案是使用强哈希/校验和,例如SHA1或(最好)SHA512。 哈希可以映射到您想要计算和存储的任何表示。 您可以使用以下递归配方 (改编自Git版本控制系统):
也许前面加上f
到每个文件和d
散列之前,每个目录表示。
你也可以使用Git(或Mercurial,或任何你喜欢的东西)将目录放在版本控制下,定期git add
所有内容,使用git status
查找更新内容,然后git commit
更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.