首页 文章

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

提问于
浏览
0

我正在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 回答

  • 0

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

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

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

  • 0

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

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

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

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

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

相关问题