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 と、SELECT をサイド バイ サイド フィールドに変換する multi-select.js を使用しています。マルチセレクトはこちらから: http://loudev.com/

次に、パス内のすべてのサーバーはかなり強力で、すべて 10 GB で接続されています。そのため、間にあるファイアウォール以外に、ボトルネックがあってはなりません。

使用するブラウザに関係なく、上記のコードは機能しますが、ホスト名フィールドにデータを入力するときはかなり遅くなります。プルしている 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 と進行状況バーを追加するだけで、OK な解決策になるのでしょうか? 私は正直により良い解決策を見つけたいと思っていますが、私は確かに提案を受け入れています! 考え?

4

0 に答える 0