2008-09-07 15 views
10

हम जितना संभव हो सके हमारे पेज लोड को हल्का करने की कोशिश कर रहे हैं। चूंकि व्यूस्टेट कभी-कभी पेज के 100k तक सूख सकता है, इसलिए मुझे इसे पूरी तरह से खत्म करना अच्छा लगेगा।पेज से बाहर व्यूस्टेट को स्थानांतरित करना?

मुझे कुछ तकनीकों को सुनना अच्छा लगेगा जो अन्य लोगों ने कस्टम प्रदाता को व्यूस्टेट को स्थानांतरित करने के लिए उपयोग किया है।

जिसके अनुसार, कुछ चेतावनियां:

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

विचार?

+1

2 मिलियन अद्वितीय आगंतुकों:

यहाँ यह कैसे किया जा सकता है पर एक विस्तृत लेख है? वाह! क्या यह विशेषज्ञ एक्सचेंज या कुछ (अन्य) pr0n साइट है? ;-) – splattne

+0

pr0n निश्चित रूप से :)))))))) (जोनाथन मजाक कर रहे हैं) –

+0

व्यूस्टेट के लिए 100k? यह सामान्य नहीं हो सकता है। –

उत्तर

2

मैंने पृष्ठ से दृश्य स्थिति के लोड को हटाने के लिए कई तरीकों का परीक्षण किया है और सभी हैक्स और कुछ सॉफ़्टवेयर के बीच वहां केवल एक चीज है जो वास्तव में मापनीय है StrangeLoops As10000 appliance है। पारदर्शी, अंतर्निहित आवेदन को बदलने की जरूरत नहीं है।

2

previously stated के रूप में, मैंने अतीत में व्यूस्टेट को स्टोर करने के लिए डेटाबेस का उपयोग किया है। हालांकि यह हमारे लिए काम करता है, हम प्रति घंटे करीब 2 मिलियन अद्वितीय आगंतुक नहीं आते हैं।

मुझे लगता है कि हार्डवेयर समाधान निश्चित रूप से जाने का तरीका है, चाहे StrangeLoop उत्पादों या अन्य उत्पाद का उपयोग कर रहा हो।

0

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

मुझे वास्तव में एक सॉफ्टवेयर समाधान के साथ आने की जरूरत है, क्योंकि यह एकमात्र दुनिया है जिसका मेरा कुछ नियंत्रण है।

