Mobile wallet-এর জন্য payment সিস্টেম ডিজাইন
টাকার সিস্টেম কখনো একটা টাকাও হারাতে বা দুবার গুনতে পারে না। ledger, idempotency ও reconciliation সহ wallet transfer ডিজাইন করি।

এটি wallet-ধাঁচের সিস্টেমের (user একে অপরকে টাকা পাঠায়) সাধারণ ডিজাইন। কোনো নির্দিষ্ট কোম্পানির অভ্যন্তরীণ কাঠামোর বর্ণনা নয়।
লক্ষ্য: অ্যাকাউন্টগুলোর মধ্যে টাকা ঠিকভাবে, নিরাপদে ও খুঁজে পাওয়ার মতো করে স্থানান্তর।
Requirement
- A অ্যাকাউন্ট থেকে B-তে transfer।
- টাকা কখনো হারানো, তৈরি হওয়া বা দুবার প্রয়োগ হওয়া চলবে না।
- পূর্ণ audit trail; refund ও dispute সমর্থন।
- High availability, কিন্তু গতির আগে সঠিকতা।
মূল: double-entry ledger
শুধু balance রেখে তা বদলাবেন না। Ledger entry রাখুন: প্রতিটি transfer একই transaction-এ এক অ্যাকাউন্টে debit ও অন্যটিতে credit বানায়, একই অঙ্কের। সব entry-র যোগফল সবসময় শূন্য, তাই ভুল ধরা পড়ে। Balance হলো entry-গুলোর ফল (প্রায়ই running balance হিসেবে cache করা)।
transfers(id, from, to, amount, status, idempotency_key)
ledger_entries(id, transfer_id, account_id, amount, direction, created_at)
Consistency
টাকার পথে ACID transaction-সহ relational database ব্যবহার করুন। একটি transaction-এ: দুই অ্যাকাউন্ট lock করুন (deadlock এড়াতে নির্দিষ্ট ক্রমে), পর্যাপ্ত balance যাচাই করুন, entry লিখুন, balance আপডেট করুন। একটি transfer eventually consistent store-এ ছড়াবেন না।
Idempotency
Timeout-এর পর client retry করতে পারে। প্রতিটি request-এ idempotency key থাকে, unique constraint-সহ সংরক্ষিত। পুনরাবৃত্তি দুবার পাঠানোর বদলে মূল ফল ফেরত দেয়।
Transfer-এর প্রবাহ
- Request যাচাই, authenticate, সীমা ও fraud নিয়ম পরীক্ষা।
- Transfer
PENDINGহিসেবে তৈরি (idempotency key সহ)। - এক transaction-এ debit ও credit সম্পাদন।
COMPLETEDচিহ্নিত করুন, তারপর notification async পাঠান।
বাইরের সিস্টেম (ব্যাংক, কার্ড)
বাইরের provider-এর call timeout হতে পারে, ফল অজানা। State machine ব্যবহার করুন, কখনো ব্যর্থ ধরে নেবেন না, এবং পরে provider-কে জিজ্ঞেস করে সত্যিকার ফল জানুন। একাধিক সিস্টেম জড়ালে compensation-সহ saga ব্যবহার করুন।
Reconciliation
প্রতিদিন আপনার ledger ব্যাংক ও partner-এর statement-এর সাথে মেলান। অমিল তদন্ত হয়। আসল সিস্টেম এভাবেই bug ও জালিয়াতি ধরে।
নিরাপত্তা ও ঝুঁকি
শক্ত authentication (PIN, OTP, device binding), encryption, rate limit, fraud detection (গতি যাচাই, অস্বাভাবিক অঙ্ক), audit log এবং কড়া access control। সংবেদনশীল data encrypted রাখুন ও দেখার লোক কমান।
Scaling
অ্যাকাউন্ট বা অঞ্চল দিয়ে shard করুন, কিন্তু একটি transfer-এর দুই অ্যাকাউন্ট সামঞ্জস্য রাখুন (যেমন routing দিয়ে বা নির্ভরযোগ্য ledger-সহ সমন্বিত দুই-ধাপে)।
মূল কথা: ACID transaction-এ double-entry ledger, প্রতিটি request idempotent, অজানা ফল সাবধানে সামলান, আর প্রতিদিন reconcile করুন।
System Design সিরিজ, পর্ব ৩ (case study): 7 নম্বর (মোট 16)। আগের লেখা: Uber-এর মতো ride-sharing সেবা ডিজাইন.


