JSON GZIP Выбор дизайна - PullRequest
1 голос
/ 26 мая 2011

Я работаю над веб-приложением с динамическим контентом, генерируемым сервлетом, работающим в контейнере JBoss, и статическим балансом контента / нагрузки, обрабатываемым Apache + mod_jk.

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

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

 gzout = new GZIPOutputStream(response.getOutputStream());

Может ли это быть обработано с помощью mod_deflate на стороне Apache? Если вы можете сделать это, считается ли это лучшей практикой, вы можете объяснить, почему или нет?

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Я считаю, что в вашем случае имеет больше смысла применять HTTP-сжатие в Apache.

Если сервер правильно настроен для сжатия ответов этого типа (application / json, если серверный код настроенправильный тип содержимого), тогда он все равно расточительно повторно сжимается после ручного сжатия.

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

0 голосов
/ 26 мая 2011

Небольшое дополнительное исследование показывает пару хороших альтернатив.

Проблема:

  1. Между Apache и Jboss существует сетевой канал. Без сжатия на стороне jboss у вас возникли бы те же проблемы с задержкой и пропускной способностью, что и между Apache и вашими клиентами.

Решения:

  1. Вы можете использовать mod_deflate на Apache и принимать несжатые ответы от jboss и сжимать перед доставкой своим клиентам. Я мог видеть, что это имеет некоторый смысл в определенных сетевых топологиях (предложено Дейвом Уордом).

  2. Вы можете применить фильтр Java EE. Это отфильтрует ответы, сжимая их до того, как они появятся в контейнере JBoss. Это дает преимущество сжатия на уровне JBoss без кучки неприятного кода, связанного с GZIP, в вашем бизнес-сервлете.

  3. JBoss по умолчанию использует Tomcat в качестве движка сервлета. Если вы перейдете к $ JBOSS_HOME / deploy / jbossweb-tomcat55.sar, вы можете отредактировать файл server.xml, включив атрибут «ression = on »в коннекторе HTTP / 1.1. Это сожмет все ответы, исходящие из контейнера.

Компромисс между 2 и 3 заключается в сжатии кусочков еды для разных сервлетов или сжатии всех ответов.

...