2013-01-17 13 views
5

मैं खोज की है औरक्या curor.observe सर्वर प्रदर्शन धीमा करता है?

_suppress_initial: true 

पाया, लेकिन इसके साथ 0.54

मैं एक आदेश संग्रह जैसे कुछ संग्रह का निरीक्षण करना चाहते हैं काम does not गए हैं।

यदि मेरे पास भारी ऑर्डर हैं और जब नया ऑर्डर जोड़ा गया है तो मैं एक और संग्रह अपडेट करने के लिए निरीक्षण करना चाहता हूं।

मैंने Meteor.publish में नहीं देखा है कि अगर मैं इसे रोकता नहीं रोकता, तो क्या सर्वर धीमा हो जाता है अगर मैं इसे सर्वर के दौरान हर समय पर्यवेक्षक रखता हूं?

if Meteor.isServer 

    obOrders = Orders.find({}).observe # when server restart does this slow down performance ? 

     _suppress_initial: true # doesnt work 

     added: (order) -> 

      console.log order # still add exist documents 

      if Date.now() - order.timestamp < 500 
       console.log order # update another one 

या मैं सीमित रखना चाहिए Orders.find {}, सीमा: 50 और तरह टाइमस्टैम्प द्वारा नवीनतम दस्तावेजों का निरीक्षण करने के?

सर्वर का निरीक्षण करने के लिए Meteor.startup या Meteor.publish उन दो स्थितियों के बीच क्या अलग है?

अगर मैं इसे मेटियर में डालता हूं। स्टार्टअप का मतलब है कि मैं एक सिंगलटन पर्यवेक्षण करता हूं?

+0

वही बात, यहां मेरे लिए काम करने के लिए _suppress_initial नहीं मिल सकता है या तो – matb33

उत्तर

6

अभी, observe को क्वेरी के पूरे परिणाम को स्थायी रूप से स्मृति में रखना है। इसलिए यदि आप Orders.observe({}) पर कॉल करते हैं, तो सर्वर ऑर्डर संग्रह की पूरी प्रतिलिपि स्मृति में तब तक रखेगा जब तक कि निरीक्षण चल रहा हो। ऐसा इसलिए है क्योंकि, दृश्यों के पीछे, observe पुराने क्वेरी परिणामों को अलग-अलग क्वेरी परिणामों से अलग करता है जब संभावित परिवर्तन का पता चला है। यह सुनिश्चित करना है कि observe के परिणाम हमेशा 100% सही होते हैं, भले ही कई प्रक्रियाओं के परिणामस्वरूप दौड़ की स्थिति होती है, डेटाबेस को एक साथ लिखते हैं।

इस प्रकार, यदि आप सीमित संख्या में दस्तावेज़ों की जांच करते हैं, जैसे कि पांच सबसे हालिया आदेश, या पिछले 5 मिनट में दिए गए आदेश, यह नाटकीय रूप से राम उपयोग को कम करेगा (और संभवतः सीपीयू उपयोग।) लेकिन यदि आप करते हैं यह सुनिश्चित करने के लिए आपको सावधान रहना होगा कि आप किसी दस्तावेज़ को याद नहीं करते हैं। उदाहरण के लिए, यदि आप पिछले 5 मिनट में डाले गए दस्तावेज़ों को देख रहे हैं, लेकिन आपका सर्वर 10 मिनट के लिए नीचे चला जाता है, तो हो सकता है कि आपको कुछ ऑर्डर के लिए अतिरिक्त संदेश नहीं मिलें। या, यदि आप 5 सबसे हालिया दस्तावेजों को देख रहे हैं, और फिर एक और नोड एक बार में 1000 दस्तावेज़ों को सम्मिलित करता है, तो आपको हाल ही के 5 संदेशों के लिए केवल अतिरिक्त संदेश प्राप्त हो सकता है (क्योंकि observe गारंटी नहीं देता है कि आप प्रत्येक मध्यवर्ती राज्य का निरीक्षण करेंगे, बस कि आपके जोड़/हटाए गए संदेशों को अंततः आपको वर्तमान स्थिति के साथ अद्यतित कर देगा।)

जहां आप इस तरह के निरीक्षण शुरू करेंगे: यदि आप इसे सर्वर पर Meteor.startup से करते हैं, तो यह हमेशा होगा चल रहा है, लेकिन केवल इसकी एक प्रति चल रही होगी (अभी के लिए - भविष्य में उल्का एकाधिक सर्वर प्रक्रियाएं शुरू करेगा और आपको अपना कोड अपडेट करना होगा।) यदि आप इसे एक प्रकाशित हैंडलर से करते हैं, तो यह केवल तभी होगा कम से कम एक सदस्यता होने पर चलाएं (और केवल संसाधनों का उपभोग करें)। हालिया उल्का रिलीज observe एस को डी-डुप्लिकेट करेगा जो बिल्कुल वही क्वेरी पर कॉल किया जाता है, इसलिए यदि आपके पास ऑर्डरर्स हैंडलर ({}) को कॉल करने वाले एक प्रकाशित हैंडलर के लिए 1000 सदस्यता हैं। ({...}), इसे देखना चाहिए ' टी केवल इतना ही संसाधनों की तुलना में अधिक संसाधनों का उपभोग करें। (जब ग्राहक सदस्यता समाप्त करता है तो प्रत्येक निरीक्षण को रोकने के लिए याद रखें।)

आप जो कर रहे हैं उसके आधार पर, added का उपयोग करने के बजाय प्रत्येक ऑर्डर बनने पर कार्य को शेड्यूल करना आसान हो सकता है।उदाहरण के लिए, आपके पास एक विधि createOrder हो सकती है जो ऑर्डर डालती है, और एक आइटम को ordersToProcess संग्रह में भी जोड़ती है, और उसके बाद अलग-अलग कोड होता है जो ordersToProcess संग्रह से आइटम खींचता है और उन्हें एक समय में संसाधित करता है और फिर उन्हें हटा देता है। या यदि आप बहुत अधिक समय नहीं लेते हैं तो आप सीधे createOrder विधि से अपनी प्रसंस्करण कर सकते हैं।

+1

मुझे लगता है कि आपने अपना उत्तर लिखा है क्योंकि बहुत कुछ बदल गया है। https://github.com/meteor/meteor/wiki/Oplog-Observe- ड्राइवर – HaNdTriX