【问题标题】:Caching responses in express在 express 中缓存响应
【发布时间】:2013-08-29 19:22:35
【问题描述】:

我在快速缓存响应时遇到了一些问题……我有一个端点会收到很多请求(大约 5k rpm)。此端点从 mongodb 获取数据并加快速度,我想将完整的 json 响应缓存 1 秒钟,以便每秒只有第一个请求访问数据库,而其他请求则从缓存中提供。

当抽象出问题的数据库部分时,我的解决方案如下所示。我在 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 中做某种反向代理缓存。我希望它在初始请求(生成缓存)之后进入的所有请求都将等待缓存生成完成,然后再使用相同的响应。

这可能吗?

【问题讨论】:

    标签: node.js mongodb caching heroku express


    【解决方案1】:

    在您的 node.js 应用程序上使用代理层。 Vanish Cache 会是一个不错的选择 与Nginx 合作到serve your application

    【讨论】:

      【解决方案2】:

      p-throttle 应该完全满足您的需求:https://www.npmjs.com/package/p-throttle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 2020-10-08
        • 2011-03-25
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多