2013-02-04 13 views
7

मैं वर्तमान में अपनी कंपनी में चल रही विंडोज सेवा को स्केल करने के तरीके के बारे में कुछ इनपुट ढूंढ रहा हूं। हम .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-कोर सर्वर पर लोड का प्रबंधन करता है हमारे पास (मैं पूर्ण चश्मा याद नहीं है, लेकिन यह कहना इस मशीन एक जानवर है सुरक्षित है)। मुझे स्केल करने और उन मशीनों को जोड़ने का तरीका ढूंढने का काम सौंपा गया है जो इस डेटा को संसाधित करेंगे और अन्य मामलों में हस्तक्षेप नहीं करेंगे।

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

सीमाएं

  • इस स्तर मैं किसी भी वास्तुकला मैं मनचाहे ढंग का उपयोग कर नए सिरे से इस सेवा को फिर से लिखने की अनुमति दी हूँ पर।
  • एक उदाहरण दुर्घटनाग्रस्त होना चाहिए, अन्य उदाहरणों को चुनने में सक्षम होना चाहिए जहां दुर्घटनाग्रस्त हो गया था। कोई डेटा खोया नहीं जा सकता है।
  • यह प्रसंस्करण डेटाबेस में डाली गई रिपोर्ट से यथासंभव वास्तविक समय के करीब होना चाहिए।

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

संपादित
निकाला गया अप्रासंगिक जानकारी

+0

यह * एक * ईटीएल प्रक्रिया की तरह लगता है। क्या आपने एसक्यूएल सर्वर इंटीग्रेशन सर्विसेज (एसएसआईएस) जैसे कुछ को देखने और पैकेज लिखने पर विचार किया है जिसे नियमित रूप से इस प्रक्रिया को करने के लिए चलाने के लिए निर्धारित किया जा सकता है? –

+0

हम ओरेकल का उपयोग करते हैं और उच्च अप दुर्भाग्यवश SQL सर्वर के बारे में कोई शब्द नहीं सुनना चाहते हैं। – Artless

+0