Yay उद्यम :(

0

के लिए मैं, उत्पादों मैं पिछले कि सिर्फ StrangeLoops (लेकिन सॉफ्टवेयर आधारित) की तरह काम करता में शोध किया था के कुछ खोजने के लिए ऐसा लगता है कि वे सब कारोबार से बाहर चला गया की कोशिश की है मेरी सूची से केवल एक चीज है कि अभी भी ScaleOut है लेकिन वे सत्र राज्य कैशिंग में विशिष्ट हैं।

मुझे समझ में आता है कि वरिष्ठ प्रबंधन को हार्डवेयर समाधान बेचना कितना मुश्किल है, लेकिन कम से कम प्रबंधन के लिए यह हमेशा अच्छा विचार है हार्डवेयर के विक्रय प्रतिनिधि को सुनना स्वीकार करें। मैं कुछ हार्डवेयर डाल रहा हूं जो मुझे तत्काल समाधान के साथ प्रस्तुत करेगा क्योंकि यह मुझे अनुमति देता है (या एम खरीदता है ई कुछ समय) कुछ और असली काम करने के लिए।

मैं समझता हूं, यह वास्तव में बेकार है लेकिन विकल्प अनुकूलन के लिए अपना कोड बदलना है और यह शायद उपकरण प्राप्त करने से कहीं अधिक खर्च करेगा।

मुझे बताएं कि क्या आपको एक और सॉफ्टवेयर आधारित समाधान मिल रहा है।

0

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

यदि मैं एक अच्छा समाधान के साथ आता हूं, तो मैं किसी भी आईपी संरक्षित कोड को हटा दूंगा और इसे सार्वजनिक उपयोग के लिए बाहर रखूंगा।

+0

कोई विशिष्ट कारण जिसे आप सत्रपेजस्टेट प्रिंटर में निर्मित नहीं कर रहे हैं? http://msdn.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx – Mike

0

ओह नहीं, red tape। वैसे यह भरने के लिए एक लंबा आदेश होने जा रहा है। आपने here का उल्लेख किया है कि आप अपने सत्र स्थिति की सेवा के लिए एक राज्य सर्वर का उपयोग करते हैं। आपके पास यह सेटअप कैसे है? शायद आप यहां कुछ ऐसा ही कर सकते हैं?

संपादित

ए डब्ल्यु एच @Jonathan, you posted, जबकि मैं इस उत्तर लिखे गया था। मुझे लगता है कि उस मार्ग पर जाकर वादा किया जा सकता है। एक बात यह है कि यह निश्चित रूप से स्मृति गहन होगा।

@Mike मुझे नहीं लगता कि सत्र की जानकारी में इसे संग्रहीत करना एक अच्छा विचार होगा, व्यूस्टेट की स्मृति तीव्रता के कारण और आपको कितनी बार व्यूस्टेट तक पहुंचने की आवश्यकता होगी। सत्रस्टेट को व्यूस्टेट के रूप में बहुत कम बार उपयोग किया जाता है। मैं दो अलग रखूंगा।

मुझे लगता है कि अंतिम समाधान ग्राहक पर व्यूस्टेट को संग्रहीत करेगा और कुछ देखने के लायक हो सकता है। Google Gears के साथ, यह अब संभव हो सकता है।

5

आप सत्र राज्य को कैसे संभालेंगे? एक अंतर्निहित "सत्र स्थिति में व्यूस्टेट स्टोर करें" प्रदाता है। यदि आप कुछ तेजी से, सत्र प्रणाली से सत्र स्थिति संग्रहीत कर रहे हैं, तो यह दृश्यस्थल के लिए सबसे अच्छा विकल्प हो सकता है।

संपादित करें: यह आपके पृष्ठ वर्गों/वैश्विक पेज आधार वर्ग के लिए निम्न कोड जोड़ें करने के लिए

protected override PageStatePersister PageStatePersister { 
     get { return new SessionPageStatePersister(this); } 
    } 
इसके अलावा

... यह कोई मतलब है एक बड़े के लिए एक आदर्श (या यहां तक ​​कि अच्छा) समाधान कर रहा है viewstate। हमेशा के रूप में, जितना संभव हो सके व्यूस्टेट के आकार को कम करें। हालांकि, सत्रपेजस्टेटपर्सिस्टर अपेक्षाकृत बुद्धिमान है और प्रति सत्र दृश्य संख्याओं की एक असीमित संख्या को संग्रहित करने से बचाता है और प्रति सत्र केवल एक ही दृश्यमान को संग्रहीत करने से बचाता है।

+0

मैंने इसे एक ऐसे पृष्ठ पर एक प्रमुख उत्पादन ऐप में उपयोग किया है जिसमें केवल कुछ हद तक उपयोगकर्ता थे। यह एक बड़ी सफलता थी (कई असफल विकल्पों की कोशिश करने के बाद) ... फिर भी, यह स्केल नहीं करता है। सुनिश्चित करें कि आप इस पर गणित करते हैं! –

+0

यही वह है जिसे मैं ढूंढ रहा था। – Przemek

+0

कस्टम पेज एडाप्टर का उपयोग करना बेहतर है क्योंकि आपको अपने पृष्ठों को बेस क्लास से प्राप्त करने की आवश्यकता नहीं है। – mcintyre321

0

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

पोस्टबैक के माध्यम से उपयोगकर्ता के साथ कुछ बातचीत होने पर आपको केवल दृश्यमान की आवश्यकता होती है, और फिर भी वास्तविक रूप डेटा दृश्य को फिर से बनाने के लिए पर्याप्त हो सकता है। आप पेज पर नियंत्रण के लिए दृश्यमान को चुनिंदा रूप से अक्षम कर सकते हैं।

यदि आपके पास वास्तव में व्यूस्टेट की 100K की आवश्यकता है तो आपके पास एक बहुत ही खास यूआई है। यदि आप व्यूस्टेट को बिल्कुल जरूरी चीज़ों को कम करते हैं, तो यह पेज में व्यूस्टेट रखने के लिए सबसे आसान और सबसे स्केलेबल हो सकता है।

2
मेरे लिए

निम्नलिखित काम करता है बहुत अच्छी तरह से:

string vsid; 

protected override object LoadPageStateFromPersistenceMedium() 
{ 
    Pair vs = base.LoadPageStateFromPersistenceMedium() as Pair; 
    vsid = vs.First as string; 
    object result = Session[vsid]; 
    Session.Remove(vsid); 
    return result; 
} 

protected override void SavePageStateToPersistenceMedium(object state) 
{ 
    if (vsid == null) 
    { 
    vsid = Guid.NewGuid().ToString(); 
    } 
    Session[vsid] = state; 
    base.SavePageStateToPersistenceMedium(new Pair(vsid, null)); 
} 
0

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

यहां मेरे कोड का लिंक है। link text

यदि आप स्केलिंग से चिंतित हैं तो सत्र टोकन का उपयोग एक अद्वितीय पहचानकर्ता के रूप में या सत्र में राज्य को संग्रहीत करना वेब फार्म परिदृश्य में काम करने की अपेक्षाकृत कम या कम है।

0

सत्र ऑब्जेक्ट में व्यूस्टेट स्टोर करें और माइक्रोस्कोफ्ट वेग जैसे सर्वरों से सत्र अलग स्टोर करने के लिए वितरित कैश या राज्य सेवा का उपयोग करें।

0

मैं जानता हूँ कि यह एक छोटे से बासी है, लेकिन मैं करने के लिए व्यंग्य और ecap का उपयोग कर एक खुला स्रोत "आभासी उपकरण" पर कुछ दिनों के लिए काम कर रहा है:

1.) gzip 2.) संभाल ssl 3.) अनुरोध/प्रतिक्रिया पर एक टोकन के साथ व्यूस्टेट को प्रतिस्थापित करें 4.) ऑब्जेक्ट कैशिंग

