обработка серверной стороны по сравнению с клиентской обработкой + ajax?

поиск некоторых общих рекомендаций и/или мыслей...

я создаю то, что я думаю, чтобы быть большим количеством веб-приложения затем веб-страница, потому что я предназначаю это, чтобы быть похожим на приложение Gmail, где Вы оставили бы страницу открытой целый день при получении обновлений, "продвинутых" к странице (для заинтересованного, я использую метод программирования кометы). я никогда не создавал веб-страницу, прежде чем это было настолько богато ajax и JavaScript (я - теперь огромный поклонник jQuery). из-за этого, снова и снова когда я реализую новую опцию, которая требует динамического изменения в UI, о котором должен знать сервер, я сталкиваюсь с тем же вопросом:

1) если я делаю всю обработку на клиенте в JavaScript и отправляю назад как можно меньше через ajax или 2) если я отправляю запрос на сервер через ajax, имею сервер, делают всю обработку и затем передают новый HTML обратно. затем на ajax ответе я делаю уроки с новым HTML

я был склонен всегда следовать за № 1. это веб-приложение, которое я воображаю, может стать довольно болтливым со всеми запросами ajax. моя мысль, минимизируют как можно больше размер запросов и ответов, и полагаются на непрерывно улучшающиеся механизмы JavaScript, чтобы сделать как можно больше обработки и обновлений UI. я обнаружил с jQuery, я могу сделать так много на стороне клиента, что я не смог бы сделать очень легко прежде. мой код JavaScript на самом деле намного больше и более сложен, чем мой серверный код. существуют также простые calulcations, которые я должен выполнить, и я продвинул это на стороне клиента, также.

я предполагаю основной вопрос, который я имею, мы должны ВСЕГДА бороться за клиентскую обработку по серверной обработке каждый раз, когда возможный? я 've всегда чувствовал, чем меньше сервер должен обработать, тем лучше для масштабируемости/производительности. позвольте питанию процессора клиента сделать всю тяжелую работу (если возможный).

мысли?

7
задан mdz 10 January 2010 в 00:40
поделиться

8 ответов

Есть несколько соображений при принятии решения о том, должны ли новые HTML фрагменты, созданные по запросу ajax, быть построены на стороне сервера или клиента. Некоторые вещи, которые следует учитывать:

  • Производительность. Работа, которую должен выполнять ваш сервер, это то, что вас должно беспокоить. Выполняя больше обработки на стороне клиента, вы уменьшаете объем работы, выполняемой сервером, и ускоряете процесс. Если, например, сервер может послать немного JSON вместо гигантского HTML-фрагмента, то было бы гораздо эффективнее позволить это сделать клиенту. В ситуациях, когда в любом случае передается небольшой объем данных, разница, вероятно, ничтожно мала.

  • Читабельность. Недостатком генерации разметки в вашем JavaScript является то, что намного сложнее читать и поддерживать код. Встраивание HTML в цитируемые строки неприятно смотреть в текстовом редакторе с раскраской синтаксиса, установленной в JavaScript, и делает редактирование более сложным.

  • Разделение данных, представление и поведение. Помимо удобочитаемости, наличие HTML-фрагментов в JavaScript не имеет особого смысла для организации кода. Шаблоны HTML должны обрабатывать разметку, а JavaScript следует оставить в покое, чтобы он мог обрабатывать поведение вашего приложения. Содержимое HTML-фрагмента, вставляемого в страницу, не имеет отношения к вашему JavaScript-коду, а только к тому, что он вставляется, где и когда.

Я склонен больше склоняться к возвращению HTML-фрагментов с сервера при работе с ответами по протоколу ajax, по причинам, о которых я упоминал выше, связанным с удобочитаемостью и организацией кода. Конечно, все зависит от того, как работает ваше приложение, насколько интенсивно обрабатываются ответы по аяксу, и сколько трафика получает приложение. Если серверу приходится выполнять значительную работу по генерированию этих ответов, и это приводит к появлению узких мест, то может быть более важным подтолкнуть работу к клиенту и отказаться от других соображений.

1
ответ дан 7 December 2019 в 14:33
поделиться

Конечно, это зависит от данных, но в большинстве случаев, если вы можете протолкнуть его на сторону клиента, сделайте это. Заставьте клиента делать больше обработки и использовать меньше пропускной способности. (Опять же, это зависит от данных, вы можете попасть в случаи, когда вам нужно отправить больше данных, чтобы сделать это на стороне клиента).