मैं केवल एसएसआईएस का हिस्सा सोच रहा था, न कि डेटाबेस इंजन :) विकल्प पेंटाहो डेटा एकीकरण (http://www.pentaho.com/explore/pentaho-data-integration/) या Talend etl analytics जैसे कुछ होंगे (http://www.talend.com/solutions/etl-analytics) –

उत्तर

0

मैं यह सब scalability और अपने दम पर अतिरेक सामान कोडिंग द्वारा इस हल किया। मैं समझाऊंगा कि मैंने क्या किया और मैंने यह कैसे किया, क्या किसी को कभी इसकी आवश्यकता होनी चाहिए।

मैंने दूसरों के ट्रैक रखने के लिए प्रत्येक उदाहरण में कुछ प्रक्रियाएं बनाई हैं और पता है कि कौन सा रिकॉर्ड विशेष उदाहरण संसाधित कर सकता है। स्टार्ट अप पर, उदाहरण Instances नामक तालिका में डेटाबेस (यदि यह पहले से नहीं है) में पंजीकृत होगा।

Id     Number 
MachineName  Varchar2 
LastActive   Timestamp 
IsMaster   Number(1) 

दर्ज की और इस तालिका में एक पंक्ति बनाने अगर उदाहरण के MachineName नहीं मिला था के बाद, उदाहरण के एक अलग थ्रेड में हर दूसरे इस तालिका पिंग, अपने LastActive स्तंभ को अद्यतन करने के लिए शुरू होता है: यह तालिका निम्न स्तंभ है। फिर यह इस तालिका से सभी पंक्तियों का चयन करता है और यह सुनिश्चित करता है कि Master Instance (बाद में उस पर अधिक) अभी भी जीवित है - जिसका अर्थ है कि यह LastActive समय पिछले 10 सेकंड में है। यदि मास्टर इंस्टेंस ने जवाब देना बंद कर दिया है, तो यह नियंत्रण ग्रहण करेगा और खुद को मास्टर के रूप में स्थापित करेगा। अगले पुनरावृत्ति में यह सुनिश्चित करेगा कि केवल एक ही मास्टर है (यदि किसी अन्य उदाहरण में नियंत्रण के साथ-साथ एक साथ नियंत्रण करने का निर्णय लिया जाता है), और यदि नहीं, तो यह सबसे कम Id के साथ उदाहरण के लिए उपज करेगा।

मास्टर इंस्टेंस क्या है?
सेवा का काम लॉगिंग टेबल स्कैन करना और उस डेटा को संसाधित करना है ताकि लोग आसानी से फ़िल्टर कर सकें और इसे आसानी से पढ़ सकें। मैंने इसे अपने प्रश्न में नहीं बताया, लेकिन यह यहां प्रासंगिक हो सकता है। हमारे पास प्रति अनुरोध लॉगिंग तालिका में एकाधिक रिकॉर्ड लिखने वाले ईएसबी सर्वर का एक गुच्छा है, और मेरी सेवा का काम निकट वास्तविक समय में उनका ट्रैक रखना है। चूंकि वे अपने लॉग को असीमित रूप से लिख रहे हैं, इसलिए लॉग में started processing request A प्रविष्टि से पहले मुझे संभावित रूप से finished processing request A मिल सकता है। तो, मेरे पास कुछ कोड हैं जो उन रिकॉर्ड्स को टाइप करता है और यह सुनिश्चित करता है कि मेरी सेवा डेटा को सही क्रम में संसाधित करे। चूंकि मुझे इस सेवा को स्केल करने की आवश्यकता है, इसलिए बहुत से अनावश्यक डीबी प्रश्नों और संभावित रूप से पागल बग से बचने के लिए केवल एक उदाहरण ही इस तर्क को कर सकता है।
यह वह जगह है जहां Master Instance आता है। केवल यह इस सॉर्टिंग तर्क को निष्पादित करता है और अस्थायी रूप से ReportAssignment नामक किसी अन्य तालिका में लॉग रिकॉर्ड आईडी को सहेजता है। इस तालिका का काम यह ट्रैक रखना है कि कौन से रिकॉर्ड संसाधित किए गए थे और किसके द्वारा। एक बार प्रसंस्करण पूरा हो जाने पर, रिकॉर्ड हटा दिया जाता है। तालिका इस प्रकार है:

RecordId  Number 
InstanceId  Number Nullable 

मास्टर उदाहरण लॉग प्रविष्टियों सॉर्ट करता है और उनके ईद यहाँ है सम्मिलित करता है। मेरे सभी सेवा उदाहरण इस तालिका को नए रिकॉर्ड के लिए 1 सेकंड अंतराल में जांचते हैं जिन्हें किसी भी द्वारा संसाधित नहीं किया जा रहा है या जिन्हें एक निष्क्रिय उदाहरण द्वारा संसाधित किया जा रहा है, और [record's Id] % [number of isnstances] == [index of current instance in a sorted array of all the active instances] (जो पिंगिंग प्रक्रिया के दौरान अधिग्रहित किए गए थे)। क्वेरी कुछ हद तक इस तरह दिखता है:

SELECT * FROM ReportAssignment 
WHERE (InstanceId IS NULL OR InstanceId NOT IN (1, 2, 3)) // 1,2,3 are the active instances 
AND RecordId % 3 == 0 // 0 is the index of the current instance in the list of active instances 

क्यों मैं यह कर की जरूरत है?

  • अन्य दो उदाहरणों RecordId % 3 == 1 और RecordId % 3 == 2 के लिए क्वेरी होगा।
  • RecordId % [instanceCount] == [indexOfCurrentInstance] सुनिश्चित करता है कि रिकॉर्ड सभी मामलों के बीच समान रूप से वितरित किए जाते हैं।
  • InstanceId NOT IN (1,2,3) उदाहरणों को उन उदाहरणों को लेने की अनुमति देता है जिन्हें एक उदाहरण के द्वारा संसाधित किया जा रहा था, और एक नया उदाहरण जोड़ा जाने पर पहले से ही सक्रिय उदाहरणों के रिकॉर्ड को संसाधित नहीं किया गया था।

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

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

6

अपने काम आइटम के लिए, Windows कार्यप्रवाह शायद आपकी सेवा refactor करने के लिए अपने तेज साधन है।

Windows Workflow Foundation @ MSDN

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

Workflow Persistence @ MSDN

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

कार्य वितरण के लिए, आपके पास कुछ विकल्प हैं।

  1. एक सेवा मेजबान आधारित लोड कार्यप्रवाह मंगलाचरण के माध्यम से संतुलन WorkflowService वर्ग के माध्यम से WCF अंतिम बिंदुओं का उपयोग कर के साथ संयुक्त संदेशों के उत्पादन के लिए। ध्यान दें कि आप मैन्युअल रूप से Receive और इसी SendReply हैंडलर (इन मानचित्रों को डब्ल्यूसीएफ विधियों) के बजाय मैन्युअल रूप से सेटअप करने के बजाय प्रवेश विधियों का निर्माण करने के लिए डिज़ाइन-मोड संपादक का उपयोग करना चाहते हैं। आप शायद प्रत्येक संदेश के लिए सेवा को कॉल करेंगे, और शायद प्रत्येक रिपोर्ट के लिए सेवा भी कॉल करेंगे। ध्यान दें कि CanCreateInstance संपत्ति यहां महत्वपूर्ण है। इससे जुड़े प्रत्येक आमंत्रण से चलने वाला एक उदाहरण होगा जो स्वतंत्र रूप से चलता है।
    ~
    WorkflowService Class (System.ServiceModel.Activities) @ MSDN
    Receive Class (System.ServiceModel.Activities) @ MSDN
    Receive.CanCreateInstance Property (System.ServiceModel.Activities) @ MSDN
    SendReply Class (System.ServiceModel.Activities) @ MSDN

  2. एक सेवा बस कतार समर्थन का उपयोग करें। कम से कम, आप ऐसा कुछ चाहते हैं जो संभावित रूप से किसी भी संख्या से ग्राहकों को इनपुट स्वीकार कर ले, और जिनके आउटपुट को विशिष्ट रूप से पहचाना जा सकता है और एक बार ठीक से संभाला जा सकता है। कुछ जो दिमाग में आते हैं वे हैं NServiceBus, MSMQ, RabbitMQ, और ZeroMQ। यहां उल्लिखित वस्तुओं में से, NServiceBus विशेष रूप से .NET तैयार-ऑफ-द-बॉक्स है। क्लाउड संदर्भ में, आपके विकल्पों में प्लेटफ़ॉर्म-विशिष्ट प्रसाद भी शामिल हैं जैसे कि एज़ूर सर्विस बस और अमेज़ॅन एसक्यूएस।
    ~
    NServiceBus
    MSMQ @ MSDN
    RabbitMQ
    ZeroMQ
    Azure Service Bus @ MSDN
    Amazon SQS @ Amazon AWS
    ~
    ध्यान दें कि सेवा बस सिर्फ एक निर्माता है कि संदेश आरंभ हो जाएगा और एक उपभोक्ता है कि किसी भी पर मौजूद कर सकते हैं के बीच गोंद है कतार से पढ़ने के लिए मशीनों की संख्या। इसी तरह, आप रिपोर्ट जनरेशन के लिए इस संकेत का उपयोग कर सकते हैं। आपका उपभोक्ता वर्कफ़्लो उदाहरण बनाएगा जो तब वर्कफ़्लो दृढ़ता का उपयोग कर सकता है।

  3. विंडोज ऐपफ़ैब्रिक वर्कफ़्लो होस्ट करने के लिए उपयोग किया जा सकता है, जिससे आप अपने काम को वितरित करने के लिए आईआईएस लोड संतुलन पर लागू होने वाली कई तकनीकों का उपयोग कर सकते हैं। मुझे व्यक्तिगत रूप से इसके साथ कोई अनुभव नहीं है, इसलिए इसके अलावा मैं इसके बारे में इतना कुछ नहीं कह सकता कि इसके अलावा बॉक्सिंग के बाहर अच्छा निगरानी समर्थन है।
    ~
    How to: Host a Workflow Service with Windows App Fabric @ MSDN
+0

धन्यवाद! मुझे कुछ पढ़ना और परीक्षण करना होगा, और देखें कि मेरी कंपनी क्या करने को तैयार है। – Artless

+1

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

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