2009-01-30 12 views
10

बैकस्ट्रीरी का एक बिट: मैं एक वेब एप्लिकेशन पर काम कर रहा हूं जिसके लिए उपयोगकर्ता को संपादन/कुशलतापूर्वक उपयोग करने से पहले इसे प्री/क्रंच डेटा के लिए काफी समय चाहिए। डेटा अनुरोध कार्य पूरा करने के लिए ~ 15/20 सेकंड और प्रक्रिया करने के लिए कुछ सेकेंड। एक बार वहां, उपयोगकर्ता फ्लाई पर वाउल्स में हेरफेर कर सकता है। मूल्यों में से किसी भी छेड़छाड़ के लिए डेटा को पूरी तरह से पुन: संसाधित करने की आवश्यकता होगी।मेमोरी में डेटा संग्रहीत करना: सत्र बनाम कैश बनाम स्टेटिक

अद्यतन: भ्रम से बचने के लिए, मैं केवल डेटा कॉल 1 बार (15 सेकंड हिट) बना रहा हूं और फिर परिणामों को स्मृति में रखना चाहता हूं ताकि उपयोगकर्ता इसे 100% इसके साथ काम किया। तो, पहली पुल में कुछ समय लगेगा, लेकिन, अजाक्स का उपयोग करके, मैं लगातार अपडेट करने के लिए इन-मेमोरी डेटा को हिट करने जा रहा हूं और प्रतिक्रिया समय को लगभग 2 सेकंड या इससे भी ज्यादा (मुझे आशा है)।

इस कुशल को बनाने के लिए, मैं इंटियल डेटा को स्मृति में ले जा रहा हूं और अजाक्स को सर्वर पर वापस कॉल कर रहा हूं ताकि मैं इस उपयोगकर्ता के अपडेट के पुनरावृत्ति को संभालने के लिए प्रसंस्करण समय को कम कर सकूं।

मेरा प्रश्न है, ध्यान में रखते हुए, इस डेटा को संग्रहीत करने का सबसे अच्छा तरीका क्या होगा, यह मानते हुए कि केवल 1 उपयोगकर्ता किसी भी समय इस डेटा को w/इस डेटा पर काम करेगा।

इसके अलावा, उपयोगकर्ता कुछ ही घंटों तक इस प्रक्रिया में संभावित रूप से काम कर सकता है। जब उपयोगकर्ता w/डेटा काम कर रहा है, तो मुझे उपयोगकर्ता के वर्तमान डेटा को सहेजने के लिए किसी प्रकार की असफलता की आवश्यकता होगी (या तो एक डीबी में या एक क्रमबद्ध बाइनरी फ़ाइल में) किसी भी तरह से उनके सत्र में बाधा डाली जानी चाहिए। दूसरे शब्दों में, मुझे ऐसे समाधान की आवश्यकता होगी जिसमें उचित हुक हो ताकि मुझे मेमोरी ऑब्जेक्ट के डेटा को डंप करने की अनुमति दी जा सके, जिससे उपयोगकर्ता बहुत लंबे समय से डिस्कनेक्ट/विचलित हो जाता है। एक उपयोगकर्ता को लॉक किया गया: - पेशेवरों

सत्र स्थिति:

अब तक, यहां मेरे चिंतन कर रहे हैं। सत्र अंत घटना है जो मेरी असफलता आवश्यकताओं को पूरा करेगी। विपक्ष: मेरे वर्तमान विकल्पों का सबसे धीमा perf। सत्र अंत घटना कभी-कभी यह सुनिश्चित करने के लिए मुश्किल होती है कि यह ठीक से आग लगती है।

कैशिंग - पेशेवर: अच्छा पेर्फ। निर्भरताओं तक पहुंच है जो लाइन के बाद बाद में बोनस हो सकती है लेकिन वर्तमान दायरे में वास्तव में उपयोगी नहीं है। विपक्ष: समय अंतराल के आधार पर एक लिखने के अलावा कोई आसान असफलता कदम नहीं। वैश्विक स्तर पर - यह सुनिश्चित करना होगा कि उपयोगकर्ता डब्ल्यू/एक-दूसरे के काम को टकराएं।

