Как сохранить пакет данных в Parse Cloud Code?
В моем коде облака я хотел бы обновить всю мою запись, которая составляет около 50 тыс. с новыми данными.
Но я заметил, что моя работа не срабатывает, хотя я следую 1000 лимитам.
Я получаю успех/ошибка не была вызвана ошибкой для этого задания.
Любая идея, как я могу это решить?
Parse.Cloud.job("hello", function(request, response) {
Parse.Cloud.useMasterKey();
var results = [];
var limit = 1000;
var saveUpdatedQueries = function(queries) {
console.log("updating records " + queries.length);
Parse.Object.saveAll(queries,{
success:function(lists){
console.log("lists ok "+lists.length);
if (!results.length) {
response.success("finished");
return;
}
updatingRecords(lists.length);
},error: function(reason){
console.log("error");
}
});
}
var updatingRecords = function(skip) {
var tempRecords = [];
if (skip) {
results = results.slice(skip);
}
console.log("skip: " + skip + " Results length: "+ results.length);
for (var i = 0; i < results.length; i++) {
var today = new Date();
var newObject = results[i];
newObject.set('newCulumn', today);
tempRecords.push(newObject);
if (i === results.length - 1 || tempRecords.length === limit) {
break;
};
};
saveUpdatedQueries(tempRecords);
}
var processCallback = function(res) {
results = results.concat(res);
if (res.length === limit) {
process(res[res.length - 1].id);
return;
}
updatingRecords(0);
}
var process = function(skip) {
var query = new Parse.Query(Parse.Installation);
if (skip) {
query.greaterThan("objectId", skip);
}
query.limit(limit);
query.ascending("objectId");
query.find().then(function querySuccess(res) {
processCallback(res);
}, function queryFailed(reason) {
if (reason.code == 155 || reason.code == 141) { // exceeded parse timout
console.log("time out error");
process(skip);
} else {
response.error("query unsuccessful, length of result " + results.length + ", error:" + reason.code + " " + reason.message);
}
});
}
process(false);
});
Ответы
Ответ 1
В основном в облачной архитектуре время ожидания запроса составляет около 60 секунд, но вы пытаетесь вставить более тысячи записей в одну транзакцию, это занимает более 60 секунд, поэтому ваш запрос всегда терпит неудачу.
Есть лучшие способы вставить большее количество записей,
- Очереди задач
- Крон или запланированное задание
Я думаю, что очередь задач лучше для вашей проблемы. Посмотрите это видео, вы можете получить супер представление об очередях задач
Очередь заданий и задания cron
Ответ 2
Обходной путь: вы можете запланировать задание cron в партиях приемлемо низкого количества записей, ограниченных лимитом услуг хостинга, которые у вас есть. Например, если вы можете обрабатывать только 10 запросов каждую минуту, вы должны сначала запросить все идентификаторы, которые необходимо обновить, а затем разделить на куски, которые сервер будет принимать и обрабатывать в течение срока. Это просто обходной путь.
Долгосрочное: лучшим решением было бы спроектировать ваше приложение, чтобы запрашивать как можно меньше данных с сервера, а не заставлять сервер выполнять весь тяжелый подъем. Это также позволяет публиковать вашу бизнес-логику через удобный публичный API, а не сидеть как скрытый процесс на вашем сервере.