我正在Meteor中构建一个数据分析工具,并且遇到了Meteor服务器关闭和重启的问题 . 服务器端,我在 setInterval
上ping几个外部API,将响应修剪为我尚未捕获的新数据,对该新数据运行一批计算,最后将计算结果存储在Mongo中 . 对于我从外部API接收的每个新数据块,我需要运行大约15种不同的函数/计算,并且15个输出中的每一个都存储在Mongo内部的单独文档中 . 在客户端,用户可以订阅15个文档中的任何一个,使他们能够以他们喜欢的方式查看数据 .
new data is captured from the API as {A} and {A} is stored in Mongo
|
begin chain
|
function1 -> transforms {A} into {B} and stores {B} in Mongo
|
function2 -> transforms {A} into {C} and stores {C} in Mongo
|
...
|
function15 -> transforms {A} into {P} and stores {P} in Mongo
|
end chain
问题是,当我关闭Meteor或将新代码部署到服务器(它将自动重启服务器)时,迭代这些函数的循环正在被中断 . 比如,功能1-7成功运行,然后Meteor重新启动,导致功能8-15永不运行(或者更糟糕的是,功能8被中断而9-15从未运行) . 这导致我的文档不再与循环开始之前存储的数据同步 .
如何减轻这种风险?是否有可能告诉Meteor正常关闭/等待此过程完成?谢谢!
2 回答
我从来没有听说过优雅的关机,即使有一个,我也不确定我是否相信它......
我要做的是为分配
complete
标志,该标志在function15
完成时触发 . 如果函数是异步的(或者只是昂贵的,但我怀疑这是你的情况......),那么在和complete
标志的_id
创建时,在创建一条记录: .无论如何,在
complete
为假的批次查询上运行函数 .目前没有正式关闭的正式方法 . 因此,您必须提出一些其他方法来确保您的数据不会以不一致的状态存储 .
我想到的最简单的方法是使用
meteor --once
禁用流星自动重启 .然后为您的应用程序添加关闭模式 .
在关机模式下,您的应用程序不应该只接受新任务,只完成当前正在处理的任务 . 如果你使用meteor-synced-cron,它有一个不会杀死当前正在运行的函数的停止方法,这将很容易做到 .
确保任务完成永远不会使文档处于不一致状态 . 因此,您可以对文档执行多个任务,只需确保当task1完成时,文档将始终处于task2拾取的状态 .