2015-12-15 6 views
31

मेरे क्लाउड कोड में, मैं अपने सभी रिकॉर्ड को अपडेट करना चाहता हूं जो एक नए डेटा के साथ लगभग 50k है। लेकिन मैंने देखा कि मेरा काम विफल रहता है भले ही मैं 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

आप वादा का उपयोग क्यों नहीं कर रहे हैं? –

+0

@MoNazemi मैंने सहेजने की कोशिश की सभी वादों, लेकिन मुझे अभी भी एक ही परिणाम मिल गया है –

+0

यह कैसे विफल हो जाता है? क्या यह समय समाप्त हो गया है? 15 सेकंड के बाद एक नौकरी काटा जाएगा ... – Moonwalkr

उत्तर

0

युक्ति: आप अभिलेखों का एक स्वीकार्य निम्न संख्या के बैच में एक क्रॉन जॉब, होस्टिंग सेवाएं सीमा आप के द्वारा ही सीमित समय निर्धारित कर सकें। उदाहरण के लिए, यदि आप हर मिनट केवल 10 अनुरोधों को संसाधित कर सकते हैं, तो आप पहले उन सभी आईडी का अनुरोध करेंगे जिन्हें अद्यतन करने की आवश्यकता है, फिर उन्हें उन हिस्सों में विभाजित करें जिन्हें सर्वर स्वीकार करेगा और समय सीमा के भीतर प्रक्रिया करेगा। यह सिर्फ एक कामकाज है।

दीर्घकालिक: सर्वर से जितना संभव हो उतना डेटा जितना संभव हो उतना डेटा अनुरोध करने के लिए सर्वर को सभी भारी उठाने के लिए मजबूर करने के लिए एक बेहतर समाधान होगा। यह आपके सर्वर पर एक छिपी प्रक्रिया के रूप में बैठने के बजाय, आपके व्यावसायिक तर्क को एक सुविधाजनक सार्वजनिक एपीआई के माध्यम से उजागर करने की अनुमति देता है।

1

मूल रूप से बादल वास्तुकला में, अनुरोध समय बाहर समय के आसपास 60 सेकंड है, लेकिन आप एक लेन-देन से अधिक हजारों रिकॉर्ड डालने के लिए प्रयास करते हैं, यह अधिक से अधिक 60 सेकंड लेता है, यही कारण है कि आपके अनुरोध हमेशा असफल है।

वहाँ अभिलेखों का बड़ा राशि डालने के लिए बेहतर तरीके है,

  1. टास्क कतार
  2. क्रॉन या निर्धारित कार्य

मुझे लगता है कि काम कतार आपकी समस्या के लिए बेहतर है। इस वीडियो को देखने के लिए, आप कार्य कतारों

Task queue & cron jobs

आप किसी भी संदेह है, तो बजे
करने के लिए स्वतंत्र महसूस हो रहा है के बारे में धन्यवाद सुपर विचार प्राप्त कर सकते हैं।

संबंधित मुद्दे