Conflict Resolution ও CRDT: concurrent পরিবর্তন মেলানো
Conflict Resolution and CRDTs
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Concurrent update-এর conflict চেনুন
- Merge rule ও lost update আলাদা করুন
- CRDT-এর উপযোগিতা ও সীমা বুঝুন
সমস্যা দিয়ে শুরু
দুই offline salesperson একই customer-এর phone বদলালেন। Synchronization-এর সময় একটি update নীরবে হারাল। অন্যদিকে দুই warehouse আলাদাভাবে page-view count বাড়িয়েছে; সেখানে দুটির যোগফলই চাই। একই merge policy দুই ধরনের data-তে সঠিক নয়।
সহজ করে বুঝি
Conflict resolution নির্ধারণ করে concurrent পরিবর্তন কীভাবে মিলবে। Last-write-wins সহজ হলেও clock skew ও overwrite-এ তথ্য হারায়। CRDT বিশেষ data structure এবং merge rule ব্যবহার করে concurrent state মিলিয়ে convergence দেয়, নির্দিষ্ট assumptions-এর অধীনে। সব business invariant স্বয়ংক্রিয়ভাবে রক্ষা হয় না।
পরিচিত একটি উপমা
দুটি শাখা আলাদা কাগজে দর্শক গোনে; প্রত্যেক শাখার নিজস্ব সর্বোচ্চ count রেখে পরে যোগ করলে মোট পাওয়া যায়। কিন্তু দুটি কাগজে একই seat বিক্রি হলে যোগফল সঠিক booking হয় না। সংখ্যা merge আর মালিকানা নির্ধারণ ভিন্ন সমস্যা।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart LR A[Node A counter 3] --> M[Merge per node max] B[Node B counter 5] --> M M --> T[Total 8] M --> R[Replicate merged state]
প্রতি node নিজের component বাড়ায়। Merge একই node-এর পুরোনো ও নতুন value থেকে maximum রাখে। আলাদা node-এর component যোগ করলে total হয়। একই snapshot আবার merge করলে total বাড়ে না; retry-তে এই idempotent merge গুরুত্বপূর্ণ।
PHP ও Laravel-এ প্রয়োগ
PHP fragment একটি grow-only counter-এর merge বোঝায়। Node identifier স্থায়ী ও unique হতে হবে, component decrement করা যাবে না। Laravel service-এ save করার সময় concurrent writes atomicভাবে handle করতে হবে; এই array code distributed storage implementation নয়।
function mergeCounter(array $left, array $right): array
{
foreach ($right as $node => $count) {
$left[$node] = max($left[$node] ?? 0, $count);
}
ksort($left);
return $left;
}
$branchA = ['dhaka' => 3];
$branchB = ['chattogram' => 5];
$merged = mergeCounter($branchA, $branchB);
$replayed = mergeCounter($merged, $branchB);
assert(array_sum($merged) === 8);
assert($replayed === $merged);এটি PHP 8.3+ ও Laravel 12-এর শিক্ষামূলক fragment; সম্পূর্ণ application নয়। সংশ্লিষ্ট route-এ authentication ও resource authorization প্রয়োগ করতে হবে। নিচের অনুশীলনে failure ইচ্ছা করে তৈরি করুন; শুধু সফল response দেখে correctness ধরে নেবেন না।
সুবিধা, সীমাবদ্ধতা ও trade-off
CRDT offline collaboration ও eventually merged counter-এ উপকারী। Metadata এবং delete semantics জটিল হতে পারে। Unique username বা stock কখনও শূন্যের নিচে যাবে না—এমন invariant সাধারণ merge দিয়ে আসে না; coordination বা escrow-style allocation লাগতে পারে।
সাধারণ ভুল
- সব concurrent write timestamp দিয়ে overwrite করা।
- G-counter দিয়ে decrement বা arbitrary assignment করা।
- Convergence আছে বলে data business অর্থে সঠিক দাবি করা।
আরও একটু গভীরে
State-based merge সাধারণত associative, commutative ও idempotent হওয়া চাই। Delivery order বা duplicate snapshot-এ ফল একই থাকে। Operation-based variant-এর delivery assumptions আলাদা হতে পারে; “CRDT” নাম দেখে transport requirements বাদ দেওয়া ঠিক নয়।
তিনটি counter snapshot যেকোনো ক্রমে merge করুন, একই snapshot পুনরায় দিন। একই total চাই। এরপর একটি component ছোট করে পাঠান; maximum rule সেটিকে কেন মানে না দেখুন। Reset দরকার হলে নতুন epoch বা আলাদা data model চিন্তা করতে হবে।
মনে রাখুন
- Data type অনুযায়ী merge নির্ধারণ করুন।
- Convergence এবং invariant সমার্থক নয়।
- Duplicate ও reordered delivery দিয়ে পরীক্ষা করুন।
নিজে চেষ্টা করুন
Shopping cart-এর item quantity দুই device-এ বদলালে set-to-three আর increment-by-three কীভাবে আলাদা conflict তৈরি করে লিখুন।
নিজের বোঝা যাচাই করুন
1. সব data CRDT করা যায়?
কিছু operation-এর suitable structure আছে; global uniqueness বা scarce resource constraints-এ coordination প্রয়োজন হতে পারে।
2. Maximum কেন?
একই node-এর পুরোনো snapshot যেন তার পরের increment মুছে না দেয়; grow-only component কখনও কমে না।
3. Duplicate merge কী করে?
Idempotent rule-এ state অপরিবর্তিত রাখে। Sum of snapshots করলে একই count বারবার যোগ হতো।
4. LWW-এর সমস্যা?
Concurrent value হারায় এবং physical clock skew-এ business অনুযায়ী নতুন update হারিয়ে যেতে পারে।
5. G-counter reset কীভাবে?
সরাসরি component কমিয়ে নয়। নতুন generation বা অন্য structure design করতে হয়।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।