किसी भी तरह, यह बहुत ही आशाजनक दिखता है। मूल रूप से यह लोडबलर्स के सामने बैठेगा और वास्तव में ग्राहक प्रदर्शन में मदद करनी चाहिए। ऐसा लगता है कि या तो स्थापित करना बहुत कठिन नहीं लगता है।

0

मैंने कुछ समय पहले इस पर भी ब्लॉग - समाधान अपने पृष्ठ वर्गों में से प्रत्येक को बदलने के लिए, एक कस्टम PageAdapter का उपयोग करके बिना http://www.adverseconditionals.com/2008/06/storing-viewstate-in-memcached-ultimate.html

यह आप अपनी पसंद से एक के लिए ViewState प्रदाता को बदलने की सुविधा देता है पर है। मैंने Memcached में ViewState संग्रहीत किया। पीछे की ओर मुझे लगता है कि इसे डेटाबेस में या डिस्क पर संग्रहीत करना बेहतर है - हमने बहुत जल्दी मेमकैड भर दिया। यह बहुत कम घर्षण समाधान है।

1

तुम हमेशा ViewState सेक कर सकते हैं ताकि आप इतना ब्लोट बिना ViewState का लाभ प्राप्त:

public partial class _Default : System.Web.UI.Page { 

    protected override object LoadPageStateFromPersistenceMedium() { 
    string viewState = Request.Form["__VSTATE"]; 
    byte[] bytes = Convert.FromBase64String(viewState); 
    bytes = Compressor.Decompress(bytes); 
    LosFormatter formatter = new LosFormatter(); 
    return formatter.Deserialize(Convert.ToBase64String(bytes)); 
    } 

    protected override void SavePageStateToPersistenceMedium(object viewState) { 
    LosFormatter formatter = new LosFormatter(); 
    StringWriter writer = new StringWriter(); 
    formatter.Serialize(writer, viewState); 
    string viewStateString = writer.ToString(); 
    byte[] bytes = Convert.FromBase64String(viewStateString); 
    bytes = Compressor.Compress(bytes); 
    ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes)); 
    } 

    // ... 

} 

using System.IO; 
using System.IO.Compression; 

public static class Compressor { 

    public static byte[] Compress(byte[] data) { 
    MemoryStream output = new MemoryStream(); 
    GZipStream gzip = new GZipStream(output, 
         CompressionMode.Compress, true); 
    gzip.Write(data, 0, data.Length); 
    gzip.Close(); 
    return output.ToArray(); 
    } 

    public static byte[] Decompress(byte[] data) { 
    MemoryStream input = new MemoryStream(); 
    input.Write(data, 0, data.Length); 
    input.Position = 0; 
    GZipStream gzip = new GZipStream(input, 
         CompressionMode.Decompress, true); 
    MemoryStream output = new MemoryStream(); 
    byte[] buff = new byte[64]; 
    int read = -1; 
    read = gzip.Read(buff, 0, buff.Length); 
    while(read > 0) { 
     output.Write(buff, 0, read); 
     read = gzip.Read(buff, 0, buff.Length); 
    } 
    gzip.Close(); 
    return output.ToArray(); 
    } 
} 
0

खरीदने के लिए या कुछ भी बेचने के लिए viewstate सूजन को खत्म करने की कोई आवश्यकता नहीं। बस HiddenFieldPageStatePersister को विस्तारित करने की आवश्यकता है। व्यूस्टेट का 100-200 केबी सर्वर पर रहेगा और इसके बजाय पृष्ठ पर केवल 62byte टोकन भेजेगा। प्रति घंटे

http://ashishnangla.com/2011/07/21/reducing-size-of-viewstate-in-asp-net-webforms-by-writing-a-custom-viewstate-provider-pagestatepersister-part-12/

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