【问题标题】:How to deploy expressjs static templates to AWS without restarting the server?如何在不重启服务器的情况下将 expressjs 静态模板部署到 AWS?
【发布时间】:2019-04-19 20:12:40
【问题描述】:

我有 express.js 服务器,我部署到 AWS 弹性 beanstalk。我使用车把引擎进行模板。模板结构比服务器代码更频繁地更改,因此我希望有一种快速的方法来部署它们。我已经尝试在单独的 S3 静态存储桶上托管模板,然后从 nodejs 代码中加载它们。这样,我可以通过使用 S3 静态部署而不是重新启动所有服务器节点的 eb deploy 来非常快速地部署对模板的更改。

这是我用于模板加载的 node.js 服务器代码:

const s3 = new aws.S3();
s3.getObject({Bucket: 'bucketname.com', Key: 'views/' + path}, (err, data) => {
  const template = handlebars.compile(data.Body.toString('utf-8'));
  resolve(template);
});

这解决了模板部署速度问题,但我不确定它是否不会引入额外的性能损失。我认为由于 S3 和弹性 beantalk 都是亚马逊服务,因此影响应该很小,但网站基准测试让我不这么认为。

也许有更好的方法来解决模板部署速度的问题?

【问题讨论】:

  • “过早的优化是万恶之源” Donald Knuth。在你分析代码并看到你有一个之前,不要认为你的性能会受到影响。这可能是优化代码的好地方,但可能不是。

标签: node.js amazon-web-services express handlebars.js


【解决方案1】:

关于基准测试数字,我相信这是因为您的代码每次需要渲染视图时都会尝试从s3 获取视图模板。这些网络调用会导致开销。

我曾经在我之前的一个项目中遇到过类似的挑战。但是,在我们的案例中,这些频繁更改的模板的大小和数量都在可接受的范围内,并且可以将它们放在内存中。

我们最终创建了一个不同的 GIT 存储库来存储这些静态模板。我们的express 服务器会在启动时加载这些模板并将它们缓存在内存中。

我们配置了一个 webhook 以在每次模板更改时 ping 我们的 express 服务器(git repo 中的新提交)。然后,服务器使其缓存无效并从同一个 repo 加载新模板。这样我们就不需要为静态模板的每次更改都重新启动服务器。

【讨论】:

  • 我用类似的方法解决了这个问题。我继续从 S3 加载模板文件,但仅在服务器启动时和触发刷新挂钩后加载它们(就像你描述的那样)。另一个区别是我的快速服务器是负载平衡的并且有 2 个实例,所以我需要确保为每个实例调用刷新钩子。
猜你喜欢
  • 2014-12-18
  • 2011-12-04
  • 1970-01-01
  • 2011-10-25
  • 2021-01-22
  • 2015-02-26
  • 1970-01-01
  • 2014-04-10
  • 2018-12-21
相关资源
最近更新 更多