我正在Meteor中构建一个数据分析工具,并且遇到了Meteor服务器关闭和重启的问题。在服务器端,我在setInterval
上ping几个外部API,将响应修剪为我尚未捕获的新数据,对该新数据运行一批计算,最后存储计算结果在蒙戈。对于我从外部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从未运行)。这导致我的文档不再与循环开始之前存储的{A}数据同步。
如何减轻这种风险?是否有可能告诉Meteor正常关闭/等待此过程完成?谢谢!
答案 0 :(得分:0)
我从来没有听说过优雅的关机,即使有一个,我也不确定我会信任它......
我要做的是为{A}分配一个complete
标志,该标志在function15
完成时触发。如果函数是异步的(或者只是昂贵的,但我怀疑这是你的情况......),那么在使用{A}的_id
创建{A}时{B}创建一条记录:{P}和complete
标志。
无论如何,在complete
为假的批次查询中运行函数。
答案 1 :(得分:0)
目前还没有正式关闭的正式方式。因此,您必须提出一些其他方法来确保您的数据不会以不一致的状态存储。
我想到的最简单的方法是使用meteor --once
禁用流星自动重启。
然后为您的应用程序添加关闭模式。
在关机模式下,您的应用程序不应该只接受新任务,只完成当前正在处理的任务。如果你使用meteor-synced-cron,它有一个不会杀死当前正在运行的函数的停止方法,那么这很容易做到。
确保任务完成永远不会使文档处于不一致状态。 因此,您可以对文档执行多个任务,只需确保当task1完成时,文档将始终处于task2拾取的状态。