2

如果我提供的信息超出此问题所需的信息,请原谅我。:D

我正在构建一个从远程机器中提取大型 JSON 数据集的应用程序。但是,我在一个安全的环境中工作,该环境将应用程序服务器与防火墙等分开。因此,我不得不做一些捏造(使用 SSH)来获取我需要的数据。我已请求打开其他端口,以便我可以绕过使用 SSH,但被拒绝了。

这是通过 SSH 获取数据的物理路径: My Application Server -> Secure Server with Curl -> Multiple unique application servers with JSON data

遵守安全规则;我在我的应用服务器上编写了下面的 CFML 代码。(服务器运行 Linux、Lucee 4.5、MySQL 和 Apache)

<cfset secure_server = "secure_server.my.example.com">
<cftry>
    <cfexecute 
    name="/usr/bin/ssh" 
    arguments="#secure_server# ./RemoteDirectory/server_list.sh" 
    timeout="10" 
    variable="server_list">
    </cfexecute>
    <cfcatch type="any">
        <cfoutput>
            #cfcatch.message#<br>#cfcatch.detail#<br>
        </cfoutput>
    </cfcatch>
</cftry>

上面的代码只是简单地通过 SSH 连接到安全服务器并运行一个名为 server_list.sh 的脚本。脚本的重要部分如下:

curl -s -k -b cookie.jar -c cookie.jar https://unique_application_server/Path/To/Server/list -H "Accept:application/json"

该 curl 脚本返回一个 JSON 字符串,看起来与此类似(但包含更多数据):

{
  "os" : "Linux ",
  "fqdn" : "server1.my.example.com",
  "disk_status" : "OK",
  "system_model" : "HP",
  "type" : "Server"
},
{
  "os" : "Linux ",
  "fqdn" : "server2.my.example.com",
  "disk_status" : "OK",
  "system_model" : "Dell",
  "type" : "Server"
},

此时发送的 JSON 数据量约为 3MB。然而,随着时间的推移,这些数据将呈指数增长。

一旦我将 JSON 返回到我的应用程序服务器;我使用 CF 的 deserializeJSON 函数然后抓取我需要的字段。在这种情况下,它的 FQDN 字段。由于来自 JSON 的数据是一个完整的域,因此我只需要选择主机名。“new_label”代码会处理这个问题。可能有比我正在使用的更好的 REGEX 或更好的方法,但这有效。

<cfset arrayOfStructs = deserializeJson(server_list)>
<select multiple="multiple" class="searchable" name="searchable[]">
    <cfloop array="#arrayOfStructs#" index="PARENT">
        <cfset new_label = ReReplace(PARENT.fqdn, "(.[^.]*)$", "")>
        <cfset new_label = ReReplace(new_label, "(.[^.]*)$", "")>
        <cfset new_label = ReReplace(new_label, "(.[^.]*)$", "")>
        <cfoutput><option value="#PARENT.fqdn#">#new_label#</option></cfoutput>
    </cfloop>
</select>

上面的代码使用来自 JSON 的服务器的主机名填充该字段。OPTION 字段看起来像这样:

<option value="server1.my.example.com">server1</option>

一些可能(或可能不会)有帮助的注意事项。我正在使用 jQuery 和 multi-select.js 将 SELECT 转换为并排字段。多选来自这里: http: //loudev.com/

其次,路径中的所有服务器都相当强大,并且都连接了超过 10GB 的容量。所以除了防火墙之间,不应该有任何瓶颈。

无论我使用哪种浏览器,上面的代码都可以工作,但是在填充主机名字段时会相当慢。因为我每分钟都在提取更新的 JSON 数据,所以我无法将它长期存储在我的应用程序服务器上的数据库中。

知道了这一切,我的问题是:如何加快表单字段的速度,以便用户不必等待页面加载 2500 多个服务器名称?

我可以利用 jQuery 或 MySQL 数据库来加快处理速度而不会遇到过时的数据吗?这可能只是我从 FQDN 获取主机名的方法吗?我应该放弃这种方法并尝试其他方法吗?我是否在 Stack 上忽略了一些有我答案的东西?(我在这里花了很多时间搜索 Q/A,但一无所获。也许我还不够努力。)

各位好心人还需要什么其他信息吗?谢谢!:D

更新 -

@亚历克斯。我现在就做这个测试。代码如下。不过建议很好!

<cfset tickBegin = GetTickCount()>
<!--- THE CODE THAT RUNS THE JSON QUERY ABOVE --->  
<cfset tickEnd = GetTickCount()>
<cfset testTime = tickEnd - tickBegin>
<cfoutput>Page(#testTime#ms)</cfoutput>

至于缓存数据,这是我的问题的一部分。如何缓存?使用什么方法?如何在不显示陈旧数据的情况下缓存 JSON?这是 AJAX 有用的实例吗?

更新 2——

我会以错误的方式解决这个问题吗?我知道有时您需要向用户显示大量数据。简单地添加一个 BlockUI 和一个进度条说明请稍候是一个好的解决方案吗?我更愿意诚实地找出更好的解决方案,但我肯定愿意接受建议!想法?

4

0 回答 0