কীভাবে সিকিউআরএসে নতুন সমষ্টিগত রুট তৈরি করবেন?


10

কীভাবে আমরা সিকিআরএস আর্কিটেকচারে নতুন সামগ্রিক শিকড় তৈরি করব? এই উদাহরণে আমি নতুন একটি সামগ্রিক রুট AR2 তৈরি করতে চাই যা প্রথম একটি এআর 1 এর রেফারেন্স রাখে।

আমি আরআর 2 পদ্ধতিটি শুরুর পয়েন্ট হিসাবে তৈরি করছি। এখনও অবধি আমি কয়েকটি বিকল্প দেখতে পাচ্ছি:

  1. এআর 1-এর পদ্ধতিটির অভ্যন্তরে createAr2RootOpt1আমি কল করতে পারি এবং ডিপটি new AR2()সংরক্ষণ করতে পারি imed
  2. আমি প্রথম সমষ্টিগত মূলতে ইভেন্ট নির্গত করতে পারতাম। SholdCreateAR2Eventএবং তারপরে স্টেটলেস কাহিনী রয়েছে যা এর উপরে প্রতিক্রিয়া জানায় এবং কমান্ডটি প্রদান করে CreateAR2Commandযা তখন পরিচালিত হয় এবং আসলে এআ 2 তৈরি করে এবং নির্গত হয় AR2CreatedEvent। ইভেন্ট সোর্সিং ব্যবহারের ক্ষেত্রে SholdCreateAR2Eventইভেন্ট স্টোরে সংরক্ষণ করা হবে না, কারণ এটি প্রথম সমষ্টিগত মূলের অবস্থাকে প্রভাবিত করে না। (বা আমাদের কি এখনও ইভেন্ট স্টোরে সংরক্ষণ করা উচিত?)

    class AR1{
        Integer id;
        DomainService ds;
    
        //OPTION 1
        void createAr2RootOpt1(){
            AR2 ar2 = new AR2();
            ds.saveToRepo(ar2);
        }
    
        //OPTION 2
        void createAr2RootOpt2(){
            publishEvent(new SholdCreateAR2Event());    //we don't need this event. Shoud it still be preserved in event store?
        }
    }
    
    class AR2{
        Integer id;
        Integer ar1Id;
    
        void handle(CreateAR2Command command){
            //init this AR with values and save
            publishEvent(AR2CreatedEvent());    //used for projections afterwards and saved inside AR2 event store
        }
    }
    
    class Saga{
        void handle(SholdCreateAR2Event ev){
            emitCommand(new CreateAR2Command());
        }
    }
    

এটি করার আরও সঠিক উপায় কোনটি?

উত্তর:


2

আমি মনে করি যে বিকল্পটি নং। 2 হ'ল সমাধানটি, একটি ছোট কিন্তু গুরুত্বপূর্ণ পরিবর্তন সহ: AR1কোনও ইভেন্টটি নির্গত করা উচিত নয় যাঁর উদ্দেশ্য হ'ল এটি তৈরি AR2করা উচিত, পরিবর্তে এটি একটি AR1WasCreatedইভেন্ট নির্গত করা উচিত । এই ইভেন্টটি ইভেন্ট স্টোরটিতে অবিচলিত হওয়া উচিত, কারণ এটি একটি জন্মসূত্রে চিহ্নিতকরণের একটি গুরুত্বপূর্ণ ইভেন্ট AR1। তারপরে, এক Sagaজন্য whould listent AR1WasCreatedইভেন্ট এবং তৈরি করতে একটি কমান্ডটি উৎপন্ন AR2: CreateAR2Command

নং 1 বিকল্পটি খুব ভুল। আপনার কখনই কোনও এ জাতীয় ডোমেন পরিষেবা ইনজেক্ট করা উচিত নয় AggregateAggregatesখাঁটি হওয়া উচিত, ইভেন্টগুলির প্রজন্মের কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই।

পিএস আমি কখনই নির্মাণকারীর কাছ থেকে ইভেন্টগুলি নির্গত করি না Aggregateকারণ কোনও বস্তুর উদাহরণ (প্রোগ্রামিং ভাষার অর্থে) তৈরি এবং কোনওটির (যদি আপনি চান জন্ম) এর মধ্যে পার্থক্য রয়েছে Aggregate। আমি ইভেন্টগুলি কেবল কোনও handleপদ্ধতি থেকে (যখন পরিচালনা করি command) থেকে নির্গত করি ।


আপনি কি বলতে চাইছেন AR1WasCreated? এটা করা উচিত AR2WasCreated? এছাড়াও, আমি যদি আপনার যুক্তি ব্যবহার করি তবে ঘটনাটি তৈরি AR2WasCreatedহওয়ার আগেই আমি ঘটনাটি ছড়িয়ে দেই ? আরআর 1 এর ইভেন্ট লগের মধ্যে এই ইভেন্টটি সংরক্ষণ করা সমস্যাযুক্ত বলে মনে হচ্ছে, যেহেতু আমার আসলে এআর 1 এর অভ্যন্তরে এই ডেটার দরকার নেই (এটি এআর 1 এর ভিতরে কোনও কিছু সংশোধন করে না)।
বোজন ভুকাসোভিচ

ঠিক আছে, 3 বছর পরে। এটি যায় AR1WasCreated-> সাগা (বিধি রয়েছে যদি এ 1 তৈরি হয় তবে এ 2 তৈরি করুন) -> CreateAR2Command-> AR2WasCreated
বোজন ভুকাসোভিচ

@ বুজনভুকাসোভিচ আমি লিখেছি যে এটি কাজ করেছে বলে আমি আনন্দিত :)
কনস্টান্টিন গালবেনু

2

