ES / CQRS একত্রে সামলানো


20

আমি সম্প্রতি সিকিউআরএস / ইএস-তে ডুব দেওয়া শুরু করেছি কারণ আমার এটি কর্মক্ষেত্রে প্রয়োগ করার প্রয়োজন হতে পারে। এটি আমাদের ক্ষেত্রে খুব প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে, কারণ এটি অনেক সমস্যার সমাধান করবে।

কোনও ইএস / সিকিউআরএস অ্যাপ্লিকেশনটিকে সরলকরণযোগ্য ব্যাঙ্কিং ব্যবহারের ক্ষেত্রে (অর্থ উত্তোলন) কীভাবে প্রাসঙ্গিক বলে মনে করা উচিত সে সম্পর্কে আমি আমার মোটামুটি বোঝার স্কেচ করেছি।

ইএস / সিকিউআরএস

সংক্ষেপে বলতে গেলে, ব্যক্তি এ যদি কিছু অর্থ প্রত্যাহার করে:

  • একটি আদেশ জারি করা হয়েছে
  • কমান্ড বৈধতা / যাচাইয়ের জন্য হস্তান্তর করা হয়েছে
  • যদি বৈধতা সফল হয় তবে একটি ইভেন্ট একটি ইভেন্ট স্টোরের দিকে ঠেলে দেওয়া হয়
  • সমষ্টিতে সংশোধনগুলি প্রয়োগ করার জন্য একজন অগ্রিগেটর ইভেন্টটিকে প্রাপ্য করে

আমি যা বুঝতে পেরেছি তা থেকে ইভেন্ট লগই সত্যের উত্স, কারণ এটি ফ্যাক্টসের লগ, আমরা এরপরে যেকোন প্রক্ষেপণ পেতে পারি।


এখন, আমি যা বুঝতে পারি না, এই দুর্দান্ত পরিকল্পনায় এই ক্ষেত্রে যা ঘটে তা হ'ল:

  • নিয়ম: ভারসাম্য নেতিবাচক হতে পারে না
  • ব্যক্তি এ এর ​​100e ভারসাম্য রয়েছে
  • ব্যক্তি এ 100e এর একটি প্রত্যাহার কম্যান্ড জারি করে
  • বৈধতা পাস এবং 100e ইভেন্টের মানিথড্রু এভেন্ট নির্গত হয়
  • এরই মধ্যে, ব্যক্তি এ 100e এর আরেকটি প্রত্যাহার-কম্যান্ড জারি করে
  • প্রথম মানি উইথড্রইউভেন্ট এখনও একীভূত হয়নি তাই বৈধতা পাস করে, কারণ সমষ্টিটির বিরুদ্ধে বৈধতা যাচাই (এটি এখনও আপডেট হয়নি)
  • 100e এর MoneyWithdrewEvent অন্য সময় নির্গত হয়

==> আমরা ভারসাম্য -100e তে অসামঞ্জস্য অবস্থায় রয়েছি এবং লগটিতে 2 মানি উইথড্রু ইভেন্ট থাকে

আমি বুঝতে পারছি এই সমস্যাটি মোকাবেলার জন্য বেশ কয়েকটি কৌশল রয়েছে:

  • ক) ইভেন্ট স্টোরের সাথে ইভেন্টের সাথে সামগ্রিক সংস্করণ আইডি রাখুন যাতে কোনও সংশোধন করার পরে কোনও সংস্করণ অমিল থাকে, কিছুই ঘটে না
  • খ) কিছু লক করার কৌশল ব্যবহার করুন, যা বোঝায় যে যাচাইকরণ স্তরটি কোনওভাবে তৈরি করতে হবে

কৌশল সম্পর্কিত প্রশ্নসমূহ:

  • ক) এই ক্ষেত্রে, ইভেন্ট লগ আর সত্যের উত্স নয়, কীভাবে এটি মোকাবেলা করতে হবে? এছাড়াও, আমরা ক্লায়েন্টের কাছে ফিরে এসেছি ঠিক আছে যেখানে প্রত্যাহারের অনুমতি দেওয়া সম্পূর্ণ ভুল ছিল, লকগুলি ব্যবহার করা কি এই ক্ষেত্রে ভাল?
  • খ) তালা == ডেডলকস, আপনার কি সেরা অনুশীলন সম্পর্কে কোনও অন্তর্দৃষ্টি আছে?