स्टेटिक - पेशेवर: सर्वश्रेष्ठ पेर्फ। बनाए रखने के लिए आसान है क्योंकि मैं सीधे अपने वर्तमान वर्ग संरचनाओं का लाभ उठा सकता हूं। विपक्ष: समय अंतराल के आधार पर एक लिखने के अलावा कोई आसान असफलता कदम नहीं। वैश्विक स्तर पर - यह सुनिश्चित करना होगा कि उपयोगकर्ता डब्ल्यू/एक-दूसरे के काम को टकराएं।

क्या किसी के पास मुझे चुनने के विकल्प पर कोई सुझाव/टिप्पणियां हैं?

धन्यवाद!

अपडेट: उल्लेख करने के लिए भूल गए, मैं इस कार्य को करने के लिए VB.Net, Asp.Net, और SQL सर्वर 2005 का उपयोग कर रहा हूं।

+0

अपने कोड को अनुकूलित करने में समय बिताने के लिए आमतौर पर अपने सेवर को अपग्रेड करना सस्ता है। मेरा मानना ​​है कि जेफ एटवुड ने हाल ही में अपने ब्लॉग पर इसके बारे में कुछ कहा था। – Malfist

+0

मुझे लगता है कि मुझे और अधिक विशिष्ट w/प्रदर्शन होना चाहिए था। मुझे स्मृति उपयोग को संभालने वाले सर्वर के बारे में बहुत चिंता नहीं है, बल्कि, उपयोगकर्ता को मेरी प्रतिक्रिया वापस लेने में कितना समय लगेगा। – Nathan

+0

आप किस भाषा/तकनीक का उपयोग कर रहे हैं? – nlaq

उत्तर

0

मैं किसी भी पेज लोड में डेटा संग्रहीत करने के लिए कैशिंग विधि के साथ जाऊंगा। विवादों से बचने के लिए आप डेटा को स्टोर करने के लिए इच्छित कैश का नाम दे सकते हैं।

उपयोगकर्ता द्वारा किए गए परिवर्तनों को ट्रैक करने के लिए, मैं एक और पुराने स्कूल दृष्टिकोण के साथ जाऊंगा: प्रत्येक बार जब उपयोगकर्ता परिवर्तन करता है तो टेक्स्ट फ़ाइल में संलग्न होता है और फिर उस फ़ाइल को अंतराल पर डीबी में परिवर्तनों को सहेजने के लिए साफ़ करता है। यदि आप उपयोगकर्ता/खाते या किसी अन्य सत्र-अद्वितीय संकेतक के आधार पर फ़ाइलों का नाम देते हैं तो संघर्ष और ऐप के साथ कोई समस्या नहीं है (या कुछ अन्य समर्थन ऐप, जो सामान्य रूप से एक बेहतर विचार हो सकता है) ऐसी सभी फ़ाइलों के माध्यम से साफ़ हो सकता है और सत्र समाप्त हो जाने पर भी डीबी अपडेट करें।

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

+0

धन्यवाद! यह वही दृष्टिकोण था जिसे मैं ढूंढ रहा था। मैं इसे पकड़ता हूँ। – Nathan

0

सत्र का उपयोग करें, लेकिन इस पर भरोसा न करें।

बस, उपयोगकर्ता को डेटासेट "नाम" दें, और सक्रिय रूप से उपयोगकर्ता के लिए इसे सक्रिय रूप से, या "सेव" बटन के रूप में सरल कुछ के माध्यम से सक्रिय करने का एक बिंदु बनाएं।

आप सत्र पर भरोसा नहीं कर सकते क्योंकि यह आमतौर पर उपयोगकर्ताओं के ब्राउज़र उदाहरण से जुड़ा हुआ है। अगर वे गलती से ब्राउज़र बंद करते हैं (एक्स बटन, उनके पीसी दुर्घटनाओं आदि पर क्लिक करें), तो वे अपने सभी काम खो देते हैं। जो बुरा होगा।

एक बार जब उपयोगकर्ता डेटा की "निरंतर" स्थिति पर उस तरह का नियंत्रण रखता है, तो आप उसे स्मृति में रखने और कैश के रूप में लाभ उठाने के लिए सत्र पर भरोसा कर सकते हैं।

0