কীভাবে আমরা সিকিআরএস আর্কিটেকচারে নতুন সামগ্রিক শিকড় তৈরি করব?

সৃষ্টির নিদর্শনগুলি অদ্ভুত

সাধারণ সমস্যা সম্পর্কে বলার জন্য উদি দাহানের কয়েকটি দরকারী জিনিস রয়েছে: সমষ্টিগত শিকড় তৈরি করবেন না । সমষ্টিগত হওয়ার মূল বিষয়টি কোথাও কোথাও থেকে বেরিয়ে আসে না এবং এমন একটি ডোমেন ভাষা রয়েছে যা বর্ণনা করে যে তারা কীভাবে উপস্থিত হয়, যা আপনার ডোমেন মডেলটিতে ক্যাপচার করা উচিত।

যেখানে এটি মোচড়ানোর প্রবণতা হ'ল আপনার ডোমেন মডেলটিতে যে সত্তা কমান্ডটি প্রক্রিয়াকরণ করছে তা লেনদেনের মাধ্যমে সংশোধিত হওয়া সত্তা নয় । এটা ভুল নয়; এটি কেবল অদ্ভুত (সেই ক্ষেত্রেগুলির তুলনায় যেখানে আপনি কোনও সত্তাকে নিজেকে সংশোধন করতে বলেন)।

আপনার দ্বিতীয় পদ্ধতিরও ঠিক আছে। "আমরা যে ডাটাবেসগুলিতে সংরক্ষণ না করেই উত্থাপন করি" সেগুলিকে কখনও কখনও "ডোমেন ইভেন্ট" হিসাবে উল্লেখ করা হয়

মূল ধারণাটি হ'ল, একই লেনদেনের মধ্যেই, কমান্ড হ্যান্ডলার ইভেন্টটি উত্থাপন করে, যা বাসের সাথে একটি ইভেন্ট হ্যান্ডলারের সাথে ভ্রমণ করে যা দ্বিতীয় সমষ্টিটিকে নিজেরাই তৈরি করতে দেয়। আপনি কিছুটা আরও ভাল সংহতি পেতে পারেন, সম্ভবত।

দ্রষ্টব্য: ইভেন্ট উত্সযুক্ত সিস্টেমে আপনি সাধারণত ইভেন্টগুলি এভাবে ব্যবহার করেন না।

ইভেন্ট সোর্সিং ব্যবহারের ক্ষেত্রে shouldCreateAR2Event ইভেন্টের দোকানে সংরক্ষণ করা হবে না, কারণ এটি প্রথম সমষ্টিগত মূলের অবস্থাকে প্রভাবিত করে না।

দ্রষ্টব্য: ইভেন্টের নামগুলি সাধারণত অতীত কাল হয় - shouldCrateAR2 এর ভুল বানান রয়েছে।

হ্যাঁ, আপনি যদি রিমোট কোড চালানোর জন্য কেবল একটি ইভেন্ট সিঙ্ক্রোনাস বাসে ফেলে দিচ্ছেন, তবে আপনার সেই ইভেন্টটি রেকর্ডের বইতে সংরক্ষণ করা উচিত নয়। এটি এই স্কেলটিতে একটি বাস্তবায়ন বিশদ মাত্র।

বা আমাদের এখনও ইভেন্ট স্টোরে সংরক্ষণ করা উচিত?

একই লেনদেনে দুটি পৃথক ইভেন্ট স্ট্রিম পরিবর্তন করা থেকে বিরত থাকুন। যদি এই সৃষ্টিটি এআর 1-তে পরিবর্তনেরও প্রতিনিধিত্ব করে, তবে স্বাভাবিক উত্তরটি হ'ল এই লেনদেনের মধ্যে এআর 1 সংশোধন করা হবে, সেই ইভেন্টগুলিতে একটি অ্যাসিক্রোনাস গ্রাহক থাকবেন যারা এআর 2 তৈরির জন্য আদেশটি সরিয়ে দেওয়ার জন্য দায়বদ্ধ।

আইডেম্পোটেন্ট কমান্ড হ্যান্ডলিং এখানে অনেক সাহায্য করে।


উত্তরের জন্য ধন্যবাদ. আরও একটি জিনিস যা ১০০% পরিষ্কার নয় - পরে যদি আমাকে এআর 1 এর সাথে যুক্তি হিসাবে AR2 ব্যবহার করতে হয় তবে কীভাবে এটি পাস করব - যেহেতু সিকিউআরএস বলে যে এআর কেবল লেখার জন্য অনুসন্ধান করা উচিত নয়। তবে আমার AR1.doSmthn(AR2 param)তৈরি পড়া কোনও প্রডাকশন ব্যবহার করা ছাড়া আমার কাছে অন্য কোনও বিকল্প নেই কারণ আমার প্রয়োজনীয় কোনও সম্পূর্ণ ডেটা নেই (কেবলমাত্র এআর 2 এর সম্পূর্ণ ডেটা রয়েছে)।
বোজন ভুকাশভিক

> "হ্যাঁ, আপনি যদি রিমোট কোড চালানোর জন্য কেবল একটি ইভেন্ট সিঙ্ক্রোনাস বাসে ফেলে দিচ্ছেন, তবে আপনার সেই ইভেন্টটি রেকর্ডের বইতে সংরক্ষণ করা উচিত নয়" " আমি মনে করি এটি সংরক্ষণের সত্যিকারের মূল্য রয়েছে যে আপনি জানেন যে কিছু হওয়ার জন্য প্রক্রিয়াটি শুরু করা হয়েছিল, আপনি এখন বাস্তবে সম্পূর্ণ হওয়া অন্যটিও ট্র্যাক করতে পারেন। তবে আমি অনুমান করি এটি ব্যবহারের ক্ষেত্রে নির্ভর করে
চাওসেকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.