私は、1 日あたり 100 万から 200 万のヒットがあると見積もっているサイトを持つクライアントのプロジェクトに取り組むことを任されています。彼は、新しいブランドの登録ごとにシードを取得する必要がある 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