ধরুন, আপনি একটি Payment API তৈরি করেছেন।
একজন User “Pay Now” বাটনে চাপ দিলেন।
কিন্তু Server একটু ধীর (Slow)।
User ভাবলেন,
“হয়তো Click হয়নি!”
তিনি আবার Button চাপলেন।
তারপর আবার।
কয়েক সেকেন্ড পরে…
Customer Support থেকে ফোন—
“একই Payment-এর জন্য Customer-এর টাকা দুইবার কেটে গেছে!”
এখন প্রশ্ন হলো—
সমস্যাটা User-এর, নাকি System-এর?
আমার মতে, System-এর।
কারণ একটি ভালো Payment System কখনোই একই Payment একাধিকবার Process করবে না।
প্রথম প্রতিরক্ষা: Frontend
Frontend থেকেই Duplicate Request কমানো যায়।
যেমন—
- Button Click করার পর Disable করে দেওয়া।
- Loading Spinner দেখানো।
- Request Complete না হওয়া পর্যন্ত দ্বিতীয় Click Block করা।
এতে অনেক Duplicate Request শুরুতেই বন্ধ হয়ে যায়।
কিন্তু…
শুধু Frontend-এর উপর নির্ভর করা যাবে না।
কারণ—
- User Page Refresh করতে পারে।
- Network Retry হতে পারে।
- Mobile App একই Request আবার পাঠাতে পারে।
- কোনো Bot Request পাঠাতে পারে।
তাই আসল নিরাপত্তা Backend-এ থাকতে হবে।
দ্বিতীয় প্রতিরক্ষা: Idempotency Key
প্রতিটি Payment Request-এর সাথে একটি Unique Id পাঠানো হয়।
যেমন—
Idempotency-Key: 7f4c9d...
যদি একই Key আবার আসে,
Server নতুন Payment Process করবে না।
আগের Result-ই Return করবে।
তৃতীয় প্রতিরক্ষা: Database Constraint
Database-এ এমনভাবে Design করুন,
যাতে একই Transaction Reference দুইবার Insert-ই করা না যায়।
যেমন—
- PaymentReference
- OrderId
- TransactionId
এসবের উপর Unique Constraint থাকতে পারে।
Database অনেক সময় শেষ নিরাপত্তা দেয়।
চতুর্থ প্রতিরক্ষা: Transaction
Payment-এর গুরুত্বপূর্ণ Operation-গুলো Transaction-এর মধ্যে করুন।
যাতে মাঝপথে কোনো সমস্যা হলে Partial Data Save না হয়।
পঞ্চম প্রতিরক্ষা: Distributed Lock (যেখানে প্রয়োজন)
যদি Multiple Server একই Payment Process করতে পারে,
তাহলে Redis Distributed Lock-এর মতো সমাধান ব্যবহার করা যেতে পারে।
এতে একই সময়ে একটি Payment শুধুমাত্র একটি Server Process করবে।
সবচেয়ে গুরুত্বপূর্ণ শিক্ষা
একজন User একই Request একাধিকবার পাঠাতে পারেন।
Network একই Request Retry করতে পারে।
Gateway একই Callback আবার পাঠাতে পারে।
এসবই স্বাভাবিক।
অস্বাভাবিক হলো—
System সেই Request-গুলোকে নতুন Payment হিসেবে ধরে আবার টাকা কেটে ফেলছে।
একটি ভালো Payment System-এর লক্ষ্য হওয়া উচিত—
“One business operation = One successful payment.”
যতবার Request আসুক না কেন।

Leave a Reply