2010-12-07 14 views
11

प्रबंधित करने के लिए मैं वर्तमान में एक सी # .NET डेस्कटॉप एप्लिकेशन पर काम कर रहा हूं जो डब्ल्यूसीएफ और डब्ल्यूसीएफ डेटा सेवाओं के माध्यम से इंटरनेट पर डेटाबेस से संचार करेगा। आवेदन में कई धब्बे होंगे जिन्हें कुछ अंतराल पर ताज़ा करने की आवश्यकता हो सकती है। सबसे आसान समाधान इन क्षेत्रों को केवल टाइमर पर रखना होगा और डेटाबेस की आवश्यकता होगी। हालांकि, सेवा परत से कनेक्ट होने वाले हजारों क्लाइंट और इसलिए डेटाबेस के साथ, ये ऑपरेशन सर्वर के लिए बहुत महंगा होगा।गुड सी # .NET समाधान लगातार डेटाबेस मतदान

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

मैंने क्लाइंट से सर्वर से कुछ प्रत्यक्ष और निरंतर कनेक्शन बनाने पर भी विचार किया है, लेकिन मुझे यकीन नहीं है कि क्लाइंट से आउटबाउंड फ़ायरवॉल बंदरगाह क्या खुलेंगे। मैं शायद पोर्ट 80/443 पर ही गिन सकता हूं।

तो मेरा सवाल यह है कि इस समस्या को हल करने के लिए लोगों को सफलतापूर्वक क्या समाधान मिल रहा है? क्या लोगों ने आरएसएस किया है? माइक्रोसॉफ्ट सिंक सेवा? डब्ल्यूसीएफ के माध्यम से कुछ बचत बंदरगाह पर क्लाइंट और सर्वर के बीच दो तरह का संचार?

किसी भी विचार की बहुत सराहना की जाती है।

उत्तर

8

मुझे लगता है कि आप दो दृष्टिकोणों के संयोजन के साथ जाना चाह सकते हैं। सबसे पहले, आप क्लाइंट से सर्वर पर long polling का उपयोग कर सकते हैं ताकि सर्वर क्लाइंट को सूचित कर सके जैसे ग्राहक बदलता है।

एक नई तकनीक जो ऊपर दिए गए सुझाव को एएसपी में काफी अच्छी तरह से संभालती है। नेट SignalR है। यह लंबे मतदान के अधिकांश विवरणों को संभालता है (या जब यह कर सकता है तो वेबसाकेट का उपयोग करता है) तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

दूसरा, इस प्रश्न में टैग के आधार पर ऐसा लगता है कि आप SQL सर्वर का उपयोग कर रहे हैं। परिवर्तनों के दौरान डीबी आपकी सेवा को सूचित करने के लिए आप रुचि रखने वाली तालिकाओं पर डेटाबेस नोटिफिकेशन का उपयोग कर सकते हैं। यह क्लाइंट को लंबे मतदान कनेक्शन के माध्यम से परिवर्तनों के बारे में सूचित करने के लिए सेवा को ट्रिगर कर सकता है। आप SqlDependency कक्षा का उपयोग कर ऐसा कर सकते हैं।

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

+0

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

+0

+1 क्या आप डब्ल्यूसीएफ का उपयोग कर सी # में किसी भी लंबे समय तक मतदान के कार्यान्वयन के बारे में जानते हैं? मैंने इसे गुमराह किया है और किसी भी अच्छे उदाहरण के साथ नहीं आया है। – BernicusMaximus

+0

क्षमा करें, मैं नहीं करता। मुझे पता है कि सिल्वरलाइट के लिए डब्ल्यूसीएफ में एक डुप्लेक्स चैनल है, लेकिन जो मैंने पढ़ा है उससे यह समय-समय पर मतदान करेगा और लंबे मतदान नहीं करेगा (http://msdn.microsoft.com/en-us/library/cc645028(VS.95) .aspx) –

0

यदि महंगी ऑपरेशन डेटाबेस को पूल करने का सर्वर है, तो आपको किसी प्रकार के कैशिंग को लागू करना चाहिए। यह एएसपी.नेट कैशिंग या मेमकैच का उपयोग करने के रूप में उन्नत के रूप में बुनियादी हो सकता है।

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

0

आप Service Broker पर गौर कर सकता है, इस तरह आप अपडेट

5

के लिए मतदान नहीं होगा अगर आप इस तरह WCF सिलसिले में एक कॉलबैक इंटरफ़ेस परिभाषित कर सकते हैं:

[ServiceContract(CallbackContract = typeof(IFooClient))] 

ग्राहक शुरू के रूप में कनेक्शन फ़ायरवॉल के माध्यम से काम करना चाहिए।सर्वर कर सकते हैं विधि में परिवर्तन के लिए रजिस्टर करने के लिए एक तुम

IFooClient client = OperationContext.Current.GetCallbackChannel<IFooClient>(); 

साथ कॉलबैक इंटरफ़ेस मिलता है और सभी ग्राहकों है कि डेटा परिवर्तन पर पंजीकृत हैं कॉलबैक कर सकते हैं।

+0

मुझे यह दृष्टिकोण भी पसंद है। मैं इसकी जांच करूँगा। – BernicusMaximus

0

मुझे नहीं पता कि आरएसएस डाटाबेस से आपकी वेब सेवाओं को कैश जानकारी रखने से क्यों आसान होगा।

2 विकल्पों की तुलना करने के लिए, मान लें कि आपको यह जानने की आवश्यकता है कि पिछली बार एक रिपोर्ट में ऑब्जेक्ट किसने संपादित किया था (या आखिरी बार इसे अपडेट किया गया था)। एक आरएसएस फ़ीड के साथ, आपको फ़ीड के लिए अनुरोध करना होगा, इसे प्राप्त करना होगा, इसे पार्स करना होगा, और प्रासंगिक मानों के आधार पर कार्रवाई करना होगा। एक वेब सेवा कॉल के साथ जो इसे डेटाबेस कॉल को याद और कैश करता है, आप बस सेवा को कॉल करते हैं और परिणाम पर कार्रवाई करते हैं। एक बार जब मैं आरएसएस को बेहतर देख सकता था तो यह है कि 1) आप कई क्लाइंट्स का समर्थन कर रहे हैं जिन्हें आप नियंत्रित नहीं करते हैं या नहीं हैं। नेट क्लाइंट और 2) आप एक ही समय में कई मतदान मूल्यों के आधार पर कार्रवाई कर रहे हैं ।

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