2015-12-15 13 views
31

Bulut kodumda, 50k civarında olan tüm kayıtlarımı yeni bir veri ile güncellemek istiyorum. Ama 1000 kayıt limitini takip etsem bile işimin başarısız olduğunu fark ettim. başarısı/hatası bu iş için hatası olarak adlandırılmıyor. Herhangi Bir Fikri bunu nasıl çözebilirim?Parse Cloud Code'da veri yığını nasıl kaydedilir?

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

Neden Promises kullanmıyorsunuz? –

+0

@MoNazemi SaveAll sözleriyle çalıştım ama yine de aynı sonucu elde ediyorum –

+0

Nasıl başarısız oluyor? Zaman aşımına mı geliyor? Bir iş 15 saniye sonra kesilir ... – Moonwalkr

cevap

0

Çözüm: Eğer varsa limiti barındırma hizmetleri ile sınırlı kayıtların kabul edilebilir düşük bir sayı gruplar halinde bir cron işi, planlayabilirsek. Örneğin, her 10 dakikada yalnızca 10 istek işleyebiliyorsanız, önce güncellenmesi gereken tüm kimlik bilgilerini talep edersiniz, ardından bunları sunucuya zaman sınırı içinde kabul edip işleyecekleri parçalara bölebilirsiniz. Bu sadece bir çözüm.

Uzun Süreli: Sunucunuzu tüm ağır kaldırma işlemlerini yapmaya zorlamak yerine, uygulamanızı sunucudan mümkün olduğunca az veri istemek üzere tasarlamanız daha iyi bir çözüm olacaktır. Bu aynı zamanda, iş mantığınızın sunucunuzda gizli bir işlem olarak oturmak yerine uygun bir genel API aracılığıyla açığa çıkmasını sağlar.

1

Temelde bulut mimarisinde, istek zaman aşımı süresi yaklaşık 60 sn, ancak tek işlemde bin üzerinde kayıt eklemek için deneyin, bu istek her zaman başarısız, bu yüzden fazla 60 saniye sürer. kayıtların büyük miktarda eklemek için daha iyi yolları var

,

  1. Görev Kuyrukları
  2. Cron veya zamanlanmış görev

Ben görev sırası sorununuza için daha iyi olduğunu düşünüyorum. Eğer görev sıraları

Task queue & cron jobs

Eğer herhangi bir şüpheniz varsa, teşekkürler pm
çekinmeyin hakkında süper bir fikir edinebilirsiniz, bu videoyu izleyin.