JSON-API в NodeJS за веб-сервером Apache: лучшие практики для обработки кэширования и сжатия? - PullRequest
3 голосов
/ 10 июля 2011

Я написал JSON-API в NodeJS для небольшого проекта, работающего за веб-сервером Apache.Теперь я хотел бы улучшить производительность, добавив кеширование и сжатие.По сути, вопрос заключается в том, что следует делать в самом NodeJS и что лучше обрабатывать в Apache:

a) У вызовов API есть уникальные URL-адреса (например, / api / user-id / content), и я хочу кэшироватьих не менее 60 секунд.

b) Я хочу, чтобы вывод обрабатывался как Gzip (если это понимает клиент).HTTP-модуль NodeJS обычно доставляет контент как «чанкированный».Поскольку я пишу ответ только в одном месте, достаточно ли настроить заголовок Content-encoding, чтобы он служил одним куском, чтобы его можно было сжать и кэшировать?

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

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

Простой кэш

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

1 голос
/ 12 июля 2011
> I wrote a JSON-API in NodeJS for a small project, running behind an
> Apache webserver.

Я бы просто запустил API на другом порту, а не за Apache (прокси ??).Если вы хотите использовать прокси, я бы посоветовал вам использовать NGINX .См. слайды Райана Даля, в которых обсуждается Apache против NGINX (слайды 8+).NGINX также может выполнять сжатие / кэширование (быстро).Может быть, вы не должны сжимать все ваши JSON (размер? Несколько КБ?).Я рекомендую вам прочитать раздел Google Speed ​​Page «Минимальный размер полезной нагрузки» (хорошо читаю!), Объясняющий это, что я также цитирую ниже:

Обратите внимание, что gzipping полезен только длябольшие ресурсы.Из-за накладных расходов и задержек сжатия и распаковки вы должны только сжать файлы выше определенного порога размера;мы рекомендуем минимальный диапазон между 150 и 1000 байтов.Сжатие файлов размером менее 150 байт может на самом деле сделать их больше.

> Now I'd like to improve performance by adding caching and compression

Вы можете выполнять сжатие / кэширование с помощью NGINX (+ memcached) , что будет очень быстро.Еще более предпочтительным будет CDN (для статических файлов), который оптимизирован для этой цели.Я не думаю, что вы должны делать какое-либо сжатие в node.js, хотя некоторые модули доступны через поиск NPM (поиск по gzip), например, https://github.com/saikat/node-gzip

Для кэширования IЯ бы посоветовал вам взглянуть на redis , что очень быстро.Это даже будет быстрее, чем большинство клиентских библиотек, потому что node.js быстрая клиентская библиотека (node_redis) использует hiredis (C).Для этого важно также установить hiredis через npm:

npm install hiredis redis

Некоторые тесты с помощью hiredis

PING: 20000 ops 46189.38 ops/sec 1/4/1.082
SET: 20000 ops 41237.11 ops/sec 0/6/1.210
GET: 20000 ops 39682.54 ops/sec 1/7/1.257
INCR: 20000 ops 40080.16 ops/sec 0/8/1.242
LPUSH: 20000 ops 41152.26 ops/sec 0/3/1.212
LRANGE (10 elements): 20000 ops 36563.07 ops/sec 1/8/1.363
LRANGE (100 elements): 20000 ops 21834.06 ops/sec 0/9/2.287

> The API calls have unique URLs (e.g. /api/user-id/content) and I want
> to cache them for at least 60 seconds.

Вы можете легко добиться этого кэширования благодаря setex * в Redis1036 * команда.Это будет очень быстро.

0 голосов
/ 16 июля 2011

Хорошо, так как мой API имеет только очень простое использование, я буду использовать небольшое хранилище ключей / значений в памяти в качестве основного кеша (основываясь на вдохновении, которое мне дал Simple Cache).Для этого маленького эксперимента по разработке этого должно быть достаточно.Для API в производственном использовании я бы придерживался советов Альфреда.

Для сжатия я буду использовать Apache mod_deflate.Это надежно и мне не нужно асинхронное сжатие в данный момент.Кроме того, вы можете изменить настройки сжатия без изменения самого приложения.

Спасибо вам обоим за помощь!

...