/ / Node / Mongo / NginXで最も高速/最軽量のキャッシュ方法はどれですか? --node.js、キャッシング、nginx、redis、ニス

Node / Mongo / NginXで最も高速/軽量なキャッシング方法はどれですか? -node.js、キャッシング、nginx、redis、ニス

私はプロジェクトに取り組むことを任されました彼が推定しているサイトを持っているクライアントは、1日あたり100万ヒットを受け取ります。彼は、新しいブランドの登録ごとにシードを取得する必要がある5,800万人のユーザーの既存のデータベースを持っています。サイトのコンテンツのほとんどは、外部APIが提供するデータから提供され、Mongoセットアップに保存されているデータのほとんどはプロファイル情報と保存されたAPIパラメーターです。

NginXはポート80で実行され、ポート8000​​〜8010でノードクラスターへの負荷分散が行われます。

私の質問は、キャッシングについてどうするかです。私はLAMPのバックグラウンドを持っているので、PHPを使用して静的HTMLファイルを作成し、MySQLの負荷を最小限に抑えるためにそれらを提供するか、より高いレベルのキャッシュを必要とするサイトにMemcachedを使用することに慣れています。この設定は私には少し異質です。

これが最も理想的です 最小の応答時間とCPU負荷

1:NginXを使用したページレベルのキャッシュ

参照: http://andytson.com/blog/2010/04/page-level-caching-with-nginx/

server {
listen            80;
servername        mysite.com;

proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  Host       $host;

location / {
proxy_pass    http://localhost:8080/;
proxy_cache   anonymous;
}

# don"t cache admin folder, send all requests through the proxy
location /admin {
proxy_pass    http://localhost:8080/;
}

# handle static files directly. Set their expiry time to max, so they"ll
# always use the browser cache after first request
location ~* (css|js|png|jpe?g|gif|ico)$ {
root          /var/www/${host}/http;
expires       max;
}
}


2:キャッシュバケットとしてRedis

hash() 関数は numbers() このページの機能: http://jsperf.com/hashing-strings

function hash(str) {
var res = 0,
len = str.length;
for (var i = 0; i < len; i++) {
res = res * 31 + str.charCodeAt(i);
}
return res;
}

var apiUrl = "https://www.myexternalapi.com/rest/someparam/someotherparam/?auth=3dfssd6s98d7f09s8df98sdef";
var key    = hash(apiUrl).toString(); // 1.8006908172911553e+136

myRedisClient.set(key,theJSONresponse, function(err) {...});


3:ノード書き込みJSONファイル

hash() 関数は numbers() このページの機能: http://jsperf.com/hashing-strings

function hash(str) {
var res = 0,
len = str.length;
for (var i = 0; i < len; i++) {
res = res * 31 + str.charCodeAt(i);
}
return res;
}

var fs     = require("fs");
var apiUrl = "https://www.myexternalapi.com/rest/someparam/someotherparam/?auth=3dfssd6s98d7f09s8df98sdef";
var key    = hash(apiUrl).toString(); // 1.8006908172911553e+136

fs.writeFile("/var/www/_cache/" + key + ".json", theJSONresponse, function(err) {...});


4:前にニスを塗る

このサイトに示されているような調査とベンチマークを行ったところ、このソリューションから離れてしまいましたが、それが最も理にかなっている場合は、まだ検討の余地があります。 http://todsul.com/nginx-varnish

回答:

回答№1の17

組み合わせて、Redisを使用してキャッシュしますTTLが短く、Nginxを使用して長期のRESTlessデータと静的アセットをキャッシュするセッションユーザーAPI呼び出し。リストされているオプションの中でファイルシステムIOが最も遅く、CPUに最も負荷がかかると思うので、JSONファイルは書きません。


回答№2については4
  1. nginxページレベルのキャッシュは、静的コンテンツのキャッシュに適しています。しかし、動的コンテンツの場合、それは良くありません。たとえば、コンテンツがアップストリームで変更された場合、どのようにキャッシュを無効にしますか?

  2. Redisはインメモリデータストアに最適です。しかし、私はそれをキャッシュとして使用するのは好きではありません。メモリの量が限られているため、メモリ不足を常に心配する必要があります。はい、redisでキーを期限切れにする戦略を設定できます。しかし、それは余分な作業であり、それでもそうではありません。キャッシュプロバイダーにしたいと思っています。

選択肢3と4の経験はありません。

memcacheが含まれていないことに驚いていますオプションとしてここに。私の経験から、キャッシュプロバイダーとしては堅実です。redisにないmemcache機能の1つは、指定した有効期限までにキーが期限切れにならないことを保証しないことです。これはデータストアにとっては悪いことですが、memcacheをキャッシュの完璧な候補にします。memcacheに割り当てたメモリを使い果たすことを心配する必要はありません。memcacheは、有効期限が切れても、使用されていないキー(キャッシュは使用されていない)を削除しますそれらのキーの時間はまだ満たされていません。

Nginxはこのビルトインを提供します memcacheモジュール。それはしっかりしています。あなたがオンラインでグーグルするならば、多くのチュートリアル。

これは私が最も好きなものです(以下のリンクを参照)。キャッシュの無効化は簡単です。たとえば、アップストリームでページが更新された場合は、アップストリームのアプリサーバーからmemcacheキーを削除するだけです。著者は、応答時間が4倍になると主張しました。あなたのユースケースには十分だと信じてください。

http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/


回答№3の場合は1

ニスに関しては、私は解読するつもりはありませんあなたが見つけたサイトのベンチマークですが、それらはひどく悪い数字であり、実際の高トラフィックの実装とは何の共通点もありません(ニスの最適化についてはグーグルで、8kではなく100-200k req / sを示すベンチマークを参照してください)。

Nginxはページキャッシュにも適しています。1日あたり1〜200万回のヒットがあるため、極端なパフォーマンスは必要ありません。ですから、あなたがより快適に作業できると感じる方を選んでください。

2ノードソリューションは本当に悪い選択です。信頼性とパフォーマンスの両方を提供するには、ページキャッシュを動的アプリケーションから分離する必要があります。

さらに、redis / memcachedは、アプリケーションをオブジェクトキャッシュまたは一般的に使用される逆シリアル化されたデータのキャッシュとして使用する場合に、アプリケーションのスケーリングに最適です。