caching快速响应

我有一些真正麻烦的快速caching响应…我有一个端点,得到了很多请求(大约5k rpm)。 这个端点从mongodb中获取数据,并加快速度我想caching完整的json响应1秒,这样每秒只有第一个请求到达数据库,而其他请求则来自caching。

当抽象出问题的数据库部分时,我的解决scheme看起来像这样。 我在redis中检查caching的响应。 如果发现我服了它。 如果没有,我生成它,发送它并设置caching。 超时模拟了数据库操作。

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); } }); }); 

问题是这不仅会使第一个请求每秒都打到数据库。 相反,在我们有时间设置caching(100毫秒之前)之前,所有请求都会到达数据库。 当真实的负载增加到这个时候,真正的响应时间大约是60秒,因为很多请求都落后了。

我知道这可以用像varnish反向代理解决,但目前我们正在主持heroku这复杂这样的设置。

我想要做的是在express中做一些反向代理caching。 我想这样做,以便在初始请求(生成caching)之后进入的所有请求将等待caching生成完成,然后再使用相同的响应。

这可能吗?

在node.js应用程序的顶部使用代理层。 消失caching将是一个很好的select与Nginx合作来为您的应用程序提供服务 。