2013-08-27 38 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中做一些反向代理缓存。我希望它能够在初始请求(生成缓存)之后发出的所有请求都会在使用相同响应之前等待缓存生成完成。

这可能吗?

回答