【问题标题】:Background tasks not connected with any client in Meteor后台任务未与 Meteor 中的任何客户端连接
【发布时间】:2013-03-02 10:15:00
【问题描述】:

我想在 Meteor 应用程序的后台运行一些独立于客户端的常规任务(比如抓取一些页面)。所以它们不应该在任何客户端线程中,但是一旦它们完成,我想用信息更新所有客户端。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 请注意,与更传统的解决方案相反,Meteor 中没有“客户端线程”之类的东西。客户端请求是异步处理的,不是多线程的。
  • 你是对的。它们是纤维,是一种协作的多任务处理。

标签: meteor


【解决方案1】:

转到http://atmospherejs.com 并搜索cron

我找到的最好的是percolate:synced-cron

安装

meteor add percolate:synced-cron

基础知识

SyncedCron.add({
  name: 'Crunch some important numbers for the marketing department',
  schedule: function(parser) {
    // parser is a later.parse object
    return parser.text('every 2 hours');
  },
  job: function() {
    var numbersCrunched = CrushSomeNumbers();
    return numbersCrunched;
  }
});

SyncedCron.start();

高级

See their documentation

【讨论】:

    【解决方案2】:

    在您的服务器端代码上运行它们。如果您所说的常规是指每天定时任务之类的:

    您可以在 Tom Coleman 的 cron 包中使用 cron 作业:https://github.com/tmeasday/meteor-cron

    您需要安装 meteorite package manager first : npm install meteorite -g 然后在项目目录 mrt add cron-tick 中安装 cron 包

    服务器 js

    var MyCron = new Cron();
    
    // this job will happen every day (60 seconds * 60 * 24)
    MyCron.addJob(60*60*24, function() {
        //Scrape your stuff
    
        //Update your collections
    });
    

    一旦您运行更新/插入/编辑,它们就会被推送到所有客户端。

    【讨论】:

    • 有没有办法向客户端推送不基于集合的内容(因此不基于数据库中的内容)?就像刚刚完成某事的信息一样?通知?
    • 它比这有点棘手,节点中的 javascript 将在一个线程中,所以这就是 Fibers 的用武之地。如果您在任务中使用 cron 中的 Meteor.call 到 meteor.method包含this.unblock this.unblock 的方法中的内容将在新光纤中运行,以免阻塞其他客户端。关于流星可以发送的其他东西,我建议按房间收集计数:stackoverflow.com/questions/10565654/… 一个很好的起点,这取决于您到底要发送什么。
    • 但是如果不使用this.unblock,cron任务会在哪个光纤中运行?
    【解决方案3】:

    要以允许任意外部进程更新 Meteor 客户端的方式执行此操作,请使用与 Meteor 关联的 DDP 协议。您的服务器进程可以写入 DDP 通道,并且当他们这样做时,您的客户端将更新。查看这篇文章的示例和用例,可能与您的类似:

    Using node ddp-client to insert into a meteor collection from Node

    该协议相当简单,该帖子显示了一个 node.js 进程写入实时更新客户端的 Mongo 集合的示例。

    【讨论】:

    • 嗯,你链接回了这个问题?
    • 嘎——对不起。刚刚修好。
    • 一个很好的解决方案。需要注意的几件事: 1. 要实现定期执行,请设置一个常规的 cron 作业,该作业以您想要的任何时间间隔运行您的程序; 2. 您的周期程序甚至不必用 javascript 编写,只要该语言有一个 DDP 客户端库就可以了。
    【解决方案4】:

    您可以尝试在服务器上调用Meteor.setInterval(可能在Meteor.startup)。这应该可行,尽管它可能不如 cron 解决方案灵活。

    【讨论】:

    • 这个想法是我可以拥有独立的进程,甚至将它们拆分到多个服务器中。所以,真的,工人机器上的繁重工作。
    猜你喜欢
    • 2014-06-11
    • 2020-10-17
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2023-03-21
    • 2022-01-27
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多