3

我在 NodeJS 中为一个运行在 Apache 网络服务器后面的小项目编写了 JSON-API。现在我想通过添加缓存和压缩来提高性能。基本上,问题是 NodeJS 本身应该做什么以及 Apache 更好地处理什么:

a) API 调用具有唯一的 URL(例如 /api/user-id/content),我想将它们缓存至少 60 秒。

b) 我希望将输出作为 Gzip 提供(如果客户理解它)。NodeJS 的 HTTP 模块通常以“分块”的形式提供内容。由于我只在一个地方写了一个响应,是否足以调整 Content-encoding 标头以将其作为一个整体提供,以便可以对其进行压缩和缓存?

4

3 回答 3

2

a)我建议缓存但没有计时器,让替换策略删除条目。我不知道您实际在提供什么服务,也许缓存实际的 JSON 或其源数据可能有用。这是我写的一个简单的缓存,包括一个小单元测试给你一些灵感。

简单缓存

b) 你的 JSON 数据有多大?你必须自己压缩它,并记住不要让它阻塞。您可以流式压缩它并已经交付它。我从来没有用节点这样做过。

于 2011-07-10T15:28:11.767 回答
1
> I wrote a JSON-API in NodeJS for a small project, running behind an
> Apache webserver.

我只会在不同的端口上运行 API,而不是在 apache(代理??)后面。如果你想代理我建议你使用NGINX。请参阅 Ryan Dahl 的幻灯片讨论 Apache 与 NGINX(幻灯片 8+)。NGINX 还可以进行压缩/缓存(快速)。也许你不应该压缩所有的 JSON(大小?几 KB?)。我建议您阅读Google 的 Page Speed“最小有效负载大小”部分(读得好!)解释这一点,我也在下面引用:

请注意,gzipping 仅对较大的资源有益。由于压缩和解压缩的开销和延迟,您应该只 gzip 超过一定大小阈值的文件;我们建议最小范围在 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

对于缓存,我建议您查看速度非常快的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.

借助 redis 的setex命令,您可以轻松实现此缓存。这将非常快。

于 2011-07-11T20:52:31.553 回答
0

好的,因为我的 API 只有一个非常基本的用途,我将使用一个小的内存键/值存储作为基本缓存(基于 Simple Cache 给我的灵感)。对于这个小小的开发实验,这应该足够了。对于生产中使用的 API,我会坚持 Alfred 的提示。

对于压缩,我将使用 Apache 的 mod_deflate。它很健壮,此时我不需要异步 gzip。此外,您可以在不更改应用程序本身的情况下更改压缩设置。

谢谢你们的帮助!

于 2011-07-16T18:08:44.123 回答