2015-12-15 40 views
31

W moim kodzie chmur, chciałbym zaktualizować wszystkie moje rekordy, które wynoszą około 50 000 z nowymi danymi. Ale zauważyłem, że moja praca się nie udaje, mimo że przestrzegam limitu 1000 rekordów. Otrzymuję sukces/błąd nie został wywołany błąd dla tego zadania. Każdy pomysł, jak mogę rozwiązać ten problem?Jak zapisać partię danych w kodzie Cloud Parse?

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

Dlaczego nie korzystasz z obietnic? –

+0

@MoNazemi Próbowałem składać obietnice, ale nadal otrzymuję ten sam wynik. –

+0

Jak to się nie udaje? Czy to się skończyło? Zadanie zostanie przerwane po 15 sekundach ... – Moonwalkr

Odpowiedz

0

Obejście: Można zaplanować crona w partiach akceptowalnie niskiej liczby rekordów, ograniczony przez usług hostingowych limitu zapewnia. Na przykład, jeśli można przetworzyć tylko 10 żądań co minutę, należy najpierw zażądać wszystkich identyfikatorów, które należy zaktualizować, a następnie podzielić je na porcje, które serwer zaakceptuje i przetworzy w określonym terminie. To tylko obejście.

Długoterminowo: lepszym rozwiązaniem byłoby zaprojektowanie aplikacji tak, aby żądała możliwie jak najmniejszej ilości danych z serwera, zamiast zmuszać serwer do wykonywania wszystkich operacji podnoszenia ciężkich przedmiotów. Pozwala to również na ujawnienie logiki biznesowej za pośrednictwem wygodnego publicznego interfejsu API, a nie na ukrytym procesie na serwerze.

1

Zasadniczo w chmurze architektury czas żądanie poza czas wynosi około 60 sek, ale próby wstawienia ponad tysięcy rekordów w jednej transakcji, to trwa dłużej niż 60 sekund, dlatego Twoja prośba zawsze niepowodzeniem.

Nie ma lepszych sposobów na umieszczenie większej ilości rekordów,

  1. Zadanie Kolejki
  2. Cron lub zaplanowane zadanie

myślę kolejka zadaniem jest lepsze dla Twojego problemu. obejrzeć ten film, można uzyskać super-pojęcia o kolejkach zadań

Task queue & cron jobs

Jeśli masz jakiekolwiek wątpliwości, nie krępuj się po południu
Dziękuję.