मुझे लगता है कि आपने पेशेवरों/विपक्ष के साथ अपने प्रश्न का उत्तर दिया है। लेकिन अगर आप कुछ सहकर्मी सत्यापन की तलाश में हैं, तो मेरा वोट सत्र के लिए है। यद्यपि प्रदर्शन धीमा है (क्या आप कितनी धीमी गति से जानते हैं?), आपकी प्रसंस्करण पर ध्यान दिए बिना एक लंबा समय लगेगा। क्या आपको लगता है कि उपयोगकर्ता 15 सेकंड और 17 सेकंड के बीच अंतर को जानेंगे? दोनों वेब शर्तों में "हमेशा के लिए" हैं, इसलिए इसे लागू करने के लिए सबसे आसान लगता है।

शायद थोड़ा सा विषय। मैं उन लंबी प्रोसेसिंग कॉल को एसिंक्रोनस में डालने की सलाह दूंगा (AJAX के एसिंक्रोनस के साथ उलझन में नहीं) पृष्ठों।

इस आलेख पर एक नज़र डालें और मुझे समझ में नहीं आता है तो मुझे वापस पिंग करें।

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

+0

का उपयोग कर रहा हूं, मुझे लगता है कि मैं 100% स्पष्ट नहीं था। मेरा लक्ष्य सत्र/कैश/स्थिर वर्रों में डेटा खींचने के 15/20 सेकंड हिट करना है और फिर उपयोगकर्ता को उनके अपडेट/परिवर्तन करते समय सहेजना है। इस तरह, मुझे केवल हिट 1 बार करना है। – Nathan

2

मैं के लिए गुप्त विकल्प # 4 वोट करेंगे: इस के लिए डेटाबेस का उपयोग करें। यदि आप डेटा पर 20+ सेकेंड टर्नअराउंड टाइम के बारे में बात कर रहे हैं, तो आपको प्रस्तुत किए गए विकल्पों की सीमाओं के अनुसार, आपको इन-मेमोरी को करने की कोशिश करके कुछ भी हासिल नहीं होगा। आप इसे डेटाबेस में भी सेट अप कर सकते हैं (यदि आवश्यकताएं बड़ी हैं तो इसे अपनी खुद की एक तालिका दें, या यहां तक ​​कि एक अलग डेटाबेस भी दें)।

0

मैं उपयोगकर्ता को प्रारंभिक परिणाम भेजते समय एक नई डेटाबेस तालिका में डेटा की एक प्रति बनाने के लिए सुझाव देता हूं (चलिए इसे EDIT कहते हैं)। यदि प्रदर्शन एक मुद्दा है, तो इसे पृष्ठभूमि थ्रेड में करें।

चूंकि उपयोगकर्ता डेटा संपादित करता है, तालिका को अपडेट करें (यदि प्रदर्शन कोई समस्या हो तो पृष्ठभूमि थ्रेड में भी)। यदि आपको धागे का उपयोग करना है, तो आपको यह सुनिश्चित करना होगा कि पंक्तियों को अपडेट करना शुरू करने से पहले पहला धागा समाप्त हो गया हो।

यह उपयोगकर्ता को दूर जाने, वापस आने, ब्राउज़र को पुनरारंभ करने और परिणाम से संतुष्ट होने पर प्रतिबद्ध होने की अनुमति देता है।

0

दूसरों का उल्लेख करने का एक संभावित विकल्प क्लाइंट पर डेटा स्टोर करना है। डेटासेट मानना ​​बहुत बड़ा नहीं है, और कोड जो इसे कुशल बनाता है उसे क्लाइंट साइड को संभाला जा सकता है। आप डेटा को एक्सएमएल डेटा द्वीप या जेएसओएन ऑब्जेक्ट के रूप में स्टोर कर सकते हैं। इस डेटा को तब सर्वर के लिए कोई गोल यात्रा के साथ सभी क्लाइंट पक्षों में हेरफेर/संसाधित और संभाला जा सकता था। यदि आपको इस डेटा को सर्वर पर वापस जारी रखने की आवश्यकता है तो परिणामस्वरूप डेटा को AJAX या मानक पोस्टबैक के माध्यम से पोस्ट किया जा सकता है।

यदि यह आपकी आवश्यकताओं के साथ काम नहीं करता है तो मैं इसे अन्य SQL सुझावों पर संग्रहीत करने के साथ ही SQL सर्वर पर संग्रहीत करने के साथ जाऊंगा।

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