3

Apache Web サーバーの背後で実行される小さなプロジェクト用に、NodeJS で JSON-API を作成しました。ここで、キャッシュと圧縮を追加してパフォーマンスを改善したいと考えています。基本的に、問題は NodeJS 自体で何をすべきか、そして Apache でより適切に処理できるものは何かということです。

a) API 呼び出しには固有の URL (例: /api/user-id/content) があり、それらを少なくとも 60 秒間キャッシュしたいと考えています。

b) 出力を Gzip として提供したい (クライアントが理解できる場合)。NodeJS の HTTP モジュールは通常、コンテンツを「チャンク」として配信します。応答を 1 か所にしか書いていないので、圧縮してキャッシュできるように Content-encoding ヘッダーを調整して 1 つの部分として提供するだけで十分ですか?

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(proxy??) の背後では実行しません。プロキシしたい場合は、NGINXを使用することをお勧めします。Apache と NGINX について議論しているRyan Dahl のスライド(スライド 8+) を参照してください。NGINX は、圧縮/キャッシュ (高速) も実行できます。すべての JSON を圧縮しないでください (サイズ? 数 KB?)。Google のページ スピードの「最小ペイロード サイズ」セクション(よく読んでください) を読むことをお勧めします。

gzip は、より大きなリソースに対してのみ有益であることに注意してください。圧縮と解凍のオーバーヘッドと待ち時間のため、特定のサイズのしきい値を超えるファイルのみを gzip する必要があります。150 ~ 1000 バイトの最小範囲をお勧めします。150 バイト未満のファイルを gzip 圧縮すると、実際にはサイズが大きくなる可能性があります。

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

非常に高速になるNGINX(+ memcached)を介して圧縮/キャッシュを実行できます。この目的のために最適化されたCDN(静的ファイル用)がさらに好ましいでしょう。node.js で圧縮を行うべきではないと思いますが、一部のモジュールは、たとえばhttps://github.com/saikat/node-gzipのようにNPM の検索(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 に答える