每个人如何在解析服务器上实现预定作业/云作业?

时间:2016-08-30 01:56:49

标签: jobs parse-server kue

根据解析服务器迁移指南,我们可以使用KueKue-UI之类的东西来模拟parse.com预定作业功能。

我还没有实现Kue或Kue-ui,但是看一下这些指南,它看起来并不像现有的parse.com预定作业那样提供接近同等级别的功能。这个观察是否正确?有人实施了吗?是否真的必须通过jue在Kue中安排工作,而Kue-ui只提供工作当前状态的摘要,并且无法通过Kue-ui添加新的时间表?

有没有人试图用Jenkins这样的结果取得同样的结果?所以这就是我的想法:

  • 每个作业仍将在云代码Parse.Cloud.job(“job01”,function(request,response){))中定义;
  • 稍微修改解析服务器以在与现有云功能类似的URL处公开作业,例如/ parse / jobs / job01(这可能很快出现在parse-server中:github.com/ParsePlatform/parse-server/pull/2560)
  • 创建一个新的jenkins工作,在该网址上做一个卷曲
  • 从jenkins web ui
  • 中为jenkins工作定义一个类似cron的计划

我可以看到好处:

  • 很少甚至没有编码
  • 设置jenkins听起来比设置kue,redis和kue-ui少得多的工作
  • 现有云作业/定义保持完全相同
  • 通过jenkins web ui
  • 安排和手动触发工作

当前parse.com调度作业/云作业唯一可以做到的就是基于jenkins的解决方案无法从下拉列表中选择作业名称来创建新计划。

我错过了什么吗?其他人怎么样呢?感谢。

4 个答案:

答案 0 :(得分:5)

我最后用'节日计划'做了这个。不确定它是否是最佳选择,但它对我来说运作正常。

<强> index.js

var schedule = require('node-schedule');
var request = require('request');
schedule.scheduleJob('*/15 * * * *', function() {
    var options = {
        url: serverUrl + '/functions/{function name}}',
        headers: {
            'X-Parse-Application-Id': appID,
            'X-Parse-Master-Key': masterKey,
            'Content-Type': 'application/json'
        }
    };
    request.post(options, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body);
        }
    });
});

<强> main.js

Parse.Cloud.define('{function name}', function(req, res) {
  //Check for master key to prevent users to call this 
  if (req.master === true) {
    //Do operations here
  } else {
    res.error('Need Master Key');
  }
});

答案 1 :(得分:1)

我为此目的使用kue。我已经描述了in my article。简而言之,这个功能:

Parse.Cloud.job("sendReport", function(request, response) {
  Parse.Cloud.httpRequest({
  method: 'POST',
  headers: {
   'Content-Type': 'application/json',
  },
  url: "https://example.com/url/", // Webhook url
  body: "body goes here",
  success: function(httpResponse) {
      console.log("Successfully POSTed to the webhook");
      },
  error: function(httpResponse) {
      console.error("Couldn't POST to webhook: " + httpResponse);
      }
  });
});

成为这个:

// Create a kue instance and a queue.
var kue = require('kue-scheduler');
var Queue = kue.createQueue();
var jobName = "sendReport";

// Create a job instance in the queue.
var job = Queue
            .createJob(jobName)
            // Priority can be 'low', 'normal', 'medium', 'high' and 'critical'
            .priority('normal')
            // We don't want to keep the job in memory after it's completed.
            .removeOnComplete(true);

// Schedule it to run every 60 minutes. Function every(interval, job) accepts interval in either a human-interval String format or a cron String format.
Queue.every('60 minutes', job);

// Processing a scheduled job.
Queue.process(jobName, sendReport);

// The body of job goes here.
function sendReport(job, done) { 
  Parse.Cloud.httpRequest({
  method: 'POST',
  headers: {
   'Content-Type': 'application/json',
  },
  url: "https://example.com/url/", // Webhook url
  body: "body goes here"}).then(function(httpResponse) {
    console.log("Successfully POSTed to the webhook");
    // Don't forget to run done() when job is done.
    done();
  }, function(httpResponse) {
    var errorMessage = "Couldn't POST to webhook: " + httpResponse;
    console.error(errorMessage);
    // Pass Error object to done() to mark this job as failed.
    done(new Error(errorMessage));
  });
}

它工作正常,但我注意到有时kue-scheduler会比需要更频繁地触发事件。有关详细信息,请参阅此问题:https://github.com/lykmapipo/kue-scheduler/issues/45

答案 2 :(得分:0)

如果您使用的是AWS,则可以选择以下选项:

  1. 创建一个按特定间隔触发的AWS CloudWatch事件规则,并调用Lambda函数。事件规则可以将参数传递给Lambda函数。

  2. 创建一个简单的Lambda函数,该函数调用Cloud Code函数/作业。如果您从事件规则中接收到云代码函数名称和其他参数,则对于任何云代码调用,您只需一个通用Lambda函数。

这具有多个优点,因为事件规则是AWS基础架构的一部分,可以轻松地与其他AWS服务集成。例如,您可以设置事件规则调用的智能排队,以便如果上一个调用尚未完成,则可以丢弃队列中的下一个调用,溢出到另一个队列,通知操作员等。

答案 3 :(得分:0)

您可以使用parse-server-scheduler npm模块。

它不需要任何外部服务器,仅允许您在parse-dashboard中设置计划。