जहां तक मैं समझता हूं, CQRS के पीछे का बड़ा विचार कमांड और क्वेरी को संभालने के लिए 2 अलग-अलग डेटा मॉडल हैं। इन्हें "राइट मॉडल" और "रीड मॉडल" कहा जाता है।
आइए ट्विटर एप्लिकेशन क्लोन के एक उदाहरण पर विचार करें। यहाँ आदेश हैं:
- उपयोगकर्ता खुद को पंजीकृत कर सकते हैं।
CreateUserCommand(string username)
का उत्सर्जन करता हैUserCreatedEvent
- उपयोगकर्ता अन्य उपयोगकर्ताओं का अनुसरण कर सकते हैं।
FollowUserCommand(int userAId, int userBId)
का उत्सर्जन करता हैUserFollowedEvent
- उपयोगकर्ता पोस्ट बना सकते हैं।
CreatePostCommand(int userId, string text)
का उत्सर्जन करता हैPostCreatedEvent
जब मैं ऊपर "ईवेंट" शब्द का उपयोग करता हूं, तो मेरा मतलब 'ईवेंट सोर्सिंग' ईवेंट नहीं है। मैं सिर्फ संकेतों का मतलब है कि ट्रिगर मॉडल अद्यतन पढ़ें। मेरे पास इवेंट स्टोर नहीं है और अब तक मैं खुद CQRS पर ध्यान केंद्रित करना चाहता हूं।
और यहाँ प्रश्न हैं:
- एक उपयोगकर्ता को अपने पदों की सूची देखने की जरूरत है।
GetPostsQuery(int userId)
- एक उपयोगकर्ता को अपने अनुयायियों की सूची देखने की आवश्यकता है।
GetFollowersQuery(int userId)
- एक उपयोगकर्ता को उन उपयोगकर्ताओं की सूची देखने की जरूरत है, जो इस प्रकार हैं।
GetFollowedUsersQuery(int userId)
- एक उपयोगकर्ता को "मित्र फ़ीड" देखने की जरूरत है - उनके सभी दोस्तों की गतिविधियों का एक लॉग ("आपका दोस्त जॉन ने एक नया पोस्ट बनाया है")।
GetFriedFeedRecordsQuery(int userId)
संभालने के लिए CreateUserCommand
मुझे यह जानना होगा कि क्या ऐसा उपयोगकर्ता पहले से मौजूद है। इसलिए, इस बिंदु पर मुझे पता है कि मेरे लेखन मॉडल में सभी उपयोगकर्ताओं की एक सूची होनी चाहिए।
संभालने के लिए FollowUserCommand
मुझे यह जानना होगा कि userA पहले से ही userB का अनुसरण करता है या नहीं। इस बिंदु पर मैं चाहता हूं कि मेरा लेखन मॉडल सभी उपयोगकर्ता-प्रकार-उपयोगकर्ता कनेक्शनों की एक सूची हो।
और अंत में, CreatePostCommand
मुझे यह सोचने के लिए कि मुझे कुछ और चाहिए, क्योंकि मेरे पास आज्ञा नहीं है UpdatePostCommand
। यदि मेरे पास वे हैं, तो मुझे यह सुनिश्चित करने की आवश्यकता होगी कि पोस्ट मौजूद है, इसलिए मुझे सभी पदों की सूची की आवश्यकता होगी। लेकिन क्योंकि मुझे इसकी आवश्यकता नहीं है, इसलिए मुझे सभी पदों को ट्रैक करने की आवश्यकता नहीं है।
प्रश्न # 1 : क्या वास्तव में "राइट मॉडल" शब्द का उपयोग करना सही है, जिस तरह से वे इसका उपयोग करते हैं? या ES के मामले में "इवेंट मॉडल" हमेशा "इवेंट स्टोर" के लिए खड़ा है? यदि हां, तो क्या मुझे कमांड को संभालने के लिए आवश्यक डेटा और प्रश्नों को संभालने के लिए आवश्यक डेटा के बीच किसी प्रकार का अलगाव है?
संभालने के लिए GetPostsQuery
, मुझे सभी पदों की सूची की आवश्यकता होगी। इसका मतलब है कि मेरे रीड मॉडल में सभी पदों की एक सूची होनी चाहिए। मैं इस मॉडल को सुनकर बनाए रखने जा रहा हूं PostCreatedEvent
।
दोनों को संभालने के लिए GetFollowersQuery
और GetFollowedUsersQuery
, मुझे उपयोगकर्ताओं के बीच सभी कनेक्शनों की एक सूची की आवश्यकता होगी। इस मॉडल को बनाए रखने के लिए मैं सुनने जा रहा हूं UserFollowedEvent
। यहाँ एक प्रश्न # 2 है : क्या यह व्यावहारिक रूप से ठीक है अगर मैं राइट मॉडल की सूची का उपयोग यहां करता हूं? या क्या मुझे एक अलग रीड मॉडल बनाना चाहिए, क्योंकि भविष्य में मुझे लिखने के मॉडल की तुलना में अधिक विवरण की आवश्यकता हो सकती है?
अंत में, GetFriendFeedRecordsQuery
मुझे संभालने की आवश्यकता होगी:
- सुनना
UserFollowedEvent
- सुनना
PostCreatedEvent
- जानिए कौन से यूजर्स कौन से दूसरे यूजर्स को फॉलो करते हैं
यदि उपयोगकर्ता A उपयोगकर्ता B का अनुसरण करता है और उपयोगकर्ता B उपयोगकर्ता C का अनुसरण करना शुरू करता है, तो निम्नलिखित रिकॉर्ड दिखाई देने चाहिए:
- उपयोगकर्ता A के लिए: "आप मित्र उपयोगकर्ता B ने अभी उपयोगकर्ता C का अनुसरण करना शुरू किया है"
- उपयोगकर्ता B के लिए: "आपने अभी उपयोगकर्ता C का अनुसरण करना शुरू किया है"
- उपयोगकर्ता C के लिए: "उपयोगकर्ता B अब आपका अनुसरण कर रहा है"
यहां प्रश्न # 3 है : कनेक्शन की सूची प्राप्त करने के लिए मुझे किस मॉडल का उपयोग करना चाहिए? क्या मुझे लेखन मॉडल का उपयोग करना चाहिए? क्या मुझे रीड मॉडल - GetFollowersQuery
/ का उपयोग करना चाहिए GetFollowedUsersQuery
? या क्या मुझे GetFriendFeedRecordsQuery
अपने आप को मॉडल बनाना चाहिए UserFollowedEvent
और सभी कनेक्शनों की अपनी सूची को बनाए रखना चाहिए ?