অ্যাপটিকে হিসেবে বিবেচনা করুন: প্রতিটি ডিভাইস একটি লোকাল । স্টাডি অ্যাকশনগুলো একটি এবং একটি append-only (outbox)-এ লেখা হয়; পুনরায় সংযোগ পেলে ডিভাইসটি এবং শেষ সিঙ্কের পর থেকে । কনফ্লিক্টগুলো কোনো একটি গ্লোবাল রুল দিয়ে বরং অনুযায়ী রিজলভ করা হয়।
অ্যাপটিকে হিসেবে বিবেচনা করুন: প্রতিটি ডিভাইস একটি লোকাল । স্টাডি অ্যাকশনগুলো একটি এবং একটি append-only (outbox)-এ লেখা হয়; পুনরায় সংযোগ পেলে ডিভাইসটি এবং শেষ সিঙ্কের পর থেকে । কনফ্লিক্টগুলো কোনো একটি গ্লোবাল রুল দিয়ে বরং অনুযায়ী রিজলভ করা হয়।
মেন্টাল মডেল: এটিকে git-এর মতো ভাবুন — প্রতিটি ডিভাইস অফলাইনে থাকাকালীন লোকালি "commit" করে, এবং সিঙ্ক হলো একটি merge, overwrite নয়।
Device (offline) Server = source of truth
┌──────────────────┐ on reconnect ┌───────────────────────────┐
│ Local DB (SQLite)│ push ops (delta) │ Sync API /sync │
│ + Op log (outbox)│ ─────────────────▶ │ • idempotent by op.id │
│ cursor = lastSeen│ ◀───────────────── │ • merge by semantics │
└──────────────────┘ pull changes>cursor└───────────────────────────┘
Progress DB (Postgres)
ফোনের ক্লক অনির্ভরযোগ্য এবং দুটি ডিভাইস অফলাইনে একই রেকর্ড এডিট করতে পারে, তাই "last write wins" (LWW) নীরবে ডেটা হারায়। semantics অনুযায়ী রিজলভ করুন:
// op-এর একটি id আছে -> idempotently প্রয়োগ করুন (retries দুবার count করে না)। clientTs বিশ্বাসযোগ্য নয়।
function mergeProgress(server, op) {
return {
// progress শুধু বাড়ে -> max: একটি দেরিতে আসা পুরনো op কখনো এটিকে পিছনে টানে না
progress: Math.max(server.progress ?? 0, op.progress),
// studiedMs একটি additive counter -> delta যোগ করুন, overwrite করবেন না
studiedMs: (server.studiedMs ?? 0) + op.studiedMs,
completedAt: server.completedAt ?? (op.progress >= 1 ? op.clientTs : null),
};
}
এখানে, সাধারণ LWW একটি stale ডিভাইসকে দেরিতে progress: 0.3 নিয়ে সিঙ্ক করে সার্ভারের 0.9-কে overwrite করতে দিত → progress হারিয়ে যেত। max নেওয়া এবং studiedMs যোগ করা সিঙ্ককে order-independent করে তোলে — যখন লক্ষ লক্ষ ডিভাইস skewed ক্লক নিয়ে সিঙ্ক করে তখন নিরাপদ।
ইন্টারভিউয়ার যাচাই করছেন আপনি জানেন কিনা যে client ক্লক বিশ্বাস করা যায় না (তাই পিওর timestamp LWW নয়), আপনি সিঙ্ককে idempotent করেন কিনা (op ids), এবং আপনি ডেটার অর্থ অনুযায়ী merge করেন কিনা। একটি দুর্বল উত্তর: "timestamp ব্যবহার করুন, last write wins।" একটি শক্তিশালী উত্তর: replica + op log + idempotency + per-field merge + সার্ভার source of truth হিসেবে — এবং LWW-এর data-loss ব্যর্থতাটি স্পষ্টভাবে নাম ধরে বলা।
LWW সস্তা কিন্তু lossy; semantic merge-এ per-field চিন্তা লাগে কিন্তু কিছুই হারায় না। পূর্ণ CRDT/OT-এর দিকে তখনই যান যখন আপনার সত্যিকারের collaborative editing দরকার (notes, documents) — এটি ব্যয়বহুল, তাই সবকিছুর জন্য এটি ব্যবহার করবেন না।
বিস্তারিত উত্তরসহ IT ইন্টারভিউ প্রশ্নের একটি লাইব্রেরি — জুনিয়র থেকে সিনিয়র পর্যন্ত।
দান করুন