E-commerce checkout সিস্টেম ডিজাইন
Checkout হলো যেখানে টাকা আর স্টক মেলে। Cart, stock reservation, order প্রবাহ ও payment ডিজাইন করি যাতে কিছু অতিরিক্ত বিক্রি বা দুবার চার্জ না হয়।

লক্ষ্য: shopping cart-কে টাকা-দেওয়া, নিশ্চিত order-এ রূপ দেওয়া, স্টক অতিরিক্ত বিক্রি বা দুবার চার্জ ছাড়া।
Requirement
- Refresh ও device বদলালেও টিকে থাকা cart।
- সঠিক দাম, ছাড়, ট্যাক্স ও শিপিং।
- স্টক অতিরিক্ত বিক্রি হবে না।
- Retry ও ব্যর্থতা সামলে payment।
- পরিষ্কার order status ও নিশ্চিতকরণ।
উপাদান
- Cart service: Redis বা database-এ (guest cart-ও, login-এ মিলিয়ে)।
- Catalog ও pricing: পণ্যের বিবরণ ও বর্তমান দাম।
- Inventory service: প্রতি item-এর স্টক।
- Order service: order তৈরি ও ট্র্যাক।
- Payment service: payment provider-এর সাথে কথা বলে।
- Notification service: ইমেইল ও আপডেট।
Checkout-এর ধাপ
- Cart যাচাই: item আছে, দাম হালনাগাদ। Server-এ আবার হিসাব করুন; client-এর পাঠানো দাম কখনো বিশ্বাস করবেন না।
- Inventory reserve: পাওয়া স্টক কমান বা item-গুলোতে সময়সীমার hold দিন।
- Order তৈরি
PENDING_PAYMENTহিসেবে, idempotency key সহ। - Payment: redirect করুন বা provider-কে ডাকুন।
- সফল হলে:
PAIDচিহ্নিত, inventory নিশ্চিত, fulfilment শুরু, ইমেইল পাঠান। - ব্যর্থ বা timeout: reservation ছেড়ে দিন ও
CANCELLEDচিহ্নিত করুন।
অতিরিক্ত বিক্রি ঠেকানো
Atomic conditional decrement ব্যবহার করুন: UPDATE stock SET qty = qty - ? WHERE sku = ? AND qty >= ?। কোনো row না বদলালে item শেষ। খুব গরম item-এর স্টক Redis-এ atomic operation দিয়ে রাখুন ও database-এর সাথে মেলান।
Order state machine
CART -> PENDING_PAYMENT -> PAID -> PACKED -> SHIPPED -> DELIVERED, সাথে CANCELLED ও REFUNDED। শুধু বৈধ বদল অনুমোদন করুন ও সেগুলো idempotent রাখুন।
Payment সমস্যা
- Provider webhook ব্যবহার করে, যা দেরিতে, দুবার বা ক্রম ভেঙে আসতে পারে। Signature যাচাই করুন ও পুনরাবৃত্তি নিরাপদে সামলান।
- Timeout সফল চার্জ লুকিয়ে রাখতে পারে। Retry-র আগে provider থেকে আসল অবস্থা জেনে নিন।
- Refund ও support-এর জন্য payment reference order-এর সাথে রাখুন।
Service জুড়ে consistency
Inventory, order ও payment আলাদা। ব্যর্থতায় compensation (স্টক ছাড়া, refund) সহ saga, এবং database write ও message publish-এর মাঝে event হারানো এড়াতে outbox pattern ব্যবহার করুন।
অন্যান্য বিষয়
একবার-ব্যবহারযোগ্য কুপন (atomic যাচাই), ঠিকানা ও ট্যাক্স নিয়ম, fraud যাচাই, পরিত্যক্ত cart-এর স্মরণ, এবং checkout পথ দ্রুত ও সহজ রাখা, কারণ প্রতিটি বাড়তি ধাপে ক্রেতা হারায়।
মূল কথা: server-এ দাম আবার হিসাব করুন, স্টক atomically reserve করুন, idempotent order state machine চালান, আর ব্যর্থতায় saga ব্যবহার করুন।
System Design সিরিজ, পর্ব ৩ (case study): 13 নম্বর (মোট 16)। আগের লেখা: Web crawler ডিজাইন.


