2013-10-11 8 views
7

मैं एक सोर्सिंग एप्लिकेशन में एक ईवेंट स्टोर के रूप में कैसंद्रा का उपयोग करने के साथ प्रयोग करना चाहता हूं। एक घटना स्टोर के लिए मेरी आवश्यकताओं काफी सरल हैं।एक ईवेंट स्टोर के रूप में कैसंद्रा का उपयोग

  • आईडी: एक समग्र जड़ संस्था की आईडी
  • डेटा: धारावाहिक घटना डेटा (जैसे JSON)
  • टाइमस्टैम्प घटना 'स्कीमा' कुछ इस तरह होगा: जब घटना हुई
  • sequence_number: घटना की अनूठी संस्करण

मैं कैसंद्रा के लिए बिल्कुल नया हूं इसलिए मुझे अपनी अज्ञानता के लिए क्षमा करें जो मैं लिखने वाला हूं। मेरे पास केवल दो प्रश्न हैं जो मैं कभी भी इस डेटा पर चलाना चाहता हूं।

  1. मुझे किसी दिए गए कुल जड़ आईडी
  2. मुझे किसी दिए गए कुल जड़ के लिए सभी घटनाओं दें क्रम संख्या> x

मेरा विचार है, जहां अगर के लिए सभी घटनाओं दें में एक कैसेंड्रा तालिका बनाने के लिए है सीक्यूएल इस तरह:

CREATE TABLE events (
    id uuid, 
    seq_num int, 
    data text, 
    timestamp timestamp, 
    PRIMARY KEY (id, seq_num)); 

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

मेरे विशिष्ट चिंता यह है कि दूसरे क्वेरी किसी तरह से अक्षम होने जा रहा है (मैं यहाँ माध्यमिक अनुक्रमित के बारे में सोच रहा हूँ ...)

+0

अब यह एक साल बाद, मुझे यह जानकर उत्सुकता है कि कैसंड्रा का उपयोग करके आपका कार्यक्रम सोर्सिंग कैसे किया गया। –

+1

यह तार्किक लगता है कि आप क्वेरी मॉडलों के पुनर्निर्माण के लिए कालक्रम के क्रम में सभी घटनाओं को भी चाहते हैं। इसके लिए ऐसा लगता है कि कैसंड्रा को संभालना मुश्किल है। –

+4

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

उत्तर

5

आपका डिजाइन अच्छी तरह से "कैसेंड्रा शब्द" में मॉडलिंग कर रहे है। आपको आवश्यक प्रश्नों को वास्तव में "समग्र कुंजी" तालिकाओं में समर्थित किया गया है, आपके पास कुछ ऐसा होगा:

  • क्वेरी 1: select * from events where id = 'id_event';
  • क्वेरी 2: select * from events where id = 'id_event' and seq_num > NUMBER;

मुझे नहीं लगता कि दूसरी क्वेरी अक्षम होने जा रही है, हालांकि यह कई तत्वों को वापस कर सकती है ... यदि ऐसा है तो आप वापस आने वाली घटनाओं की "सीमा" निर्धारित कर सकते हैं। यदि यह संभव है तो आप limit कीवर्ड का उपयोग कर सकते हैं।

समग्र कुंजी का उपयोग करना आपकी विशिष्ट आवश्यकताओं के लिए एक अच्छा मिलान जैसा प्रतीत होता है। "माध्यमिक अनुक्रमणिका" का उपयोग करना तालिका में ज्यादा नहीं लग रहा है ... जब तक कि मुझे आपके डिजाइन/आवश्यकताओं में कुछ याद न हो।

एचटीएच।

+0

आपकी सलाह के लिए धन्यवाद। मैं केवल माध्यमिक अनुक्रमणिका ला रहा था क्योंकि मुझे यकीन नहीं था कि यह यौगिक कुंजी से संबंधित था या नहीं। – DrewEaster

-3