সামগ্রিকভাবে, কীভাবে সামঞ্জস্য পরিচালনা করবেন তা সম্পর্কে আমার বোঝার সঠিক?

দ্রষ্টব্য: আমি বুঝতে পারি যে একই ব্যক্তি এত অল্প সময়ের উইন্ডোয় দু'বার অর্থ উত্তোলন করা অসম্ভব তবে আমি একটি সাধারণ উদাহরণ নিয়েছি, বিশদে না যাওয়ার জন্য


পদক্ষেপ until পর্যন্ত অপেক্ষা না করে কেন চতুর্থ ধাপে সমষ্টি আপডেট করবেন?
এরিক tদ

সুতরাং আপনি বোঝাতে চেয়েছেন যে এই ক্ষেত্রে, ইভেন্ট স্টোরটি কেবলমাত্র একটি লগ যা কেবলমাত্র অন্যান্য / অন্যান্য অনুমানগুলি পুনরায় তৈরি করার জন্য অ্যাপ্লিকেশন শুরু করার পরে পড়ে?
লুই এফ

উত্তর:


19

কোনও ইএস / সিকিউআরএস অ্যাপ্লিকেশনটিকে সরলকরণযোগ্য ব্যাঙ্কিং ব্যবহারের ক্ষেত্রে (অর্থ উত্তোলন) কীভাবে প্রাসঙ্গিক বলে মনে করা উচিত সে সম্পর্কে আমি আমার মোটামুটি বোঝার স্কেচ করেছি।

এটি ইভেন্টের উত্সাহিত অ্যাপ্লিকেশনটির নিখুঁত উদাহরণ। চল শুরু করি.

প্রতিবার কোনও কমান্ড প্রক্রিয়া করা হয় বা পুনরায় চেষ্টা করা হয় (আপনি বুঝতে পারবেন, ধৈর্য ধরুন) নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করা হয়:

  1. কমান্ডটি একটি কমান্ড হ্যান্ডলারের কাছে পৌঁছেছে, অর্থাত্ একটি পরিষেবা Application layer
  2. কমান্ড হ্যান্ডলার শনাক্ত Aggregateএবং এটি লোড সংগ্রহস্থল থেকে (এই ক্ষেত্রে লোড করে সঞ্চালিত হয় newএকটি -ing Aggregateউদাহরণস্বরূপ, এই সমষ্টিগত এবং সব পূর্বে নির্গত ঘটনা আনার সময় তাদের মোট নিজেই পুনরায় আবেদন; মোট সংস্করণের জন্য সংরক্ষিত হয় পরে ব্যবহার করুন; ইভেন্টগুলি প্রয়োগ করার পরে সমষ্টিটি তার চূড়ান্ত অবস্থায় রয়েছে - যেমন বর্তমান অ্যাকাউন্টের ভারসাম্য একটি সংখ্যা হিসাবে গণনা করা হয়)
  3. কমান্ড হ্যান্ডলার যথাযথ পদ্ধতিটি কল করে , যেমন উত্পন্ন ইভেন্টগুলি Aggregateপছন্দ করে Account::withdrawMoney(100)এবং সংগ্রহ করে MoneyWithdrewEvent(AccountId, 100); যদি অ্যাকাউন্টে পর্যাপ্ত পরিমাণ অর্থ না থাকে (ব্যালেন্স <100) তবে একটি ব্যতিক্রম উত্থাপিত হয় এবং সমস্ত বাতিল হয়ে যায়; অন্যথায়, পরবর্তী পদক্ষেপটি সম্পাদিত হয়।
  4. কমান্ড হ্যান্ডলারটি সংরক্ষণাগারটিতে অবিচল থাকার চেষ্টা করে Aggregate(এই ক্ষেত্রে रिपোজিটরিটি হ'ল Event Store); এটি নতুন ইভেন্ট সংযোজন করে তা করতে Event streamযদি এবং কেবল যদি versionএর Aggregateএখনও এক ছিল যখন Aggregateলোড করা হয়। যদি সংস্করণটি একই না হয়, তবে কমান্ডটি আবার চেষ্টা করা হয়েছে - পদক্ষেপ 1 এ যান । যদি versionএকইরকম হয়, তবে ইভেন্টগুলি সংযুক্ত করা হয় Event streamএবং ক্লায়েন্টকে Successস্ট্যাটাস সরবরাহ করা হয়।

এই সংস্করণ চেকিংকে আশাবাদী লকিং বলা হয় এবং এটি একটি সাধারণ লকিং প্রক্রিয়া। বর্তমানের লেখাটি সম্পূর্ণ না হওয়া পর্যন্ত অন্য লেখাগুলি অবরুদ্ধ হয়ে থাকলে (যেমন শুরু হয়নি) অন্য একটি প্রক্রিয়া হতাশাবাদী লক করা

শব্দটি Event streamহ'ল সমষ্টি দ্বারা নির্গত সমস্ত ইভেন্টের কাছাকাছি বিমূর্ততা।

আপনার বুঝতে হবে যে এটি Event storeকেবলমাত্র অন্যরকম এক ধরণের দৃistence়তা যেখানে চূড়ান্ত অবস্থার পরিবর্তে সমস্ত পরিবর্তনগুলি একটি সমষ্টিতে সঞ্চিত থাকে।

ক) এই ক্ষেত্রে, ইভেন্ট লগ আর সত্যের উত্স নয়, কীভাবে এটি মোকাবেলা করতে হবে? এছাড়াও, আমরা ক্লায়েন্টের কাছে ফিরে এসেছি ঠিক আছে যেখানে প্রত্যাহারের অনুমতি দেওয়া সম্পূর্ণ ভুল ছিল, লকগুলি ব্যবহার করা কি এই ক্ষেত্রে ভাল?

