6

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

我还没有实现 Kue 或 Kue-ui,但查看指南,它看起来不像提供与现有 parse.com 计划作业相同级别的功能。这个观察正确吗?有人实施了吗?是否必须通过 JavaScript 中的 Kue 调度作业,而 Kue-ui 仅提供作业当前状态的摘要,而无法通过 Kue-ui 添加新的调度是真的吗?

有没有人试图用像詹金斯这样的东西来达到同样的结果?所以这就是我的想法:

  • 每个作业仍将在云代码中定义 Parse.Cloud.job("job01", function(request, response) {));
  • 稍微修改 parse-server 以在与现有云函数类似的 url 处公开作业,例如 /parse/jobs/job01 (这可能很快就会出现在 parse-server 中:github.com/ParsePlatform/parse-server/pull/2560)
  • 创建一个新的詹金斯工作在那个网址做一个卷曲
  • 从 jenkins web ui 中为 jenkins 作业定义一个类似 cron 的时间表

我可以看到的好处是:

  • 几乎没有编码
  • 设置 jenkins 听起来比设置 kue、redis 和 kue-ui 的工作要少得多
  • 现有的云作业/定义保持不变
  • 通过 jenkins web ui 安排和手动触发作业

当前 parse.com 计划作业/云作业可以做的唯一的事情是基于詹金斯的解决方案不能选择一个作业名称来从下拉列表中创建一个新的计划。

我错过了什么吗?其他人是怎么做的?谢谢。

4

4 回答 4

5

我最终用'node-schedule'来做到这一点。不确定这是否是最佳选择,但对我来说效果很好。

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');
  }
});
于 2016-08-30T08:29:27.807 回答
1

kue用于此目的。我已经在我的文章中描述了这种方法。简而言之,这个功能:

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

于 2016-08-31T04:55:12.017 回答
0

您可以使用parse-server-scheduler npm-module。

它不需要任何外部服务器,只允许您在 parse-dashboard 中设置调度。

于 2020-06-08T09:59:30.553 回答
0

如果您在 AWS 上,这可能是一个选项:

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

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

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

于 2020-04-23T16:35:46.100 回答