Как все собираются реализовать запланированные задания / облачные задания на сервере разбора?
Согласно руководству по миграции сервера 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, это может быть вариант:
Создайте правило событий AWS CloudWatch, которое запускается через определенные промежутки времени и вызывает функцию Lambda. Правило события может передавать параметры лямбда-функции.
Создайте простую лямбда-функцию, которая вызывает функцию / задание облачного кода. Если вы получили имя функции облачного кода и другие параметры из правила события, вам понадобится только одна общая лямбда-функция для любого вызова облачного кода.
Это имеет ряд преимуществ, поскольку правила событий являются частью инфраструктуры AWS и могут быть легко интегрированы с другими сервисами AWS. Например, вы можете настроить интеллектуальную организацию очереди вызовов правила событий, чтобы, если предыдущий вызов еще не был завершен, вы отклоняли следующий вызов в очереди, переполняли его в другую очередь, уведомляли оператора и т. Д.