ইভেন্টের দোকানটি সর্বদা সত্যের উত্স।

খ) তালা == ডেডলকস, আপনার কি সেরা অনুশীলন সম্পর্কে কোনও অন্তর্দৃষ্টি আছে?

আশাবাদী লক ব্যবহার করে আপনার কোনও লক নেই, কেবল পুনরায় চেষ্টা করার আদেশ দিন।

যাইহোক, লক! = ডেডলকস


2
লোড সংক্রান্ত কিছু অপ্টিমাইজেশন রয়েছে Aggregateযেখানে আপনি সমস্ত ইভেন্ট প্রয়োগ করেন না তবে আপনি Aggregateঅতীতে একটি স্ন্যাপশট রেখেছেন এবং কেবলমাত্র সেই পয়েন্টের পরে ঘটে যাওয়া ইভেন্টগুলি প্রয়োগ করেন।
কনস্টান্টিন গালবেনু

ঠিক আছে আমি মনে করি আমার বিভ্রান্তি ঘটেছে যে ইভেন্ট স্টোর == ইভেন্ট বাসের (আমার মনে আছে কাফকা) তাই সামগ্রিক পুনর্নির্মাণ ব্যয়বহুল হতে পারে কারণ আপনাকে প্রচুর ইভেন্টগুলি পুনরায় পড়ার প্রয়োজন হতে পারে। এর একটি স্ন্যাপশট থাকার ক্ষেত্রে, Aggregateস্ন্যাপশটটি কখন আপডেট করা উচিত? স্ন্যাপশট স্টোরটি কি ইভেন্টের স্টোরের মতো বা এটি ইভেন্ট বাস থেকে প্রাপ্ত কোনও বস্তুগত দৃশ্য?
লুই এফ।

স্ন্যাপশট তৈরি সম্পর্কে কিছু কৌশল রয়েছে। একটি হ'ল প্রতিটি এন ইভেন্টে স্ন্যাপশট তৈরি করা। ইভেন্টগুলির পাশাপাশি স্ন্যাপশট একই জায়গায় / দৃ pers়তা / ডাটাবেসগুলিতে একই প্রতিশ্রুতিতে সঞ্চয় করা উচিত। ধারণাটি হ'ল স্ন্যাপশটটি দৃg়ভাবে সমষ্টিগত সংস্করণের সাথে সম্পর্কিত।
কনস্টান্টিন গালবেনু

