বহু-অঞ্চল লেখা: কমিট আসলে কোথায় পৌঁছায়?
রাউটিং অনুরোধকে একটি অঞ্চলে পৌঁছে দেয়; কেবল একটি লেনদেনের সীমানাই লেখাকে পরমাণবিক করে। ইনভেরিয়েন্টটির নাম দিন, মালিক নির্বাচন করুন, তারপর তার চারপাশে পুনরায় চেষ্টা ডিজাইন করুন।
দুই অঞ্চলে দুটি অ্যাপ্লিকেশন সার্ভার, একটি ক্লায়েন্ট যা VPN-এর মধ্য দিয়ে লেখে, এবং একটি প্রশ্ন যা কেউ লিখে রাখেনি: কোন উপাদান সিদ্ধান্ত নেয় যে লেখাটি ঘটেছে? রাউটিং অনুরোধটিকে একটি প্রক্রিয়ায় পৌঁছে দেয়। একটি লেনদেনের সীমানা ঠিক করে কখন পরিবর্তনটি টেকসই ও দৃশ্যমান হয়। এগুলি ভিন্ন ভিন্ন কাজ যা ভিন্ন ভিন্ন সিস্টেম সম্পাদন করে, এবং তাদের মধ্যবর্তী ফাঁকেই বেশিরভাগ বহু-অঞ্চল লেখার বাগ বাস করে।
মানচিত্র থেকে নয়, ব্যবসায়িক নিয়ম থেকে শুরু করুন
ভূগোল সম্পর্কে নয়, ব্যবসায়িক নিয়ম সম্পর্কে একটি বাক্য দিয়ে শুরু করুন: কোন পড়া ও লেখা একসাথে সফল হতে হবে, এবং কোন সমকালীন পরিবর্তনগুলি তার সময়ে অসম্ভব হতে হবে। ইনভেন্টরি রিজার্ভেশনের জন্য এর অর্থ হল স্টক যাচাই ও রিজার্ভেশন হয় দুটোই কার্যকর হয়, নয়তো কোনোটিই নয়, এবং কোনও দ্বিতীয় অর্ডার তার মাঝে একই একক ব্যবহার করতে পারবে না।
| Requirement | What satisfies it | What does not |
|---|---|---|
| All-or-nothing application | A transaction inside one owning system | A VPN path between regions |
| No double spend | Isolation strong enough to exclude the conflict | Atomicity alone |
| Survive a region loss | Replication the database itself documents | Two independent databases behind one client |
মাঝের সারিটিই দলগুলি এড়িয়ে যায়। পর্যাপ্ত বিচ্ছিন্নতা ছাড়া পরমাণুত্ব দুইটি লেনদেনকে আলাদাভাবে সঠিকভাবে কমিট করতে দেয় এবং তবুও এমন একটি অবস্থা তৈরি করে যা ব্যবসা অসম্ভব মনে করে, এবং কোনও পরিমাণ পুনঃচেষ্টা লজিক পরে তা ঠিক করে না।
একটি কর্তৃত্বপূর্ণ সীমানা দুই আঞ্চলিক সার্ভারের চেয়ে ভালো
আঞ্চলিক অ্যাপ্লিকেশন সার্ভার যেখানে আছে সেখানেই থাকতে পারে, যতক্ষণ তারা অপারেশনটি এমন একটি সেবায় জমা দেয় যা এটি একটি সমর্থিত লেনদেন সীমানার ভিতরে সম্পাদন করে। অ্যাপ্লিকেশন স্তর অভিপ্রায়ের রাউটারে পরিণত হয়; তথ্য স্তর সত্যটির মালিক।
সেই সীমানাটি ছোট রাখুন এবং এটি যে তথ্য স্পর্শ করে তার কাছাকাছি রাখুন। একজন মানুষ প্রম্পটের উত্তর দেওয়ার সময় বা একটি কল দুই অঞ্চল অতিক্রম করার সময় খোলা রাখা লেনদেন তার সময় লক ধরে রাখতে এবং এর পিছনে অন্য কিছু সময় শেষ হওয়ার সম্ভাবনা বাড়াতে ব্যয় করে। সেই ব্যর্থতা একটি ডেটাবেস সমস্যার মতো দেখায় এবং আসলে একটি ডিজাইন সমস্যা যা সেরকম পোশাক পরে আছে। সিদ্ধান্তটি তথ্য স্তরে সরিয়ে নিলে সাধারণত এটি সম্পূর্ণরূপে দূর হয়।
BEGIN;
UPDATE inventory SET reserved = reserved + 1
WHERE sku = 'A-100' AND available >= 1;
INSERT INTO reservation (sku, order_id) VALUES ('A-100', 'ord-9f');
COMMIT;
সেই স্কেচটিকে একটি সীমানা হিসেবে পড়ুন, পারফরম্যান্স সুপারিশ হিসেবে নয়। মূল কথা হল যাচাই ও সন্নিবেশ একটি কমিট ভাগ করে, তাই একটি সমকালীন অর্ডার হয় স্টক ব্যবহৃত দেখে, নয়তো একেবারেই দেখে না।
একটি প্রতিলিপিকৃত ডেটাবেস কী দেয় এবং কী দেয় না
একটি প্রতিলিপিকৃত ডেটাবেস আরও প্রশস্ত সীমানা দিতে পারে যখন তার নিজস্ব লেনদেন মডেল তা সমর্থন করে। Spanner টেবিল জুড়ে একক ডেটাবেসের ভিতরে পরমাণবিক পঠন-লেখন লেনদেন নথিভুক্ত করে, নির্দিষ্ট বিচ্ছিন্নতা ও পুনঃচেষ্টা আচরণসহ। এটি এমন একটি গ্যারান্টি যা আপনি পড়েন, পরীক্ষা করেন এবং সচেতনভাবে নির্ভর করেন।
এটি এমনও একটি গ্যারান্টি যা পণ্য থেকে আসে, পথ থেকে নয়। অঞ্চলগুলির মধ্যে একটি VPN প্যাকেটগুলি কীভাবে ভ্রমণ করে এবং ব্যর্থতাগুলি কীভাবে নিজেদের উপস্থাপন করে তা বদলে দেয়। টানেল যতই সুস্থ দেখাক না কেন, এটি একটি সারি দিয়েও লেনদেনের সীমানা বাড়ায় না। দুটিকে গুলিয়ে ফেললে এমন আর্কিটেকচার তৈরি হয় যেখানে প্রতিটি উপাদান তার নিজস্ব যাচাই পাস করে আর তথ্য তবুও মেলে না।
দুটি ডেটাবেস একটি সিস্টেম হয় না
স্বাধীনভাবে পরিচালিত দুটি ডেটাবেস শেয়ার্ড লেনদেন ম্যানেজার পায় না কারণ ক্লায়েন্টরা দুটিতেই পৌঁছাতে পারে। যদি ব্যবসার সত্যিই জোড়ার মধ্যে পরমাণবিক প্রতিশ্রুতি দরকার হয়, তবে সমন্বয় প্রক্রিয়া, অংশগ্রহণকারী এবং পুনরুদ্ধার প্রক্রিয়া সবকিছুই অনুমান না করে বেছে নিতে ও যোগ্যতা অর্জন করতে হবে।
কাজ প্রস্তুত হওয়ার পরে একজন অংশগ্রহণকারী বা একটি লিঙ্ক অদৃশ্য হওয়ার মুহূর্তটি ভাবুন। একটি সমর্থিত বিতরণকৃত কমিট সন্দেহজনক অবস্থা রেখে যেতে পারে যার জন্য পুনরুদ্ধার পদ্ধতি ও মানুষের সিদ্ধান্ত প্রয়োজন, এবং এটি কোনও প্রতিশ্রুতি দেয় না যে প্রতিটি বিভাজনের মধ্য দিয়ে প্রতিটি অঞ্চল লেখার যোগ্য থাকবে।
যদি পরিবর্তে অ্যাসিঙ্ক্রোনাস সমন্বয় গ্রহণযোগ্য হয়, তবে তা স্পষ্টভাবে বলুন এবং মধ্যবর্তী ব্যবসায়িক অবস্থা ও মিলন নিয়ম লিখে রাখুন। ক্ষতিপূরণসহ স্থানীয়ভাবে কমিট করা ধাপের একটি শৃঙ্খল বৈধ ডিজাইন; এটি কেবল ভিন্ন নামে একটি পরমাণবিক লেনদেন নয়।
প্রথম বিভ্রাটের আগেই পুনঃচেষ্টা ডিজাইন করুন
অপারেশন কমিট হওয়ার পরে ক্লায়েন্ট প্রতিক্রিয়া হারাতে পারে, তাই কলকারী টাইমআউটকে ব্যর্থতা হিসেবে ধরতে পারে না। একটি টেকসই অনুরোধ পরিচয় সংরক্ষণ করুন এবং পরিবর্তন পুনরায় চেষ্টা করার আগে সেবার ফলাফল বা ইডেম্পোটেন্সি প্রক্রিয়া ব্যবহার করুন, নয়তো পুনঃচেষ্টা দ্বিতীয় লেখায় পরিণত হয়।
স্বয়ংক্রিয় লেনদেন কলব্যাক পুনরায় চেষ্টাযোগ্য বাতিলের পরে একাধিকবার চলতে পারে, যা তাদের অপরিবর্তনীয় বাহ্যিক প্রভাবের জন্য খারাপ আবাস করে তোলে। কার্যপ্রবাহ তাদের জন্য স্পষ্ট নিরাপদ প্রোটোকল নির্ধারণ না করলে সেগুলি কলব্যাকের বাইরে রাখুন। একই সতর্কতা টাকা খরচ করে বা বার্তা পাঠায় এমন সবকিছুর ক্ষেত্রে প্রযোজ্য। ডুপ্লিকেট চার্জ ডুপ্লিকেট লগ লাইনের চেয়ে অনেক কঠিন আলোচনা।
গ্রহণযোগ্যতায় চারটি পরিস্থিতি পুনরায় চালানো উচিত: একই সারির জন্য প্রতিযোগিতা করা দুই ক্লায়েন্ট, সেবা যে বাতিলকে পুনরায় চেষ্টাযোগ্য বলে, এমন একটি কমিট যার উত্তর কখনও আসে না, এবং একটি অঞ্চল বা তাদের মধ্যবর্তী লিঙ্কের ক্ষতি। কমিট হওয়া ব্যবসায়িক ফলাফল এবং অমীমাংসিত অবস্থাগুলি রাউটিং ডিজাইনের পাশে লিখে রাখুন, যাতে কেউ নেটওয়ার্ককে গ্যারান্টি প্রদানকারী উপাদান ভুল না করে।