मैं eventstore पर aggregateroot को बचाने के लिए आपके डिज़ाइन के साथ सहमत नहीं हूं। आप लचीलेपन के लिए domainevent को सहेज सकते हैं। मैं समझाता हूं कि इवेंटडोमेन सबसे ग़लत अनाज वाला डेटा है जो एप्लिकेशन की स्थिति में परिवर्तन कर रहा है। एग्रीगेटरूट ईवेंटस्टोर के साथ मेल नहीं खाता है यह डेटा एक्सचेंज या बाउंडडॉनटेक्स्ट के लिए है। जब आप डोमेन ईवेंट का उपयोग करते हैं तो आप plolygot मॉडलिंग के साथ भी अपने डेटा को पुन: स्थापित कर सकते हैं।आप अपने क्लाइंट और बाधाओं की आवश्यकता के लिए मॉडल का प्रबंधन कर सकते हैं। इसलिए आप डोमेनोबजेक्ट के बीच लिंक के लिए ग्राफ़िक मॉडल करते हैं और उसके बाद आप neo4j का उपयोग करते हैं, इसके अतिरिक्त आप मॉडल मॉडल का मॉडल करते हैं और आप दस्तावेज़डेटाबेस का उपयोग करते हैं। मेरा मतलब है कि आपके पास मॉडल बदलने के लिए अवसर है और सुविधाजनक दृढ़ता इंजन का उपयोग करें। यह एक अंतर है पॉलीगो डेटा और पॉलीगॉग दृढ़ता। आपकी रणनीतियों में मैं दो तरीकों को समझता हूं: यदि आपको डोमिनियर और कैसंड्रा डेटाबेस पर मॉडल करने की आवश्यकता है। यदि आपको समेकन डेटा या मॉडल और कोई इवेंटोरिंग की आवश्यकता नहीं है, तो आप दस्तावेज़ डेटाबेस का उपयोग करते हैं और आप दो प्रश्नों को पुनः प्राप्त कर सकते हैं।

आप डोमेन संचालित डिज़ाइन के बारे में भ्रम को खत्म कर देंगे।

+2

इस पर प्रतिक्रिया देने में देर हो चुकी है .. मुझे लगता है कि आपने वास्तव में मूल पोस्ट को सही ढंग से नहीं पढ़ा है, या किसी भी उत्तर में।मैं आपको यह सुझाव देता हूं कि मैं डीडीडी के बारे में अपने भ्रम को खत्म करता हूं, हालांकि मुझे लगता है कि आप पाएंगे कि आप इस अवसर पर उलझन में हैं। यह स्पष्ट है कि चर्चा डोमेन घटनाओं को संग्रहीत करने के बारे में है जिसे फिर एक समग्र रूट का पुनर्निर्माण करने के लिए फिर से चलाया जा सकता है – DrewEaster

1

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

1

मैं एक बहुत ही समान परिदृश्य (प्रति पंक्ति 100k + कॉलम के साथ) के लिए कैसंद्रा का उपयोग कर रहा हूं और आपके नज़दीकी मॉडल के साथ समाप्त हुआ। मैं emgsilva से भी सहमत हूं कि एक माध्यमिक सूचकांक शायद ज्यादा नहीं लाएगा।

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

ध्यान दें कि कॉम्पैक्ट स्टोरेज का मतलब है कि आपके पास केवल एक मान कॉलम हो सकता है। इसलिए, आपको कुंजी के सभी अन्य कॉलम हिस्से को बनाने की आवश्यकता है।

आप के लिए, स्कीमा होगा:

CREATE TABLE events (
    id uuid, 
    seq_num int, 
    timestamp timestamp, 
    data text, 
    PRIMARY KEY (id, seq_num, timestamp)) 
    WITH COMPACT STORAGE; 
0

आपका विभाजन कुंजी भी बारीक है, तो आप एक समग्र विभाजन कुंजी बनाने या इसे बदलने के समय श्रृंखला मॉडलिंग के लिए बेहतर प्रदर्शन प्राप्त करने के लिए करना चाहिए। उदाहरण

CREATE TABLE events (
    event_date int, 
    id timeuuid, 
    seq_num int, 
    data text, 
    PRIMARY KEY (event_date, id)); 

इस तरह के लिए अपने आईडी घटना unicqueness और अपने विभाजन कुंजी (यानी। 20,160,922) की गारंटी करने के लिए सिर्फ एक क्लस्टरिंग स्तंभ बन जाएगा प्रतिदिन सभी घटनाओं समूह कर सकते हैं। आप इसे महीने में भी बदल सकते हैं। इसके बजाय uuid उपयोग टाइमयूइड का उपयोग करने से बचें, यह पहले से ही टाइमस्टैम्प जानकारी संग्रहीत करता है।

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