流星关闭/重新启动中断运行服务器端功能

时间:2015-01-24 18:02:25

标签: javascript meteor backend

我正在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正常关闭/等待此过程完成?谢谢!

2 个答案:

答案 0 :(得分:0)

我从来没有听说过优雅的关机,即使有一个,我也不确定我会信任它......

我要做的是为{A}分配一个complete标志,该标志在function15完成时触发。如果函数是异步的(或者只是昂贵的,但我怀疑这是你的情况......),那么在使用{A}的_id创建{A}时{B}创建一条记录:{P}和complete标志。

无论如何,在complete为假的批次查询中运行函数。

答案 1 :(得分:0)

目前还没有正式关闭的正式方式。因此,您必须提出一些其他方法来确保您的数据不会以不一致的状态存储。

我想到的最简单的方法是使用meteor --once禁用流星自动重启。

然后为您的应用程序添加关闭模式。

在关机模式下,您的应用程序不应该只接受新任务,只完成当前正在处理的任务。如果你使用meteor-synced-cron,它有一个不会杀死当前正在运行的函数的停止方法,那么这很容易做到。

确保任务完成永远不会使文档处于不一致状态。 因此,您可以对文档执行多个任务,只需确保当task1完成时,文档将始终处于task2拾取的状态。