Physical ও Logical Clock: সময় ও ঘটনার ক্রম
Physical and Logical Clocks
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Wall clock ও elapsed time আলাদা করুন
- Logical order থেকে causal সম্পর্ক বুঝুন
- ঘড়ি দিয়ে conflict মেটানোর সীমা জানুন
সমস্যা দিয়ে শুরু
ঢাকার warehouse থেকে stock update এবং অন্য region থেকে cancellation এল। দুই server-এর ঘড়িতে কয়েক সেকেন্ড পার্থক্য। Timestamp সাজিয়ে processing করলে cancellation আগে দেখা যাচ্ছে, যদিও সেটি order তৈরির পর হয়েছে। শুধু তারিখ দেখে business history ঠিক করা যাচ্ছে না।
সহজ করে বুঝি
Physical clock মানুষের তারিখ জানায়, কিন্তু synchronization নিখুঁত নয় এবং clock correction হতে পারে। Monotonic clock সময়ের ব্যবধান মাপতে ভালো। Lamport clock প্রতিটি local event-এ counter বাড়ায়; received counter দেখলে maximum নিয়ে আবার বাড়ায়। যদি একটি ঘটনা অন্যটির কারণ হয়, আগের logical timestamp ছোট হবে; উল্টো বক্তব্য সত্য নয়।
পরিচিত একটি উপমা
ডায়েরির সময় ভুল থাকলেও চিঠির উত্তরে মূল চিঠির নম্বর থাকলে কোনটি আগে বোঝা যায়। Logical counter সেই সম্পর্ক ধরে, প্রকৃত মিনিট নয়। একই নম্বরের কাছাকাছি দুটি স্বাধীন চিঠি আসলে তাদের মধ্যে কারণের সম্পর্ক প্রমাণ হয় না।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
sequenceDiagram participant A as Order Service participant B as Warehouse A->>A: Local event L=4 A->>B: Reserve with L=4 B->>B: max(2,4)+1 = 5 B-->>A: Reserved with L=5 A->>A: Receive L=6
Order service local event-এ counter বাড়ায়। Message counter বহন করে। Warehouse নিজের counter ও received value-এর বড়টি নিয়ে এক যোগ করে। Reply ফিরে এলে order service-ও একই নিয়ম মানে। Diagram-এর সংখ্যা seconds নয়; causal ordering-এর চিহ্ন।
PHP ও Laravel-এ প্রয়োগ
নিচের PHP class Lamport clock-এর শিক্ষামূলক in-memory implementation। Laravel singleton করলেই cluster-wide clock হয় না; process restart ও একাধিক worker-এর state-এর জন্য আলাদা design লাগে। Duration মাপার জন্য PHP hrtime ব্যবহার দেখানো হয়েছে।
final class LogicalClock
{
public function __construct(private int $value = 0) {}
public function tick(): int
{
return ++$this->value;
}
public function receive(int $remote): int
{
$this->value = max($this->value, $remote) + 1;
return $this->value;
}
}
$clock = new LogicalClock(2);
$received = $clock->receive(4);
$started = hrtime(true);
// Execute the operation whose duration matters.
$elapsedMilliseconds = (hrtime(true) - $started) / 1_000_000;এটি PHP 8.3+ ও Laravel 12-এর শিক্ষামূলক fragment; সম্পূর্ণ application নয়। সংশ্লিষ্ট route-এ authentication ও resource authorization প্রয়োগ করতে হবে। নিচের অনুশীলনে failure ইচ্ছা করে তৈরি করুন; শুধু সফল response দেখে correctness ধরে নেবেন না।
সুবিধা, সীমাবদ্ধতা ও trade-off
Lamport counter ছোট ও সহজ, কিন্তু concurrent event চেনায় না। Vector clock বেশি causal তথ্য ধরে, তবে participant বাড়লে metadata বাড়ে। User-facing audit-এ wall time উপকারী; correctness-এর জন্য aggregate version বা database serialization বেশি সরল হতে পারে।
সাধারণ ভুল
- Timestamp বড় মানেই business event পরে ঘটেছে ভাবা।
- Elapsed time wall clock subtraction দিয়ে মাপা।
- Logical timestamp সমান হলে event একই ধরে নেওয়া।
আরও একটু গভীরে
Total ordering চাইলে logical counter-এর সঙ্গে stable node identifier tie-breaker করা যায়; সেটি বাস্তব causal সম্পর্ক যোগ করে না। Last-write-wins-এ clock skew গুরুত্বপূর্ণ update হারাতে পারে। Financial ledger-এ append-only sequence ও database constraints সাধারণত বেশি উপযুক্ত।
এক server-এর wall time সামনে সরিয়ে দুই concurrent address update পাঠান। Timestamp policy কোনটি হারায় লিখুন। এরপর expected version যোগ করে conflict ফেরত দিন। ব্যবহারকারীকে merge বেছে নেওয়ার সুযোগ দিলে silent overwrite-এর বদলে দৃশ্যমান সিদ্ধান্ত পাওয়া যায়।
মনে রাখুন
- তারিখ, duration ও causal order ভিন্ন প্রশ্ন।
- Lamport ordering causality-এর একমুখী শর্ত দেয়।
- Conflict policy business অর্থ দিয়ে নির্ধারণ করুন।
নিজে চেষ্টা করুন
A থেকে B-তে counter 7 আসে, B-এর local counter 10। পরের receive ও local event-এর counter হিসাব করুন এবং কেন 8 সঠিক নয় ব্যাখ্যা করুন।
নিজের বোঝা যাচাই করুন
1. Receive counter কত?
Local ও remote counter-এর maximum-এর সঙ্গে এক; এতে আগে ঘটে যাওয়া local history পিছিয়ে যায় না।
2. Logical time কি seconds?
না। এটি event ordering-এর সংখ্যা; latency বের করা যাবে না।
3. বড় counter কি কারণ প্রমাণ করে?
না। স্বাধীন process-ও বেশি counter তৈরি করতে পারে; causal implication শুধু একদিকে।
4. Duration কীভাবে মাপবেন?
একই process-এর monotonic hrtime দিয়ে; distributed timestamp subtraction নির্ভরযোগ্য duration নয়।
5. সব app-এ vector clock দরকার?
না। Database version বা serialized writes দিয়ে সমস্যা সহজে মিটলে অতিরিক্ত metadata অপ্রয়োজনীয়।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।