ব্যাকএন্ড টিউটোরিয়ালগুলোর ফাঁদ
টিউটোরিয়ালগুলো আপনাকে একটি সহজ প্রক্রিয়া দেখায়। একটি ওয়েবহুক (webhook) গ্রহণ করুন। ডাটাবেস আপডেট করুন। একটি 200 OK রেসপন্স পাঠান।
আপনার কোড টেস্টিংয়ে কাজ করে। আপনি এটি প্রোডাকশনে পুশ করেন। তারপর আপনি আপনার ডাটাবেসে ডুপ্লিকেট রেকর্ড দেখতে পান। ব্যবহারকারীরা দুবার ক্রেডিট পান। ডেটা এন্ট্রিগুলো জমে যায়।
টিউটোরিয়ালগুলো নেটওয়ার্ক ফেইলিউরের (network failure) বাস্তবতাকে উপেক্ষা করে।
সমস্যা: অনির্ভরযোগ্য নেটওয়ার্ক নেটওয়ার্ক ব্যর্থ হতে পারে। আপনার সার্ভার হয়তো ধীরগতিতে ডেটা প্রসেস করছে। একটি DNS ত্রুটির কারণে আপনার 200 OK রেসপন্স প্রেরকের কাছে পৌঁছাতে বাধা পেতে পারে।
যখন কোনো সার্ভিস আপনার কনফার্মেশন পায় না, তখন এটি পুনরায় চেষ্টা (retry) করে। এটি একই ওয়েবহুক আবার পাঠায়। যদি আপনার কোড প্রতিটি রিকোয়েস্ট গ্রহণ করে, তবে আপনি ডুপ্লিকেট ডেটা তৈরি করবেন।
সমাধান: আইডেমপোটেন্সি (Idempotency) আইডেমপোটেন্সি মানে হলো একাধিক একই রিকোয়েস্ট পাঠালে তার ফলাফল একটি মাত্র রিকোয়েস্টের মতোই হবে।
একটি লিফটের বোতামের কথা ভাবুন। ৫ নম্বর তলার বোতামটি একবার চাপলে লিফটটি জানে কোথায় যেতে হবে। এটি দশবার চাপলেও লিফটটি ৫০ নম্বর তলায় যাবে না। ফলাফল একই থাকে।
আপনার ওয়েবহুককেও সেই বোতামের মতো কাজ করতে হবে।
কীভাবে এটি সমাধান করবেন নিরাপদ ওয়েবহুক তৈরির জন্য এই ধাপগুলো অনুসরণ করুন:
- ইভেন্টের একটি ইউনিক (unique) আইডি খুঁজে বের করুন।
- কিছু করার আগে আপনার ডাটাবেসে সেই আইডিটি আছে কিনা তা পরীক্ষা করুন।
- যদি আইডিটি থেকে থাকে, তবে থেমে যান। একটি 200 OK পাঠান যাতে প্রেরক পুনরায় চেষ্টা করা বন্ধ করে।
- যদি আইডিটি নতুন হয়, তবে ডেটা প্রসেস করুন।
- অবিলম্বে ইভেন্ট আইডিটি আপনার ডাটাবেসে সেভ করুন।
Node.js-এ উদাহরণস্বরূপ লজিক:
const eventId = req.body.event_id;
const existingEvent = await db.processedEvents.findUnique({ where: { id: eventId } });
if (existingEvent) { return res.status(200).send('Already processed'); }
await updateUserData(req.body.data); await db.processedEvents.create({ data: { id: eventId } });
return res.status(200).send('Success');
নিখুঁত পরিস্থিতির জন্য সিস্টেম তৈরি করা সহজ। ব্যর্থতার কথা মাথায় রেখে সিস্টেম তৈরি করাই হলো আসল ইঞ্জিনিয়ারিং।
আপনি কি রিট্রাই (retry) থেকে আসা ডুপ্লিকেট ডেটা নিয়ে কাজ করেছেন? আপনি কীভাবে আইডেমপোটেন্সি হ্যান্ডেল করেন?