javascript - notification - ¿Cómo guardar lotes de datos en Parse Cloud Code?
parse server notifications (2)
Básicamente en la arquitectura de la nube, el tiempo de espera de solicitud es de alrededor de 60 segundos , pero intenta insertar más de miles de registros en una transacción, lleva más de 60 segundos, por eso su solicitud siempre falla.
Hay mejores formas de insertar una mayor cantidad de registros,
- Colas de tareas
- Cron o tarea programada
Creo que la cola de tareas es mejor para su problema. mira este video, puedes obtener una excelente idea sobre las colas de tareas
Tarea de cola y trabajos de cron
Si tiene alguna duda, siéntase libre de pm
Gracias.
En mi código de nube, me gustaría actualizar todo mi registro, que es alrededor de 50k con una nueva información. Pero noté que mi trabajo falla a pesar de que sigo el límite de 1000 registros. Tengo éxito / error no se llama error para este trabajo. ¿Alguna idea de cómo puedo resolver esto?
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);
});
Solución alternativa: puede programar una tarea cron en lotes de un número aceptablemente bajo de registros, limitado por el límite de servicios de hosting que tiene. Por ejemplo, si solo puede procesar 10 solicitudes por minuto, primero solicitará todas las ID que necesitan actualizarse, luego las dividirá en partes que el servidor aceptará y procesará dentro del límite de tiempo. Es solo una solución.
Largo plazo: una mejor solución sería diseñar su aplicación para solicitar la menor cantidad de datos posible del servidor, en lugar de forzar al servidor a hacer todo el trabajo pesado. Esto también permite que su lógica comercial se exponga a través de una API pública conveniente, en lugar de sentarse como un proceso oculto en su servidor.