যেহেতু আপনি "লিখন" ডাটাবেসের উদ্দেশ্য কী হবে তা আপনি নির্দিষ্ট করেননি, তাই আমি এখানে ধরে নেব যে আপনি যা বোঝাতে চেয়েছেন তা হল: ইভেন্ট স্টোর থেকে সামগ্রিক পুনর্নির্মাণের পরিবর্তে কোনও সমষ্টিতে নতুন আপডেট নিবন্ধ করার সময় আপনি এটি "লিখুন" ডাটাবেস থেকে উত্তোলন করুন, পরিবর্তনটি বৈধ করুন এবং একটি ইভেন্ট জারি করুন।
যদি আপনি যা বোঝাতে চান এটি যদি এই হয়, তবে এই কৌশলটি অসঙ্গতির জন্য একটি শর্ত তৈরি করবে: শেষেরটির "লিখন" ডাটাবেসে তৈরি করার সুযোগ পাওয়ার আগে যদি কোনও নতুন আপডেট ঘটে, তবে নতুন আপডেটটি পুরানো ডেটার বিপরীতে বৈধতা অর্জন করবে, সুতরাং সম্ভাব্যভাবে একটি "অসম্ভব" (অর্থাত "অস্বীকৃত") ইভেন্ট জারি করা এবং সিস্টেমের অবস্থার ক্ষতি করা।
উদাহরণস্বরূপ, থিয়েটারে আসন বুকিংয়ের একটি স্থায়ী উদাহরণ বিবেচনা করুন। ডাবল বুকিং প্রতিরোধের জন্য, আপনাকে নিশ্চিত করতে হবে যে আসনটি বুক করা হচ্ছে তা ইতিমধ্যে নেওয়া হয়নি - এটিই আপনি "বৈধতা" বলছেন। এটি করার জন্য, আপনি "লেখুন" ডাটাবেসটিতে ইতিমধ্যে বুক করা আসনের একটি তালিকা সঞ্চয় করেন। তারপরে, যখন কোনও বুকিংয়ের অনুরোধ আসে, আপনি অনুরোধ করা আসনটি তালিকায় রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং যদি তা না হয় তবে একটি "বুকড" ইভেন্ট জারি করুন, অন্যথায় একটি ত্রুটি বার্তার সাথে প্রতিক্রিয়া জানান। তারপরে আপনি একটি প্রক্ষেপণ প্রক্রিয়া চালান, যেখানে আপনি "বুকড" ইভেন্টগুলি শোনেন এবং বুক করা আসনগুলিকে "লিখন" ডাটাবেসের তালিকায় যুক্ত করুন।
সাধারণত, সিস্টেমটি এইভাবে কাজ করবে:
1. Request to book seat #1
2. Check in the "already booked" list: the list is empty.
3. Issue a "booked seat #1" event.
4. Projection process catches the event, adds seat #1 to the "already booked" list.
5. Another request to book seat #1.
6. Check in the list: the list contains seat #1
7. Respond with an error message.
তবে, কীভাবে অনুরোধগুলি খুব তাড়াতাড়ি উপস্থিত হয়, এবং পদক্ষেপ 4 ধাপের 4 এর আগে ঘটে?
1. Request to book seat #1
2. Check in the "already booked" list: the list is empty.
3. Issue a "booked seat #1" event.
4. Another request to book seat #1.
5. Check in the list: the list is still empty.
6. Issue another "booked seat #1" event.
এখন একই আসন বুকিংয়ের জন্য আপনার দুটি ইভেন্ট রয়েছে। সিস্টেমের অবস্থা দূষিত।
এটি যাতে না ঘটে তার জন্য, আপনাকে কখনই কোনও প্রজেকশনের বিরুদ্ধে আপডেটগুলি বৈধতা দেওয়া উচিত নয়। একটি আপডেট যাচাই করার জন্য, আপনি ইভেন্ট স্টোর থেকে সমষ্টিটি পুনর্নির্মাণ করেন, তারপরে আপডেটটির বিরুদ্ধে বৈধতা দিন। এর পরে, আপনি একটি ইভেন্ট ইস্যু করেন তবে আপনি স্টোর থেকে শেষবার পড়ার পরে কোনও নতুন ইভেন্ট জারি করা হয়নি তা নিশ্চিত করার জন্য টাইমস্ট্যাম্প গার্ড ব্যবহার করুন। যদি এটি ব্যর্থ হয়, আপনি কেবল আবার চেষ্টা করুন।
ইভেন্ট স্টোর থেকে সামগ্রিক পুনর্নির্মাণে পারফরম্যান্স পেনাল্টি বহন করতে পারে। এটি হ্রাস করতে, আপনি সরাসরি ইভেন্ট স্ট্রিমে স্ন্যাপশট তৈরি করা হয়েছিল তার আইডি সহ ট্যাগ করে মোট স্ন্যাপশট সংরক্ষণ করতে পারেন। এইভাবে, আপনি সাম্প্রতিক সময়ের স্রোত থেকে পুরো ইভেন্টের স্ট্রিমকে সর্বদা পুনরায় খেলানোর বিরোধী হিসাবে সর্বাধিক সাম্প্রতিক স্ন্যাপশট লোড করে এবং তার পরে আসা কেবলমাত্র ইভেন্টগুলি পুনরায় প্লে করে সামগ্রিক পুনর্নির্মাণ করতে পারেন।