मैं वर्तमान में अपनी कंपनी में चल रही विंडोज सेवा को स्केल करने के तरीके के बारे में कुछ इनपुट ढूंढ रहा हूं। हम .NET 4.0 (और भविष्य में कुछ बिंदु पर 4.5 में अपग्रेड किया जाएगा कर सकते हैं) का उपयोग कर रहे हैं और विंडोज सर्वर 2012विंडोज सेवाओं को स्केलिंग
पर इस चल सेवा
सेवा की नौकरी में नई पंक्तियों के लिए क्वेरी करने के लिए है के बारे में एक लॉगिंग टेबल (हम ओरेकल डेटाबेस के साथ काम कर रहे हैं), जानकारी को संसाधित करें, 5 अन्य टेबलों में पंक्तियों का एक गुच्छा बनाएं और/या अपडेट करें (चलिए उन्हें ट्रैकिंग टेबल कहते हैं), लॉगिंग टेबल अपडेट करें और दोहराएं।
लॉगिंग तालिका में बड़ी मात्रा में एक्सएमएल (प्रति पंक्ति 20 एमबी तक जा सकता है) जिसे अन्य 5 ट्रैकिंग टेबलों में चुना और सहेजा जाना आवश्यक है। एक घंटे में 500,000 पंक्तियों की अधिकतम दर पर नई पंक्तियां हर समय जोड़ दी जाती हैं।
ट्रैकिंग टेबल 'यातायात बहुत अधिक है, जो कि सबसे छोटी तालिका में 90,000 नई पंक्तियों से लेकर सबसे बड़ी मेज में संभावित रूप से लाखों पंक्तियों तक है। उल्लेख नहीं है कि उन तालिकाओं पर अद्यतन संचालन भी हैं।
डेटा के बारे में कार्रवाई की जा रही
मुझे लगता है इस बिट एक समाधान कैसे इन वस्तुओं वर्गीकृत किया और कार्रवाई की जाती है के आधार पर खोजने के लिए महत्वपूर्ण है। डेटा संरचना इस तरह दिखता है:
public class Report
{
public long Id { get; set; }
public DateTime CreateTime { get; set; }
public Guid MessageId { get; set; }
public string XmlData { get; set; }
}
public class Message
{
public Guid Id { get; set; }
}
- रिपोर्ट लॉगिंग डेटा मैं चयन करने की आवश्यकता है और हर संदेश वहाँ औसत 5 रिपोर्ट पर हैं के लिए प्रक्रिया
- है। कुछ मामलों में यह 1 से सैकड़ों के बीच भिन्न हो सकता है।
- संदेश में अन्य संग्रह और अन्य संबंधों का एक समूह है, लेकिन वे इस प्रश्न के लिए अप्रासंगिक हैं।
आज Windows सेवा मुश्किल से एक 16-कोर सर्वर पर लोड का प्रबंधन करता है हमारे पास (मैं पूर्ण चश्मा याद नहीं है, लेकिन यह कहना इस मशीन एक जानवर है सुरक्षित है)। मुझे स्केल करने और उन मशीनों को जोड़ने का तरीका ढूंढने का काम सौंपा गया है जो इस डेटा को संसाधित करेंगे और अन्य मामलों में हस्तक्षेप नहीं करेंगे।
वर्तमान में प्रत्येक संदेश को अपना स्वयं का थ्रेड मिलता है और प्रासंगिक रिपोर्टों को संभालता है। हम डेटा को संसाधित करते समय कम से कम डीबी प्रश्नों की संख्या को कम करने के लिए उनके संदेश आईडी द्वारा समूहित बैच में रिपोर्ट संभालते हैं।
सीमाएं
- इस स्तर मैं किसी भी वास्तुकला मैं मनचाहे ढंग का उपयोग कर नए सिरे से इस सेवा को फिर से लिखने की अनुमति दी हूँ पर।
- एक उदाहरण दुर्घटनाग्रस्त होना चाहिए, अन्य उदाहरणों को चुनने में सक्षम होना चाहिए जहां दुर्घटनाग्रस्त हो गया था। कोई डेटा खोया नहीं जा सकता है।
- यह प्रसंस्करण डेटाबेस में डाली गई रिपोर्ट से यथासंभव वास्तविक समय के करीब होना चाहिए।
मैं कैसे इस तरह के एक परियोजना का निर्माण करने पर कोई इनपुट या सलाह के लिए देख रहा हूँ। मुझे लगता है कि सेवाओं को स्टेटलेस होने की आवश्यकता होगी, या किसी भी तरह से सभी मामलों के लिए कैश सिंक्रनाइज़ करने का कोई तरीका है? मुझे सभी मामलों के बीच समन्वय कैसे करना चाहिए और यह सुनिश्चित करना चाहिए कि वे एक ही डेटा को संसाधित नहीं कर रहे हैं?मैं लोड के बीच समान रूप से वितरण कैसे वितरित कर सकता हूं? और निश्चित रूप से, उदाहरण को क्रैश करने और उसके काम को पूरा करने के तरीके को कैसे संभालना है?
संपादित
निकाला गया अप्रासंगिक जानकारी
यह * एक * ईटीएल प्रक्रिया की तरह लगता है। क्या आपने एसक्यूएल सर्वर इंटीग्रेशन सर्विसेज (एसएसआईएस) जैसे कुछ को देखने और पैकेज लिखने पर विचार किया है जिसे नियमित रूप से इस प्रक्रिया को करने के लिए चलाने के लिए निर्धारित किया जा सकता है? –
हम ओरेकल का उपयोग करते हैं और उच्च अप दुर्भाग्यवश SQL सर्वर के बारे में कोई शब्द नहीं सुनना चाहते हैं। – Artless
मैं केवल एसएसआईएस का हिस्सा सोच रहा था, न कि डेटाबेस इंजन :) विकल्प पेंटाहो डेटा एकीकरण (http://www.pentaho.com/explore/pentaho-data-integration/) या Talend etl analytics जैसे कुछ होंगे (http://www.talend.com/solutions/etl-analytics) –