2013-08-27 71 views
4

我在express中遇到了一些真正的麻煩緩存響應......我有一個端點獲得了很多請求(大約5k rpm)。這個端點從mongodb中獲取數據並加快速度我想緩存完整的json響應1秒,這樣每秒只有第一個請求會觸發數據庫,​​而其他請求則來自緩存。在express中緩存響應

當抽象出問題的數據庫部分時,我的解決方案看起來像這樣。我在redis中檢查緩存的響應。如果發現有人提供服務。如果沒有,我發送它,發送它並設置緩存。超時模擬了數據庫操作。

app.get('/cachedTimeout', function(req,res,next) { 
    redis.get(req.originalUrl, function(err, value) { 
    if (err) return next(err); 
    if (value) { 
     res.set('Content-Type', 'text/plain'); 
     res.send(value.toString()); 
    } else { 
     setTimeout(function() { 
     res.send('OK'); 
     redis.set(req.originalUrl, 'OK'); 
     redis.expire(req.originalUrl, 1); 
     }, 100); 
    } 
    }); 
}); 

問題是,這不僅會使第一個請求每秒都會觸發數據庫。相反,在我們有時間設置緩存之前(100毫秒之前)所有請求都會觸發數據庫。當真實負載增加到這個時候,真正的響應時間大約爲60秒,因爲很多請求都落後了。

我知道這可以通過像varnish這樣的反向代理來解決,但目前我們在heroku上託管,這使得這樣的設置變得複雜。

我想要做的是在express中做一些反向代理緩存。我希望它能夠在初始請求(生成緩存)之後發出的所有請求都會在使用相同響應之前等待緩存生成完成。

這可能嗎?

回答