0
ответ дан 7 December 2019 в 14:33
поделиться

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

Кстати, знаете ли вы, что можно запускать Javascript на стороне сервера, отображать шаблоны и обращаться к базам данных? Ознакомьтесь с экосистемой CommonJS .

0
ответ дан 7 December 2019 в 14:33
поделиться

Также могут быть проблемы с поддержкой кросс-браузера. Если вы используете кросс-браузер, библиотека на стороне клиента (например, jQuery), и она может обрабатывать всю необходимую обработку, вы можете позволить библиотеке позаботиться об этом. Генерация кросс-браузера HTML-сервер-сторона может быть сложнее (имеет больше ручного), в зависимости от сложности разметки.

0
ответ дан 7 December 2019 в 14:33
поделиться

Похоже, что вы взяли эту цитату из часто задаваемых вопросов comp.lang.c (возможно, старая версия или, возможно, печатная версия; он не вполне соответствует текущему состоянию онлайн):

http://c-faq.com/aryptr/aryptrequiv.html

Соответствующий раздел содержит ссылки на другие разделы часто задаваемых вопросов для более подробного описания этих исключений. В вашем случае вы должны посмотреть на:

http://c-faq.com/decl/strlitinit.html

-121--1302225-

Обычно вы можете просто загрузить класс как ресурс из Classloader.

Class c = ...
String className = c.getName();
String classAsPath = className.replace('.', '/') + ".class";
InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath);

Я бы, вероятно, рекомендовал использовать что-то из Apache commons-io для чтения InputStream в байт [] , но IOutils.toByteArray () должен сделать трюк. Написание этого кода действительно легко ошибиться и/или сделать медленным.

-121--1536556-

В настоящее время я работаю над довольно ресурсоемким приложением и выполняю почти все его на стороне клиента. Я не знаю точно, чем будет заниматься ваше приложение (более подробная информация будет отличной), но я бы сказал, что ваше приложение может сделать то же самое. Просто убедитесь, что весь код, связанный с безопасностью и базой данных, находится на стороне сервера, потому что это не откроет бреши в безопасности в приложении. Вот некоторые общие рекомендации, которым я руководствуюсь:

  • Никогда не полагайтесь на пользователя, имеющего сверхбыстрый браузер или компьютер. Некоторые люди используют Internet Explorer 7 на старых машинах, и если для них это будет слишком медленно, вы потеряете много потенциальных клиентов. Тестирование на максимально возможном количестве различных браузеров и компьютеров .
  • Если у вас есть какой-либо код, который потенциально может замедлить или заморозить браузер на мгновение, покажет механизм обратной связи (в большинстве случаев это будет делать простое сообщение «Загрузка»), чтобы сообщить пользователю, что что-то действительно происходит, и браузер не просто случайно заморозил.
  • Попробуйте загрузить как можно больше во время инициализации и кэшировать все . В моем приложении я делаю что-то похожее на Gmail: показываю панель загрузки, загружаю все, что когда-либо понадобится приложению, а затем даю пользователю плавный опыт оттуда. Да, им придется подождать пару секунд, пока он загрузится, но после этого проблем быть не должно.
  • Минимизация манипуляций DOM. Необработанная производительность JavaScript может быть «достаточно быстрой», но доступ к DOM все еще медленный. Избегайте создания и уничтожения элементов; вместо этого просто спрятать их, если они не нужны в данный момент.
1
ответ дан 7 December 2019 в 14:33
поделиться

Я недавно бежал в ту же проблему и решил пойти с боковой обработкой браузера, все отлично работало в FF и IE8 и IE8 в режиме 7, но тогда ... наш клиент, используя Internet Explorer 7 RAN в проблемы, приложение Официально замораживается и окно тайм-аут скрипта, я положил слишком много работы в решение, чтобы выбросить его, поэтому я закончил расходу за час или настолько оптимизировать сценарий и добавлять мероприятия, где это возможно.

Мои предложения?

  • Если возможно, сохраните не критические расчеты клиентской стороной.
  • Для обеспечения передачи данных передачи данных используйте JSON и позвольте клиенту сортировать HTML.
  • Проверьте свой скрипт, используя самый низкий общий знаменатель.
  • При необходимости используйте функцию профилирования в Firebug. Следствие: Используйте несжатую (разработку) версию jQuery.
