2014-05-04 6 views
10

में बैंक हस्तांतरण का मॉडल कैसे करें मैं Accounting Pattern पढ़ रहा हूं और सीक्यूआरएस में इसे लागू करने के बारे में काफी उत्सुक हूं।सीक्यूआरएस

मुझे लगता है कि AccountingTransaction एक समग्र रूट के रूप में यह अपरिवर्तनीय की रक्षा करता है:

कोई पैसा लीक, यह एक खाते से दूसरे में स्थानांतरण किया जाना चाहिए।

public class AccountingTransaction { 
    private String sequence; 
    private AccountId from; 
    private AccountId to; 
    private MonetaryAmount quantity; 
    private DateTime whenCharged; 

    public AccountingTransaction(...) { 
     raise(new AccountingEntryBookedEvent(sequence, from, quantity.negate(),...); 
     raise(new AccountingEntryBookedEvent(sequence, to, quantity,...); 
    } 
} 

जब AccountingTransaction इसके संग्रह में जोड़ा जाता है। यह कई AccountingEntryBookedEvent प्रकाशित करता है जिसका उपयोग क्वेरी पक्ष पर संबंधित खातों के संतुलन को अद्यतन करने के लिए किया जाता है।

एक समग्र रूट प्रति डीबी लेनदेन, अंतिम स्थिरता, अब तक इतना अच्छा अद्यतन किया गया है।

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

public class TransferApplication { 
    public void transfer(...) { 
     AccountReadModel from = accountQuery.findBy(fromId); 
     AccountReadModel to = accountQuery.findBy(toId); 
     if (from.balance() > quantity) { 
      //create txn 
     } 
    } 
} 

क्या मुझे कमांड पक्ष में खाता मॉडल करना चाहिए? मुझे प्रति डीबी लेनदेन (कम से कम खाते और खाता टीएक्सएन) में कम से कम तीन कुल जड़ें अपडेट करनी होंगी।

public class TransferApplication { 
    public void transfer(...) { 
     Account from = accountRepository.findBy(fromId); 
     Account to = accountRepository.findBy(toId); 
     Transaction txn = new Transaction(from, to, quantity); 
     //unit or work locks and updates all three aggregates 
    } 
} 

public class AccountingTransaction { 
    public AccountingTransaction(...) { 
     if (from.permit(quantity) { 
      from.debit(quantity); 
      to.credit(quantity); 
      raise(new TransactionCreatedEvent(sequence, from, to, quantity,...); 
     } 
    } 
} 
+0

क्या आप डीडीडी का उपयोग कर बैंकप्लिकेशन चाहते हैं? – Developer

+0

@ सिंघ आपकी टिप्पणी के लिए धन्यवाद। हां, सीक्यूआरएस के साथ डीडीडी। – Hippoom

+0

मेरे पास बैंकप्लिकेशन के बारे में एक परियोजना है। क्या आप इसे चाहते हैं? – Developer

उत्तर

3

कुछ उपयोग ऐसे मामले हैं जो अंतिम स्थिरता की अनुमति नहीं देंगे। सीक्यूआरएस ठीक है लेकिन डेटा 100% सुसंगत होना चाहिए। सीक्यूआरएस अंतिम स्थिरता का संकेत/आवश्यकता नहीं है।

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

3

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

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

ओपी के उदाहरण में, मैं कहूंगा कि हमारे पास एक गैर-स्पष्ट 'लेनदेन' हो सकता है: हमें एक राशि और एक ही राशि के साथ अन्य क्रेडिट के साथ डेबिट किए गए खाते की आवश्यकता है। मुझे लगता है कि सबसे आसान तरीका, इसे एक गाथा के माध्यम से लागू करना है।

डेबिट_एक्कउंट_ए -> खाता_एबेटेड -> क्रेडिट_एसीसीउंट_-> खाता_B_Credited = लेनदेन पूरा हुआ।

यह कुछ सेकंड में कुछ सेकंड में होना चाहिए और यह एक पढ़ा मॉडल अद्यतन करने के लिए पर्याप्त होगा। मनुष्य और ब्राउज़र कुछ सेकंड से धीमे होते हैं। और उपयोगकर्ता F5 को हिट करने या कुछ मिनट/घंटे प्रतीक्षा करने के लिए जानता है। मैं पढ़ने मॉडल सटीकता के बारे में ज्यादा चिंता नहीं करूंगा।

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

0

केवल दो शब्द: "Event Sourcing" आरक्षण पैटर्न के साथ। और शायद, लेकिन हमेशा नहीं, आपको "Sagas" पैटर्न भी चाहिए।

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