Как все собираются реализовать запланированные задания / облачные задания на сервере разбора?

Согласно руководству по миграции сервера parse, мы можем использовать что-то вроде Kue и Kue-UI для эмуляции запланированных заданий parse.com.

Я не реализовал Kue или Kue-ui, но, глядя на руководства, не похоже, что он обеспечивает такой же уровень функциональности, как у существующих запланированных заданий parse.com. Это наблюдение правильно? Кто-то реализовал это? Правда ли, что задания должны планироваться через Kue в javascript, а 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)
  • создать новую работу Дженкинс сделать локон на этом URL
  • определить cron как расписание для этой работы Дженкинса из веб-интерфейса jenkins

Я вижу преимущества:

  • мало или нет кодирования
  • настройка Дженкинса звучит как гораздо меньше работы, чем настройка Kue, Redis и Kue-UI
  • существующие облачные задания / определения остаются такими же
  • планировать и вручную запускать задания через веб-интерфейс jenkins

Единственное, что может сделать текущее расписание / облачные задания parse.com, чего не может решение на основе jenkins, - это возможность выбрать имя задания для создания нового расписания из выпадающего списка.

Я что-то пропустил? Как все остальные идут об этом? Благодарю.

2 ответа

Я закончил тем, что делал это с "узлом-расписанием". Не уверен, что это лучший вариант, но он работает нормально для меня.

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');
  }
});

Я использую 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

Вы можете использовать npm-модуль https://www.npmjs.com/package/parse-server-scheduler.

Он не требует внешнего сервера и просто позволяет настраивать расписание в панели управления анализом.

Если вы используете AWS, это может быть вариант:

  1. Создайте правило событий AWS CloudWatch, которое запускается через определенные промежутки времени и вызывает функцию Lambda. Правило события может передавать параметры лямбда-функции.

  2. Создайте простую лямбда-функцию, которая вызывает функцию / задание облачного кода. Если вы получили имя функции облачного кода и другие параметры из правила события, вам понадобится только одна общая лямбда-функция для любого вызова облачного кода.

Это имеет ряд преимуществ, поскольку правила событий являются частью инфраструктуры AWS и могут быть легко интегрированы с другими сервисами AWS. Например, вы можете настроить интеллектуальную организацию очереди вызовов правила событий, чтобы, если предыдущий вызов еще не был завершен, вы отклоняли следующий вызов в очереди, переполняли его в другую очередь, уведомляли оператора и т. Д.

Другие вопросы по тегам