ঠিক আছে, আমি মনে করি এটি কীভাবে পরিচালনা করতে হবে সে সম্পর্কে আমার একটি পরিষ্কার দৃষ্টি রয়েছে। এখন শেষ প্রশ্ন, শেষ পর্যন্ত ইভেন্ট বাসের ভূমিকা কী? সমষ্টিগুলি যদি একযোগে আপডেট হয়?
লুই এফ।

1
হ্যাঁ, আপনি একটি খরগোশ এমকিউ বা যে কোনও চ্যানেল ইভেন্টগুলি পড়ার মডেলগুলিকে সংবিধানে পাঠাতে চান তা ব্যবহার করতে পারেন তবে ইভেন্ট ইভেন্টে চালিয়ে যাওয়ার পরে কেবল only প্রকৃতপক্ষে, কোনও ইভেন্টের বৈধতা অব্যাহত থাকার পরে তা করা হয় না: ঘটনাগুলি ঘটনার সত্য উপস্থাপন করে; একটি পঠিত মডেল কিছু ঘটেছে বা পছন্দ করতে পারে না তবে এটি ইতিহাস পরিবর্তন করতে পারে না।
কনস্টান্টিন গালবেনু

1

কোনও ইএস / সিকিউআরএস অ্যাপ্লিকেশনটিকে সরলকরণযোগ্য ব্যাঙ্কিং ব্যবহারের ক্ষেত্রে (অর্থ উত্তোলন) কীভাবে প্রাসঙ্গিক বলে মনে করা উচিত সে সম্পর্কে আমি আমার মোটামুটি বোঝার স্কেচ করেছি।

বন্ধ করুন। সমস্যাটি হ'ল আপনার "সমষ্টি" আপডেট করার যুক্তিটি একটি অদ্ভুত স্থানে।

আরও সাধারণ বাস্তবায়ন হ'ল আপনার কমান্ড হ্যান্ডলার যে ডেটা মডেলটিকে স্মৃতিতে রাখে এবং ইভেন্ট স্টোরের ইভেন্টগুলির প্রবাহটি সিঙ্ক্রোনাইজ করা হয়।

বর্ণনা করার একটি সহজ উদাহরণটি হ'ল কমান্ড হ্যান্ডলার ইভেন্ট ইভেন্টটিতে সিঙ্ক্রোনাস লিখন তৈরি করে এবং ইভেন্ট স্টোরের সাথে সংযোগটি নির্দেশ করে যে লিখনটি সফল হয়েছে সেটিকে মডেলটির স্থানীয় কপি আপডেট করে।

কমান্ড হ্যান্ডলারের যদি ইভেন্ট স্টোরটির সাথে পুনরায় সংশ্লেষ করা দরকার (কারণ এর অভ্যন্তরীণ মডেলটি দোকানের সাথে মেলে না), এটি স্টোর থেকে ইতিহাস লোড করে এবং নিজস্ব অভ্যন্তরীণ অবস্থার পুনর্নির্মাণের মাধ্যমে এটি করে।

অন্য কথায়, তীর 2 এবং 3 (যদি উপস্থিত থাকে) সাধারণত ইভেন্ট স্টোরের সাথে সংযুক্ত থাকে, সামগ্রিক স্টোরের সাথে নয়।

ইভেন্ট স্টোরটিতে ইভেন্টের সাথে সামগ্রিক সংস্করণ আইডি রাখুন যাতে যদি কোনও সংস্করণ সংশোধন করার সাথে মিল না থাকে তবে কিছুই ঘটে না

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


হুম আমি মনে করি আমি তখন ইভেন্ট স্টোরের উপাদানটি ভুল বুঝি। আমি ভেবেছিলাম যে সবকিছুই এর মধ্য দিয়ে যেতে হবে এবং স্ট্রিম হবে। আমার ইভেন্ট স্টোরটি যদি কাফকা হয় এবং কেবল পঠনযোগ্য হয়? আমি আবার সমস্ত বার্তাগুলি দিয়ে যাওয়ার জন্য 2 এবং 3 পদক্ষেপের সামর্থ্য রাখি না। দেখে মনে হচ্ছে সামগ্রিকভাবে আমার দৃষ্টিভঙ্গি এটির সাথে মিলেছে: মাঝারি.com
লুই এফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.