1
ответ дан 7 December 2019 в 14:33
поделиться

Можно сохранить объекты в столбце ГЕОГРАФИЯ и создать над ним ПРОСТРАНСТВЕННЫЙ ИНДЕКС .

К сожалению, SQL Server реализует пространственные индексы путем замощения поверхности и сохранения идентификаторов плиток в простом индексе B-Tree , поэтому простой ORDER BY STDisance работать не будет (ну, но не будет использовать

Вместо этого необходимо сделать запрос, подобный следующему:

DECLARE @mypoint GEOGRAPHY
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326);

WITH    num (distance) AS
        (
        SELECT  1000
        UNION ALL
        SELECT  distance + 1000
        FROM    num
        WHERE   distance <= 50000
        )
SELECT  TOP 1 m.*
FROM    num
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable
        WHERE   myroad.STDistance(@mypoint) <= distance
        ORDER BY
                STDistance(@mypoint)
        ) m

Этот путь, SQL Server сначала будет искать дороги в пределах 1 километра от точки, затем в пределах 2 километра и т.д., каждый раз используя индекс.

Обновление:

Если у вас есть несколько точек в таблице и вы хотите найти ближайшую точку для каждой из них:

WITH    num (distance) AS
        (
        SELECT  1000
        UNION ALL
        SELECT  distance + 1000
        FROM    num
        WHERE   distance <= 50000
        )
SELECT  mp.mypoint, m.*
FROM    @mypoints mp
CROSS APPLY
        (
        SELECT  TOP 1 m.*
        FROM    num
        CROSS APPLY
                (
                SELECT  TOP 1 *
                FROM    mytable
                WHERE   myroad.STDistance(@mypoint) <= distance
                ORDER BY
                        STDistance(@mypoint)
                ) m
        ) m
-121--3119948-

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

Мой совет состоит в том, чтобы на самом деле проверить, как работает ваше приложение, когда оно включено в течение всего дня. Проверьте отсутствие утечек памяти. Проверьте, что нет запроса ajax, создаваемого каждые половину секунды после работы с приложением в течение некоторого времени (таймеры в JS могут быть болью когда-нибудь).

Кроме этого никогда не выполняйте проверку пользовательского ввода с помощью javascript. Всегда дублировать его на сервере.

Edit

Use jquery live binding . Это сэкономит много времени при повторной привязке сгенерированного содержимого и сделает вашу архитектуру более четкой. К сожалению, когда я разрабатывал с jQuery, он еще не был доступен; мы использовали другие инструменты с таким же эффектом.

В прошлом у меня также была проблема, когда генерация части одной страницы с использованием ajax зависит от генерации другой части. Создание первой и второй частей сделает вашу страницу медленнее, как и ожидалось. Запланируйте это впереди. Создайте страницы, чтобы они уже имели все содержимое при открытии.

Кроме того (относительно простых страниц), сохраните низкое количество файлов ссылок на одном сервере. Объединение библиотек javascript и css в один файл на стороне сервера. Храните изображения на отдельном хосте, лучше разделяйте хосты (создание только третьего уровня домена будет делать тоже). Хотя это стоит того только на производстве; это усложнит процесс развития.

1
ответ дан 7 December 2019 в 14:33
поделиться

Это возможно, но с тяжелой загрузкой на нагрузку и тяжелое использование кэширования. Возьмите Gmail в качестве примера

  • на нагрузке на начальную страницу, он загружает большинство файлов JS, необходимых для запуска. И большая часть всех кэшированных.
  • Не использовать изображения и графики.
  • Загрузите все данные должны отображаться в Intial нагрузки и наряду с последующими предсказуемыми пользовательскими данными. В Gmail & Neight Yahoo Mail Почта почты входящие не только заполнены одним телом разговора по почте, он заранее загружается в первые несколько полных сообщений электронной почты во время Pageload. Секрет высокой респонденты приходит с стоимостью (Gmail просит загрузить светлую версию, если полоса пропускания низкая. Если ставка, большинство из нас произошли).
  • Следуйте Принцип поцелуи . Средства сохраняют твоего депонии просто.
  • И никогда не пытайтесь сделать всю страницу, используя JavaScript в любом случае, вы не можете предсказать всех ваших коюзайдеров, используя высокие системы конфигурации или системы высокой пропускной способности.

Умный, чтобы разделить рабочую нагрузку между вашим сервером и клиентом.

0
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: