在部署新版本时,我希望服务器在实际发布之前先完成一些任务,并监听http请求。
让我们说这些任务大约需要一分钟,并且要设置一些变量:在完成这些任务之前,我希望将用户重定向到旧版本。
在服务器准备就绪之前,基本上可以完成一些nodejs的工作。
我尝试过一种幼稚的方法:
doSomeTasks().then(() => {
app.listen(PORT);
})
但是,一旦发布了新版本,任务期间的所有https请求都将无法工作,而不是被重定向到旧版本。
我已经读过https://devcenter.heroku.com/articles/release-phase,但这似乎只能运行一个对我不利的外部脚本,因为我的任务是设置缓存变量。
我知道可以通过App Engine上的/ check_readiness实现,但是我想知道Heroku。
答案 0 :(得分:4)
我认为这样做不是一种好方法。您可以使用外部脚本(npm script)执行此任务,然后使用发布阶段。此处的情况与运行迁移非常相似,您可能需要脚本所需的库,甚至可以在不监听端口的情况下将所有应用程序加载到脚本,让我们通过示例使其更加清晰
//script file
var client = require('cache_client');
// and here you can require all the needed libarires to the script
// then execute your logic using sync apis
client.setCacheVar('xyz','xyz');
然后在“脚本”的packege.json中添加此脚本,假设您将其命名为set_cache
"scripts": {
"set_cache": "set_cache",
},
现在您可以使用npm以npm set_cache
的身份运行此脚本,并在Procfile中使用此命令
web: npm start
release: npm set_cache
答案 1 :(得分:3)
您有两种选择。
如果您所做的工作仅在发布时有所更改,则可以在dyno构建阶段添加一个任务,该任务将在已编译的Slug中获取并存储数据,并将这些数据部署到Heroku上的虚拟容器中并作为您的测功机启动。例如,您可以在构建周期中运行一个任务,以提取数据并将其作为文件存储/缓存在启动时读取的应用程序中。
如果此数据更频繁地更改(例如每天更改一次),则可以使用``预引导''以每个动态为基础捕获和缓存此数据。根据应用程序的数据和体系结构,在运行多个测功机时,您可能需要谨慎使用此方法,因为每个测功机将具有独立获取的数据,因此此数据可能在应用程序的各个实例之间不匹配。这会导致难以诊断的细微错误。
例如,如果您需要预先缓存较大的数据块,然后根据每个请求仅获取新数据(例如,在引导时获取RSS feed中的最后1,000个帖子),则这是一个不错的选择,则每个请求都会获取更新的内容(可能少于几个新条目),并合并数据以返回给客户端)。
Here's the documentation on customizing a build process for Node.js on Heroku.
Here's the documentation for enabling and working with Preboot on Heroku