این طراحی برای یک سیستم مشابه Uber Eats، DoorDash یا SnappFood و در سطح مصاحبه Senior Java Developer / Software Architect تهیه شده است.
User Registration/Login
Restaurant Management
Menu Management
Browse Restaurants
Search Food
Shopping Cart
Place Order
Payment
Restaurant Accept/Reject Order
Delivery Assignment
Driver Tracking
Order Status
Notification
Rating & Review
High Availability
Low Latency
Scalability
Fault Tolerance
Data Consistency
Security
Real-time Tracking
Horizontal Scaling
Assume
20 Million Users 2 Million Daily Active Users 500K Orders/Day Peak 500 Orders/sec Average 50 Orders/sec
+----------------------+ | Mobile/Web Client | +----------+-----------+ | HTTPS / REST | +------------v-------------+ | API Gateway / LoadBalancer| +------------+-------------+ | +-------------+-------------+-------------+--------------+ | | | | | | | | | | +-------v--+ +--------v---+ +-------v----+ +------v-----+ +------v------+ | UserSvc | |CatalogSvc | |OrderSvc | |PaymentSvc | |DeliverySvc | +-------+--+ +--------+---+ +-------+----+ +------+-----+ +------+------+ | | | | | +-------------+-------------+-------------+--------------+ | Kafka / Event Bus | +-------------------+---------------------+ | | | +---------v------+ +--------v------+ +---------v------+ |NotificationSvc | |InventorySvc | |AnalyticsSvc | +----------------+ +---------------+ +----------------+ | Redis Cache Cluster | +-------------------+----------------------+ | | | PostgreSQL Elasticsearch Object Storage
+----------------+ | Customer | +-------+--------+ | | Food Ordering Platform | +------------------+--------------------+ | | | +-----v-----+ +------v------+ +------v------+ |Restaurant | |Payment | |Delivery | |Owner | |Gateway | |Driver | +-----------+ +-------------+ +-------------+
+-------------------+ | API Gateway | +---------+---------+ | +----------+----------+----------+----------+ | | | | | +----v---+ +----v---+ +----v---+ +----v---+ +----v----+ |UserSvc | |MenuSvc | |OrderSvc| |CartSvc | |Payment | +----+---+ +----+---+ +----+---+ +----+---+ +----+----+ | | | | | +----------+----------+----------+----------+ | Kafka | +----------------+----------------+ | | +------v------+ +--------v------+ |Notification | |DeliverySvc | +-------------+ +---------------+
User ---- id name phone address Restaurant ------------ id name location status Menu ---- id restaurantId title MenuItem --------- id menuId name price Cart ---- id userId CartItem --------- id cartId menuItemId quantity Order ------ id userId restaurantId status totalPrice OrderItem --------- id orderId menuItemId quantity price Payment -------- id orderId status transactionId Driver ------- id name vehicle Delivery --------- id driverId orderId status
Relationship
User | |1 | |N Order Restaurant | |1 | |N Menu Menu | |1 | |N MenuItem Order | |1 | |N OrderItem Driver | |1 | |N Delivery
Customer | | Browse Menu | v Catalog Service | | Add Cart | v Cart Service | | Checkout | v Order Service | | Validate Menu | v Inventory Service | | Reserve Items | v Payment Service | | Charge Customer | v Payment Gateway | | Success | v Kafka | +------------------------------+ | | v v Restaurant Service Notification Service | | Accept Order | v Delivery Service | | Assign Driver | v Driver | | Deliver | v Customer
DataStorageUserPostgreSQLRestaurantPostgreSQLMenuPostgreSQLOrdersPostgreSQLCartRedisSearchElasticsearchImagesObject Storage
order-created payment-success payment-failed restaurant-accepted restaurant-rejected driver-assigned driver-location delivery-started delivery-completed notification-event
Redis
Restaurant Cache Menu Cache Popular Foods Shopping Cart Session Rate Limiter Driver Location
Shard = hash(userId)
Orders
Shard = hash(orderId)
Restaurants
Shard = City
Created ↓ Payment Pending ↓ Paid ↓ Restaurant Accepted ↓ Preparing ↓ Driver Assigned ↓ Picked Up ↓ On The Way ↓ Delivered ↓ Completed
Failure Path
Created ↓ Payment Failed ↓ Cancelled
Decision: استفاده از Microservices.
Reason: جداسازی دامنههای کسبوکار (کاربر، منو، سفارش، پرداخت و ارسال)، استقرار مستقل و مقیاسپذیری بهتر.
Decision: استفاده از PostgreSQL برای سفارشها.
Reason: سفارش و پرداخت نیازمند تراکنشهای ACID و سازگاری قوی هستند.
Decision: استفاده از Redis برای سبد خرید.
Reason: دادههای Cart موقتی هستند و نیاز به دسترسی بسیار سریع دارند.
Decision: استفاده از Kafka برای رویدادها.
Reason: جداسازی سرویسها، پردازش غیرهمزمان و قابلیت Retry.
Decision: استفاده از Elasticsearch برای جستجو.
Reason: جستجوی سریع بر اساس نام غذا، رستوران، دستهبندی و فیلترها.
Decision: ذخیره تصاویر در Object Storage.
Reason: کاهش بار پایگاه داده، ادغام با CDN و مقیاسپذیری بالا.
FailureSolutionPayment Gateway DownRetry + Circuit Breaker + Outbox PatternRestaurant OfflineCancel Order یا پیشنهاد رستوران جایگزینDriver CancelledReassign DriverKafka FailureReplication + Dead Letter QueueRedis FailureCache Rebuild + Fallback to DBDatabase FailureReplication + Automatic FailoverDuplicate OrderIdempotency KeyInventory Race ConditionOptimistic Lock یا Reservation Mechanism
ChoiceProsConsPostgreSQLACID، تراکنش قویمقیاسپذیری افقی دشوارترRedis Cartسرعت بسیار بالادادهها موقتی هستندKafkaپردازش غیرهمزمان، مقیاسپذیریپیچیدگی عملیاتیElasticsearchجستجوی سریع و انعطافپذیرنیاز به همگامسازی با دیتابیسMicroservicesتوسعه و استقرار مستقلپیچیدگی ارتباطات و مانیتورینگEvent-Drivenانعطافپذیری و توسعهپذیریاشکالزدایی و ردیابی رویدادها دشوارتر
این سند، اجزای کلیدی مورد انتظار در یک مصاحبه طراحی سیستم را پوشش میدهد: نیازمندیها، معماری سطح بالا، نمودارهای C4، ERD، Sequence Diagram، طراحی پایگاه داده، استراتژی کش، شاردینگ، ماشین حالت سفارش، ADRها، سناریوهای خطا و تحلیل Trade-offها.