【问题标题】:How to retrieve data from remote server faster in java?java - 如何在java中更快地从远程服务器检索数据?
【发布时间】:2016-11-04 22:40:31
【问题描述】:

我有一个增强的 for 循环,进入 ch.ethz.ssh2.connection 以获得超过 200 个值。每次进入循环时,都会对新服务器进行身份验证,并且它只从该服务器检索一个值。每次循环时,数据都被保存到一个数组列表中,以便使用 thymeleaf 显示在 html 表中。但是这种方法需要永远让 Eclipse 一次运行所有 200 个值,然后当我打开 localhost:8080 以加载所有包含所有数据的表时,它必须重新启动。加载页面需要超过 5 分钟。我可以做些什么来加快速度?

代码问题

List<DartModel> data = new ArrayList<DartModel>();
for(String server:serverArray) {    

    try {

        conn = new ch.ethz.ssh2.Connection(server);
        conn.connect();
        boolean isAuthenticated = conn
                .authenticateWithPassword(username_array[j],
                        password_array[j]);
        if (isAuthenticated == false) {
            throw new IOException("Authentication failed.");
        }

我需要以某种方式重新编码上面的代码,以便我可以超快速地获取所有数据。

输出

Loop1: Server1
Loop2: DifferentServer2
Loop3: AllDifferentSever3
and goes on......

替代方案

我正在考虑让java程序运行几次,同时将数据保存到redis中。然后自动刷新程序,当它运行时将数据发送到redis。设置过期时间,但我无法将数据放入 thymeleaf html 表中。这行得通吗?如果是这样,我怎样才能将其显示到百里香中。

【问题讨论】:

  • 添加代码会有所帮助
  • 为什么您通过 SSH 而不是一些 HTTP API 接收值? (因为您正在加载 HTML 页面)
  • 使用 FindBugs 给出关于 string+ 等的警告。分析是有意义的。
  • 如何让程序一次性吐出所有值?每个“服务器”在每个循环中都有不同的值。
  • 您也许可以使用线程从 200 个服务器地址中取出“块”,但不清楚每个线程应该做什么。

标签: java


【解决方案1】:

您可以一次查询多个服务器(并行)。

如果您的远程连接框架是阻塞(您调用的方法实际上是等到收到响应),您必须启动少数线程(一个在边缘情况下用于一台服务器的线程)并行执行此操作(扩展性不是很好)。

当您可以使用一些基于 Future/Promise 的工具时,您可以在没有太多开销的情况下做到这一点(将 200 个期货转换为 200 个值/响应的一个未来)。

注意:如果您要查询单个服务器以获取 200 个响应,那么这样做并不是一个好主意,因为您会同时收到太多请求。然后你应该实现一些方法来通过一个请求获取所有数据。

【讨论】:

  • 它不会是单个服务器。它基本上是 200 台服务器,我连接到每台服务器以检索数据。 severarray 是 200 个服务器的列表。感谢您的建议,我会像现在一样展望未来/承诺。
【解决方案2】:

简答:
创建一个在一个响应中发送所有值的消息协议。

更多信息:
定义一个简单的响应消息协议。 一个简单的例子可能是这样的:

count,value,...

count: contains the number of values returned.
value: one of the values.

具体的简单例子:

5,123,234,345,456,567

您可以做得更大,并使用 json 或 XML 定义响应。 使用任何看起来最适合您的实施的方法。

编辑:我的错,如果您轮询多个服务器,这将不起作用。此解决方案假定您从一台服务器检索 200 个值,而不是从 200 个服务器检索一个值。

【讨论】:

  • 如果所有值都在不同的 ssh 连接中,我该怎么做? severArray 作为 200 个服务器的列表。每次循环迭代它都会将服务器名称更改为另一个服务器并对其进行身份验证。然后检索数据
【解决方案3】:

从表面上看,如果不查看您的代码就很难判断(建议分享要点或代码仓库)。

我假设您使用的是library。通常,单个 SSH2 操作将尝试多次尝试对客户端进行身份验证。它将迭代几个“方法”。如果您在命令行上使用 ssh,您可以在使用标志 -vv 时看到这些。如果一个失败,它会尝试下一个。我发现的 java 库实现似乎也是如此。

在您发布的循环中(假设您循环 200 次),您将尝试验证 200 x (验证方法顺序)。我怀疑您的大部分执行可能会在 SSH 握手中被烧毁。这可以通过确保您只使用一次连接并从(已经过身份验证的)打开的套接字中获取尽可能多的信息来避免。

考虑将连接移出循环。如果您绝对必须使用 ssh,并且您使用的数据太大,并行性可能会有所帮助,但这将涉及更多的协调。

【讨论】:

  • 是的,基本上每个循环都会对新服务器进行身份验证。在哪里可以找到有关并行性的更多信息?
  • 并行是一个依赖多个同时运行的操作的概念。对于最佳情况,您可以利用您的硬件(虚拟机)拥有的内核。
  • 我无法将我的连接移出循环,因为每次循环迭代它都会从属性文件中插入一个新的服务器“主机名”并对其进行身份验证
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2021-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多