Mobile wallet-এর জন্য payment সিস্টেম ডিজাইন

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

ledger-এর মাধ্যমে টাকা বিনিময় করা দুটি wallet

এটি 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-এর প্রবাহ

  1. Request যাচাই, authenticate, সীমা ও fraud নিয়ম পরীক্ষা।
  2. Transfer PENDING হিসেবে তৈরি (idempotency key সহ)।
  3. এক transaction-এ debit ও credit সম্পাদন।
  4. 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 সেবা ডিজাইন.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া