C++ में CQRS और Event Sourcing: जटिल प्रणालियों के लिए आर्किटेक्चर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जब सामान्य CRUD काम करना बंद कर देता है: C++ में CQRS और Event Sourcing से परिचित हों

\n\n

क्या आपने कभी ऐसी स्थिति का सामना किया है जब आपका C++ प्रोग्राम, जो टेस्ट डेटा पर पूरी तरह से काम कर रहा था, production में 'धीमा' होने लगता है? या जब बिज़नेस विश्लेषक परिवर्तनों का इतिहास दिखाने के लिए कहते हैं, और आपके पास केवल अंतिम स्थिति होती है? परिचित लगता है? तो CQRS (Command Query Responsibility Segregation) और Event Sourcing की दुनिया में आपका स्वागत है।

\n\n

ये दो पैटर्न माइक्रोसर्विसेज की दुनिया के केवल फैशनेबल शब्द नहीं हैं। ये शक्तिशाली उपकरण हैं जो आपको स्केलेबल, ऑडिटेबल और लचीली प्रणालियाँ बनाने की अनुमति देते हैं। और हाँ, ये C++ पर पूरी तरह से फिट बैठते हैं - एक ऐसी भाषा जहाँ प्रदर्शन और मेमोरी पर नियंत्रण महत्वपूर्ण है।

\n\n

इस लेख में हम उबाऊ व्याख्यान नहीं पढ़ेंगे। हम देखेंगे कि फ्रेमवर्क के जादू के बिना, वास्तविक उदाहरणों और उपयोग के लिए तैयार टेम्पलेट्स के साथ, शुद्ध C++ पर CQRS और Event Sourcing को कैसे लागू किया जाए।

\n\n

CQRS: पढ़ने और लिखने को अलग करना

\n\n

क्लासिकल CRUD (Create, Read, Update, Delete) आर्किटेक्चर में, हम पढ़ने और लिखने दोनों के लिए एक ही मॉडल का उपयोग करते हैं। यह तब तक सुविधाजनक है जब तक सिस्टम बढ़ना शुरू नहीं होता। समस्याएँ तब उत्पन्न होती हैं जब:

\n\n
    \n
  • मेमोरी में ऑब्जेक्ट पढ़ने के लिए तेज़ी से सीरियलाइज़ होने में बहुत जटिल होता है।
  • \n
  • लिखने की बिज़नेस लॉजिक को वैलिडेशन की आवश्यकता होती है जो पढ़ने को धीमा कर देती है।
  • \n
  • सिस्टम के विभिन्न भाग समान डेटा को अलग-अलग तरीके से देखना चाहते हैं।
  • \n
\n\n

CQRS एक सरल लेकिन शानदार समाधान प्रस्तावित करता है: मॉडल को दो भागों में विभाजित करें - स्थिति बदलने के लिए Command (कमांड) और पढ़ने के लिए Query (क्वेरी)। वे अलग-अलग स्टोरेज, अलग-अलग डेटा संरचनाओं का उपयोग कर सकते हैं और यहाँ तक कि अलग-अलग मशीनों पर भी लागू किए जा सकते हैं।

\n\n

C++ पर CQRS का बुनियादी कार्यान्वयन

\n\n

चलिए सरल शुरुआत करते हैं। कल्पना करें कि हम एक ऑर्डर प्रबंधन प्रणाली लिख रहे हैं। सब कुछ एक ही Order क्लास में संग्रहीत करने के बजाय, हम जिम्मेदारियों को अलग करेंगे।

\n\n

पहले कमांड और क्वेरी के लिए इंटरफेस परिभाषित करें:

\n\n
#include <memory>\n#include <vector>\n#include <string>\n\n// सभी कमांड के लिए बेस क्लास\nclass Command {\npublic:\n    virtual ~Command() = default;\n    virtual void execute() = 0;\n};\n\n// सभी क्वेरी के लिए बेस क्लास\ntemplate <typename TResult>\nclass Query {\npublic:\n    virtual ~Query() = default;\n    virtual TResult execute() = 0;\n};
\n\n

अब ऑर्डर में आइटम जोड़ने के लिए एक विशिष्ट कमांड बनाएँ:

\n\n
class AddItemCommand : public Command {\nprivate:\n    std::string orderId_;\n    std::string productId_;\n    int quantity_;\n    // रिपॉजिटरी (या कमांड बस) का संदर्भ\n    OrderRepository& repository_;\n\npublic:\n    AddItemCommand(const std::string& orderId,\n                   const std::string& productId,\n                   int quantity,\n                   OrderRepository& repo)\n        : orderId_(orderId), productId_(productId),\n          quantity_(quantity), repository_(repo) {}\n\n    void execute() override {\n        // बिज़नेस लॉजिक: जाँचें कि स्टॉक में उत्पाद है या नहीं\n        if (quantity_ <= 0) {\n            throw std::invalid_argument("मात्रा सकारात्मक होनी चाहिए");\n        }\n        // डोमेन सेवा या एग्रीगेट को कॉल करें\n        auto& order = repository_.getById(orderId_);\n        order.addItem(productId_, quantity_);\n        repository_.save(order);\n    }\n};
\n\n

और इस तरह ऑर्डर सारांश प्राप्त करने के लिए क्वेरी दिखती है:

\n\n
class OrderSummaryQuery : public Query<OrderSummary> {\nprivate:\n    std::string orderId_;\n    ReadModelDatabase& db_;\n\npublic:\n    OrderSummaryQuery(const std::string& orderId, ReadModelDatabase& db)\n        : orderId_(orderId), db_(db) {}\n\n    OrderSummary execute() override {\n        // पढ़ने के लिए अनुकूलित DB से पढ़ें\n        return db_.getOrderSummary(ord                

ब्लॉग

पुस्तक अनुशंसाएँ