Заполнение SELECT большим набором данных JSON через ColdFusion (Lucee) очень медленно

Пожалуйста, прости меня, если я предоставил больше информации, чем требуется для этого вопроса.:D

Я создаю приложение, которое извлекает большие наборы данных JSON с удаленного компьютера. Тем не менее, я работаю в безопасной среде, которая разделяет серверы приложений с помощью брандмауэров и т. Д. Из-за этого мне пришлось немного выдумать (используя SSH), чтобы получить нужные мне данные. Я попросил открыть дополнительные порты, чтобы я мог обойти с помощью SSH, но было отказано.

Вот физический путь получения моих данных через SSH: Мой сервер приложений -> Защищенный сервер с Curl -> Несколько уникальных серверов приложений с данными JSON.

Соблюдать правила безопасности; Я написал код 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 в настоящее время составляет около 3 МБ. Однако эти данные со временем будут расти экспоненциально.

Как только я вернул 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/

Во-вторых, все серверы в пути довольно мощные и все подключены более 10 ГБ. Поэтому, кроме межсетевых экранов, не должно быть горлышков бутылок.

Независимо от того, какой браузер я использую, приведенный выше код работает, но довольно медленный, когда заполняет поле имени хоста. Поскольку данные JSON, которые я получаю, обновляются примерно каждую минуту, я не могу их долго хранить в базе данных на моем сервере приложений.

Зная все это, я задаюсь вопросом: как я могу ускорить заполнение поля формы, чтобы пользователю не приходилось ждать загрузки страницы с 2500+ серверами?

Могу ли я использовать jQuery или базу данных MySQL, чтобы ускорить процесс без использования устаревших данных? Может быть, это просто мой метод получения имени хоста из полного доменного имени? Должен ли я отказаться от этого метода и попробовать что-то еще? Я что-то упустил здесь, в стеке, на котором есть мой ответ? (Я потратил много времени на поиск вопросов и ответов здесь, но ничего не нашел. Возможно, я не выглядел достаточно усердно.)

Любая другая информация вам нужна приятные люди? Спасибо!:D

ОБНОВИТЬ --

@Alex. Я делаю этот тест сейчас. Код ниже. Хорошее предложение, хотя!

<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 и индикатора выполнения, показывающего, пожалуйста, подождите, будет ли это хорошим решением? Я бы предпочел честно найти лучшее решение, но я открыт для предложений точно! Мысли?

0 ответов

Другие вопросы по тегам