繁体   English   中英

如何有效监控远程位置的变化?

[英]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快速教程中的FtpDirectoryMyListener实现:

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版本控制系统):

  1. 文件的哈希值是其内容的哈希值,忽略名称;
  2. 对目录进行哈希处理,将其视为文本表示形式的文件名 - 哈希对的排序列表,并将其作为散列。

也许前面加上f到每个文件和d散列之前,每个目录表示。

你也可以使用Git(或Mercurial,或任何你喜欢的东西)将目录放在版本控制下,定期git add所有内容,使用git status查找更新内容,然后git commit更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM