<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Akhtar Sabzi</title><link>https://virgool.ir/feed/@sabzi0307</link><description></description><language>fa</language><pubDate>2026-11-10 21:34:04</pubDate><image><url>https://files.virgool.ir/upload/users/4912701/avatar/avatar.png</url><title>Akhtar Sabzi</title><link>https://virgool.ir/@sabzi0307</link></image><item><title>food</title><link>https://virgool.ir/@sabzi0307/food-iejzqogljyk7</link><description>Food Ordering System Design (High-Level)این طراحی برای یک سیستم مشابه Uber Eats، DoorDash یا SnappFood و در سطح مصاحبه Senior Java Developer / Software Architect تهیه شده است.1. RequirementsFunctional RequirementsUser Registration/LoginRestaurant ManagementMenu ManagementBrowse RestaurantsSearch FoodShopping CartPlace OrderPaymentRestaurant Accept/Reject OrderDelivery AssignmentDriver TrackingOrder StatusNotificationRating &amp; ReviewNon Functional RequirementsHigh AvailabilityLow LatencyScalabilityFault ToleranceData ConsistencySecurityReal-time TrackingHorizontal Scaling2. Capacity EstimationAssume20 Million Users&#xA;&#xA;2 Million Daily Active Users&#xA;&#xA;500K Orders/Day&#xA;&#xA;Peak&#xA;&#xA;500 Orders/sec&#xA;&#xA;Average&#xA;&#xA;50 Orders/sec&#xA;3. High-Level Architecture                         +----------------------+&#xA;                         | Mobile/Web Client    |&#xA;                         +----------+-----------+&#xA;                                    |&#xA;                              HTTPS / REST&#xA;                                    |&#xA;                       +------------v-------------+&#xA;                       | API Gateway / LoadBalancer|&#xA;                       +------------+-------------+&#xA;                                    |&#xA;        +-------------+-------------+-------------+--------------+&#xA;        |             |             |             |              |&#xA;        |             |             |             |              |&#xA;+-------v--+ +--------v---+ +-------v----+ +------v-----+ +------v------+&#xA;| UserSvc  | |CatalogSvc  | |OrderSvc    | |PaymentSvc  | |DeliverySvc  |&#xA;+-------+--+ +--------+---+ +-------+----+ +------+-----+ +------+------+&#xA;        |             |             |             |              |&#xA;        +-------------+-------------+-------------+--------------+&#xA;                              |&#xA;                       Kafka / Event Bus&#xA;                              |&#xA;          +-------------------+---------------------+&#xA;          |                   |                     |&#xA;+---------v------+   +--------v------+    +---------v------+&#xA;|NotificationSvc |   |InventorySvc  |    |AnalyticsSvc    |&#xA;+----------------+   +---------------+    +----------------+&#xA;                              |&#xA;                      Redis Cache Cluster&#xA;                              |&#xA;          +-------------------+----------------------+&#xA;          |                   |                      |&#xA;     PostgreSQL          Elasticsearch         Object Storage&#xA;4. C4 Context Diagram                 +----------------+&#xA;                 | Customer       |&#xA;                 +-------+--------+&#xA;                         |&#xA;                         |&#xA;                 Food Ordering Platform&#xA;                         |&#xA;      +------------------+--------------------+&#xA;      |                  |                    |&#xA;+-----v-----+     +------v------+      +------v------+&#xA;|Restaurant |     |Payment      |      |Delivery     |&#xA;|Owner      |     |Gateway       |      |Driver       |&#xA;+-----------+     +-------------+      +-------------+&#xA;5. C4 Container Diagram                 +-------------------+&#xA;                 | API Gateway       |&#xA;                 +---------+---------+&#xA;                           |&#xA;     +----------+----------+----------+----------+&#xA;     |          |          |          |          |&#xA;+----v---+ +----v---+ +----v---+ +----v---+ +----v----+&#xA;|UserSvc | |MenuSvc | |OrderSvc| |CartSvc | |Payment  |&#xA;+----+---+ +----+---+ +----+---+ +----+---+ +----+----+&#xA;     |          |          |          |          |&#xA;     +----------+----------+----------+----------+&#xA;                        |&#xA;                     Kafka&#xA;                        |&#xA;       +----------------+----------------+&#xA;       |                                 |&#xA;+------v------+                  +--------v------+&#xA;|Notification |                  |DeliverySvc    |&#xA;+-------------+                  +---------------+&#xA;6. Entity DiagramUser&#xA;----&#xA;id&#xA;name&#xA;phone&#xA;address&#xA;&#xA;Restaurant&#xA;------------&#xA;id&#xA;name&#xA;location&#xA;status&#xA;&#xA;Menu&#xA;----&#xA;id&#xA;restaurantId&#xA;title&#xA;&#xA;MenuItem&#xA;---------&#xA;id&#xA;menuId&#xA;name&#xA;price&#xA;&#xA;Cart&#xA;----&#xA;id&#xA;userId&#xA;&#xA;CartItem&#xA;---------&#xA;id&#xA;cartId&#xA;menuItemId&#xA;quantity&#xA;&#xA;Order&#xA;------&#xA;id&#xA;userId&#xA;restaurantId&#xA;status&#xA;totalPrice&#xA;&#xA;OrderItem&#xA;---------&#xA;id&#xA;orderId&#xA;menuItemId&#xA;quantity&#xA;price&#xA;&#xA;Payment&#xA;--------&#xA;id&#xA;orderId&#xA;status&#xA;transactionId&#xA;&#xA;Driver&#xA;-------&#xA;id&#xA;name&#xA;vehicle&#xA;&#xA;Delivery&#xA;---------&#xA;id&#xA;driverId&#xA;orderId&#xA;status&#xA;RelationshipUser&#xA; |&#xA; |1&#xA; |&#xA; |N&#xA;Order&#xA;&#xA;Restaurant&#xA; |&#xA; |1&#xA; |&#xA; |N&#xA;Menu&#xA;&#xA;Menu&#xA; |&#xA; |1&#xA; |&#xA; |N&#xA;MenuItem&#xA;&#xA;Order&#xA; |&#xA; |1&#xA; |&#xA; |N&#xA;OrderItem&#xA;&#xA;Driver&#xA; |&#xA; |1&#xA; |&#xA; |N&#xA;Delivery&#xA;7. Sequence Diagram (Place Order)Customer&#xA;&#xA; |&#xA; | Browse Menu&#xA; |&#xA; v&#xA;&#xA;Catalog Service&#xA;&#xA; |&#xA; | Add Cart&#xA; |&#xA; v&#xA;&#xA;Cart Service&#xA;&#xA; |&#xA; | Checkout&#xA; |&#xA; v&#xA;&#xA;Order Service&#xA;&#xA; |&#xA; | Validate Menu&#xA; |&#xA; v&#xA;&#xA;Inventory Service&#xA;&#xA; |&#xA; | Reserve Items&#xA; |&#xA; v&#xA;&#xA;Payment Service&#xA;&#xA; |&#xA; | Charge Customer&#xA; |&#xA; v&#xA;&#xA;Payment Gateway&#xA;&#xA; |&#xA; | Success&#xA; |&#xA; v&#xA;&#xA;Kafka&#xA;&#xA; |&#xA; +------------------------------+&#xA; |                              |&#xA; v                              v&#xA;&#xA;Restaurant Service       Notification Service&#xA;&#xA; |&#xA; | Accept Order&#xA; |&#xA; v&#xA;&#xA;Delivery Service&#xA;&#xA; |&#xA; | Assign Driver&#xA; |&#xA; v&#xA;&#xA;Driver&#xA;&#xA; |&#xA; | Deliver&#xA; |&#xA; v&#xA;&#xA;Customer&#xA;8. Database DesignDataStorageUserPostgreSQLRestaurantPostgreSQLMenuPostgreSQLOrdersPostgreSQLCartRedisSearchElasticsearchImagesObject Storage9. Kafka Topicsorder-created&#xA;&#xA;payment-success&#xA;&#xA;payment-failed&#xA;&#xA;restaurant-accepted&#xA;&#xA;restaurant-rejected&#xA;&#xA;driver-assigned&#xA;&#xA;driver-location&#xA;&#xA;delivery-started&#xA;&#xA;delivery-completed&#xA;&#xA;notification-event&#xA;10. Cache StrategyRedisRestaurant Cache&#xA;&#xA;Menu Cache&#xA;&#xA;Popular Foods&#xA;&#xA;Shopping Cart&#xA;&#xA;Session&#xA;&#xA;Rate Limiter&#xA;&#xA;Driver Location&#xA;11. Sharding StrategyShard = hash(userId)&#xA;OrdersShard = hash(orderId)&#xA;RestaurantsShard = City&#xA;12. Order State MachineCreated&#xA;&#xA;↓&#xA;&#xA;Payment Pending&#xA;&#xA;↓&#xA;&#xA;Paid&#xA;&#xA;↓&#xA;&#xA;Restaurant Accepted&#xA;&#xA;↓&#xA;&#xA;Preparing&#xA;&#xA;↓&#xA;&#xA;Driver Assigned&#xA;&#xA;↓&#xA;&#xA;Picked Up&#xA;&#xA;↓&#xA;&#xA;On The Way&#xA;&#xA;↓&#xA;&#xA;Delivered&#xA;&#xA;↓&#xA;&#xA;Completed&#xA;Failure PathCreated&#xA;&#xA;↓&#xA;&#xA;Payment Failed&#xA;&#xA;↓&#xA;&#xA;Cancelled&#xA;13. ADR (Architecture Decision Records)ADR-001Decision: استفاده از Microservices.Reason: جداسازی دامنه‌های کسب‌وکار (کاربر، منو، سفارش، پرداخت و ارسال)، استقرار مستقل و مقیاس‌پذیری بهتر.ADR-002Decision: استفاده از PostgreSQL برای سفارش‌ها.Reason: سفارش و پرداخت نیازمند تراکنش‌های ACID و سازگاری قوی هستند.ADR-003Decision: استفاده از Redis برای سبد خرید.Reason: داده‌های Cart موقتی هستند و نیاز به دسترسی بسیار سریع دارند.ADR-004Decision: استفاده از Kafka برای رویدادها.Reason: جداسازی سرویس‌ها، پردازش غیرهمزمان و قابلیت Retry.ADR-005Decision: استفاده از Elasticsearch برای جستجو.Reason: جستجوی سریع بر اساس نام غذا، رستوران، دسته‌بندی و فیلترها.ADR-006Decision: ذخیره تصاویر در Object Storage.Reason: کاهش بار پایگاه داده، ادغام با CDN و مقیاس‌پذیری بالا.14. Failure ScenariosFailureSolutionPayment 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 Mechanism15. Trade-offsChoiceProsConsPostgreSQLACID، تراکنش قویمقیاس‌پذیری افقی دشوارترRedis Cartسرعت بسیار بالاداده‌ها موقتی هستندKafkaپردازش غیرهمزمان، مقیاس‌پذیریپیچیدگی عملیاتیElasticsearchجستجوی سریع و انعطاف‌پذیرنیاز به همگام‌سازی با دیتابیسMicroservicesتوسعه و استقرار مستقلپیچیدگی ارتباطات و مانیتورینگEvent-Drivenانعطاف‌پذیری و توسعه‌پذیریاشکال‌زدایی و ردیابی رویدادها دشوارتراین سند، اجزای کلیدی مورد انتظار در یک مصاحبه طراحی سیستم را پوشش می‌دهد: نیازمندی‌ها، معماری سطح بالا، نمودارهای C4، ERD، Sequence Diagram، طراحی پایگاه داده، استراتژی کش، شاردینگ، ماشین حالت سفارش، ADRها، سناریوهای خطا و تحلیل Trade-offها.</description><category>Akhtar Sabzi</category><author>Akhtar Sabzi</author><pubDate>Mon, 20 Jul 2026 23:23:16 +0330</pubDate></item><item><title>chat</title><link>https://virgool.ir/@sabzi0307/chat-y7nkuvbhm1jd</link><description>High Level RequirementsFunctionalUser AuthenticationOne-to-One ChatGroup ChatOnline PresenceRead/Delivered StatusTyping IndicatorPush NotificationMedia UploadMessage HistorySearch ConversationNon FunctionalHigh Availability (99.99%)Horizontal ScalabilityLow Latency (&lt;100ms)Eventual ConsistencyFault ToleranceSecure CommunicationMulti RegionMillions of concurrent connectionsCapacity Estimationفرض کنیم100 Million Users&#xA;&#xA;10 Million Daily Active Users&#xA;&#xA;1 Million Concurrent Connections&#xA;&#xA;Average Message Size = 1 KB&#xA;&#xA;100 Messages/User/DayTraffic10M ×100&#xA;&#xA;=1 Billion Messages/Day&#xA;&#xA;≈11,600 Message/sec Average&#xA;&#xA;Peak&#xA;≈100,000 Message/secبنابراین طراحی باید حداقل100K Write/secرا پاسخ دهد.High Level Architecture                    +----------------+&#xA;                    | Mobile/Web App |&#xA;                    +-------+--------+&#xA;                            |&#xA;                     HTTPS / WebSocket&#xA;                            |&#xA;                  +---------v---------+&#xA;                  | Global LoadBalancer|&#xA;                  +---------+---------+&#xA;                            |&#xA;        +-------------------+------------------+&#xA;        |                                      |&#xA;+-------v------+                     +---------v-------+&#xA;| API Gateway  |                     | WebSocket Gateway|&#xA;+-------+------+                     +---------+--------+&#xA;        |                                      |&#xA;        |                                      |&#xA;        |                         Persistent Connections&#xA;        |                                      |&#xA;+-------v--------------------------------------v------+&#xA;|               Chat Service Cluster                  |&#xA;+--------+---------+----------+-----------+-----------+&#xA;         |         |          |           |&#xA;         |         |          |           |&#xA;         |         |          |           |&#xA;+--------v+   +----v----+ +---v----+ +----v-----+&#xA;|Presence |   |Message  | |Group   | |Media     |&#xA;|Service  |   |Service  | |Service | |Service   |&#xA;+----+----+   +----+----+ +----+---+ +----+-----+&#xA;     |             |           |          |&#xA;     |             |           |          |&#xA;     |      +------v-----------v----------+&#xA;     |      | Kafka / Event Bus           |&#xA;     |      +-------------+---------------+&#xA;     |                    |&#xA;+----v-----+        +-----v------+&#xA;|Redis     |        |Notification|&#xA;|Cluster   |        |Service     |&#xA;+----+-----+        +-----+------+&#xA;     |                    |&#xA;     |               APNS / FCM&#xA;     |&#xA;+----v----------------------------+&#xA;| Cassandra / Scylla / DynamoDB   |&#xA;+---------------------------------+&#xA;&#xA;Media&#xA;  |&#xA;S3 / Object StorageC4 Context Diagram                +----------------------+&#xA;                |      User            |&#xA;                +----------+-----------+&#xA;                           |&#xA;                           |&#xA;                    Uses Chat System&#xA;                           |&#xA;                +----------v-----------+&#xA;                |   Chat Platform      |&#xA;                +----------+-----------+&#xA;                           |&#xA;      +--------------------+--------------------+&#xA;      |                    |                    |&#xA;      |                    |                    |&#xA;+-----v----+        +------v-----+      +-------v------+&#xA;|Push       |        |Object      |      |Identity      |&#xA;|Provider   |        |Storage     |      |Provider      |&#xA;|(FCM/APNS) |        |(S3)         |      |OAuth/JWT)    |&#xA;+-----------+        +------------+      +--------------+C4 Container Diagram                     +------------------+&#xA;                     | API Gateway      |&#xA;                     +--------+---------+&#xA;                              |&#xA;      +-----------+-----------+-----------+&#xA;      |           |           |           |&#xA;      |           |           |           |&#xA;+-----v--+  +-----v---+ +-----v---+ +-----v-----+&#xA;|AuthSvc |  |ChatSvc  | |GroupSvc | |PresenceSvc|&#xA;+-----+--+  +-----+---+ +-----+---+ +-----+-----+&#xA;      |           |           |           |&#xA;      +-----------+-----------+-----------+&#xA;                      |&#xA;                Kafka Cluster&#xA;                      |&#xA;       +--------------+---------------+&#xA;       |                              |&#xA;+------v------+               +-------v------+&#xA;|Notification |               |Analytics     |&#xA;+-------------+               +--------------+&#xA;&#xA;              |&#xA;      +-------v--------+&#xA;      | Cassandra      |&#xA;      +----------------+Sequence Diagram (Send Message)User A&#xA;&#xA; |&#xA; | Send Message&#xA; |&#xA; v&#xA;&#xA;Gateway&#xA;&#xA; |&#xA; | Authenticate&#xA; |&#xA; v&#xA;&#xA;Chat Service&#xA;&#xA; |&#xA; | Persist Message&#xA; |&#xA; v&#xA;&#xA;Database&#xA;&#xA; |&#xA; | OK&#xA; |&#xA; v&#xA;&#xA;Kafka&#xA;&#xA; |&#xA; +----------------------------+&#xA; |                            |&#xA; v                            v&#xA;&#xA;Notification             Presence Service&#xA;&#xA; |                            |&#xA; |                            |&#xA; v                            |&#xA;Recipient Online?             |&#xA; |                            |&#xA; |Yes                         |&#xA; |                            |&#xA; v                            |&#xA;WebSocket Push                |&#xA;                              |&#xA;                              |&#xA;                         Recipient Offline&#xA;                              |&#xA;                              v&#xA;                         Push NotificationEntity Diagram+-------------+&#xA;| User        |&#xA;+-------------+&#xA;| id          |&#xA;| username    |&#xA;| status      |&#xA;| lastSeen    |&#xA;+------+------+&#xA;       |&#xA;       |1&#xA;       |&#xA;       |N&#xA;+------v------+&#xA;|Conversation |&#xA;+-------------+&#xA;| id          |&#xA;| type        |&#xA;| createdAt   |&#xA;+------+------+&#xA;       |&#xA;       |1&#xA;       |&#xA;       |N&#xA;+------v------+&#xA;| Message      |&#xA;+--------------+&#xA;| id           |&#xA;| senderId     |&#xA;| content      |&#xA;| type         |&#xA;| sentAt       |&#xA;| status       |&#xA;+------+-------+&#xA;       |&#xA;       |&#xA;       |N&#xA;       |&#xA;       |1&#xA;+------v------+&#xA;| Attachment  |&#xA;+-------------+&#xA;| id          |&#xA;| url         |&#xA;| size        |&#xA;| mimeType    |&#xA;+-------------+&#xA;&#xA;Conversation&#xA;&#xA;1&#xA;&#xA;|&#xA;&#xA;N&#xA;&#xA;ConversationMember&#xA;&#xA;N&#xA;&#xA;|&#xA;&#xA;1&#xA;&#xA;UserDatabase ChoiceDataStorageMessagesCassandra / ScyllaUser ProfilePostgreSQLPresenceRedisCacheRedis ClusterMediaS3SearchElasticsearchKafka Topicsmessage-created&#xA;&#xA;message-delivered&#xA;&#xA;message-read&#xA;&#xA;user-online&#xA;&#xA;user-offline&#xA;&#xA;typing-event&#xA;&#xA;notification-event&#xA;&#xA;media-uploadedCache StrategyRedisOnline Users&#xA;&#xA;Conversation Cache&#xA;&#xA;Unread Counter&#xA;&#xA;Recent Messages&#xA;&#xA;Session Token&#xA;&#xA;Rate LimiterSharding StrategyConversation BasedShard = hash(conversationId)مزایاتمام پیام‌های یک گفتگو روی یک شاردQuery سادهترتیب پیام‌ها حفظ می‌شودMessage FlowClient&#xA;&#xA;↓&#xA;&#xA;Gateway&#xA;&#xA;↓&#xA;&#xA;Chat Service&#xA;&#xA;↓&#xA;&#xA;Kafka&#xA;&#xA;↓&#xA;&#xA;Database&#xA;&#xA;↓&#xA;&#xA;Redis Update&#xA;&#xA;↓&#xA;&#xA;Notification&#xA;&#xA;↓&#xA;&#xA;ReceiverADR (Architecture Decision Records)ADR-001Decisionاستفاده از WebSocket برای ارتباط Real-Time.ReasonFull DuplexLatency پایینکاهش هزینه نسبت به PollingADR-002Decisionذخیره پیام‌ها در Cassandra/ScyllaDB.ReasonWrite Throughput بسیار بالاHorizontal ScalingPartitioning داخلیمناسب Time-Series DataADR-003Decisionاستفاده از Kafka برای Event Streaming.ReasonLoose CouplingRetryReplayBack PressureEvent Driven ArchitectureADR-004Decisionاستفاده از Redis برای Presence.Reasonعملیات In-MemoryTTLسرعت بسیار بالاADR-005DecisionMedia در Object Storage.Reasonکاهش حجم دیتابیسCDN Integrationارزان‌ترScalability بالاADR-006DecisionHorizontal Scaling برای Chat Service.ReasonStateless ServiceAuto ScalingLoad DistributionFailure ScenariosFailureSolutionChat Service DownLoad Balancer + Auto ScalingKafka DownReplication + ISRRedis DownRedis Cluster + ReplicaDatabase Node DownMulti ReplicaGateway FailureMultiple Gateway InstancesRegion FailureMulti-Region DeploymentMessage DuplicationIdempotency KeyMessage OrderingPartition by ConversationIdTrade-offsChoiceProsConsWebSocketReal-time، تأخیر کممدیریت Connection دشوارCassandraنوشتن بسیار سریع، مقیاس‌پذیرJoin محدود، Consistency نهاییKafkaجداسازی سرویس‌ها، تحمل بارپیچیدگی عملیاتیRedisسرعت بالاداده‌ها عمدتاً در حافظهMicroservicesمقیاس‌پذیری و استقلالپیچیدگی شبکه و مانیتورینگEvent-Drivenانعطاف‌پذیری و توسعه‌پذیریDebug و Trace دشوارتراین طراحی در سطح مصاحبه‌های Senior Java Developer / Software Architect جامع است و تقریباً تمام نمودارهای کلیدی مورد انتظار (High-Level Architecture، C4 Context، C4 Container، Sequence Diagram، Entity Diagram، ADR، سناریوهای خطا و Trade-offها) را پوشش می‌دهد.</description><category>Akhtar Sabzi</category><author>Akhtar Sabzi</author><pubDate>Mon, 20 Jul 2026 23:20:15 +0330</pubDate></item><item><title>wallet</title><link>https://virgool.ir/@sabzi0307/wallet-n7fdb4ssulka</link><description>99.99%ConsistencyStrong ConsistencyLatency&lt;200 msScalabilityHorizontalSecurityPCI DSS&#xA;&#xA;Encryption&#xA;&#xA;AuditHigh Level Architecture                        Client&#xA;&#xA;                           |&#xA;&#xA;                    API Gateway&#xA;&#xA;                           |&#xA;&#xA;               Authentication Service&#xA;&#xA;                           |&#xA;&#xA;        +------------------+----------------+&#xA;&#xA;        |                                   |&#xA;&#xA; Wallet Service                    Transaction Service&#xA;&#xA;        |                                   |&#xA;&#xA;        +------------+----------------------+&#xA;&#xA;                     |&#xA;&#xA;              Ledger Service&#xA;&#xA;                     |&#xA;&#xA;              Kafka Event Bus&#xA;&#xA;                     |&#xA;&#xA;      +--------------+------------------+&#xA;&#xA;      |                                 |&#xA;&#xA; Notification                  Audit Service&#xA;&#xA;      |&#xA;&#xA;Email / SMS / Push&#xA;&#xA;                     |&#xA;&#xA;             PostgreSQL Cluster&#xA;&#xA;                     |&#xA;&#xA;               Redis Clusterچرا Ledger Service جداست؟در سیستم بانکیWallet فقط موجودی نیست.اصل حقیقت (Source of Truth)همیشه Ledger است.مثلاًWallet A100$↓Transfer 30$↓Wallet BLedgerDebit Wallet A&#xA;&#xA;Credit Wallet Bاگر Wallet خراب شودLedger هنوز حقیقت را نگه داشته است.Entity Diagram+-----------+&#xA;| User      |&#xA;+-----------+&#xA;| userId PK |&#xA;| name      |&#xA;| kycStatus |&#xA;+-----------+&#xA;&#xA;        1&#xA;&#xA;        |&#xA;&#xA;        *&#xA;&#xA;+------------+&#xA;| Wallet     |&#xA;+------------+&#xA;| walletId   |&#xA;| userId FK  |&#xA;| currency   |&#xA;| status     |&#xA;+------------+&#xA;&#xA;        1&#xA;&#xA;        |&#xA;&#xA;        *&#xA;&#xA;+----------------+&#xA;| LedgerAccount  |&#xA;+----------------+&#xA;| accountId      |&#xA;| walletId       |&#xA;| balance        |&#xA;+----------------+&#xA;&#xA;        1&#xA;&#xA;        |&#xA;&#xA;        *&#xA;&#xA;+----------------+&#xA;| Transaction    |&#xA;+----------------+&#xA;| transactionId  |&#xA;| type           |&#xA;| amount         |&#xA;| status         |&#xA;| createdAt      |&#xA;+----------------+&#xA;&#xA;        1&#xA;&#xA;        |&#xA;&#xA;        *&#xA;&#xA;+----------------+&#xA;| LedgerEntry    |&#xA;+----------------+&#xA;| entryId        |&#xA;| debitAccount   |&#xA;| creditAccount  |&#xA;| amount         |&#xA;+----------------+&#xA;مهم‌ترین نکته طراحیهیچوقت Balance را مستقیماً Update نکن.اشتباهUPDATE wallet&#xA;&#xA;SET balance=balance-100در سیستم بانکی این کار ممنوع است.در عوضLedger Entry&#xA;&#xA;Debit&#xA;&#xA;CreditبعداًBalanceاز روی Ledger محاسبه می‌شود.Double Entry Accountingفرض کنیدWallet A100$Wallet B50$Transfer30$LedgerWallet A   -30&#xA;&#xA;Wallet B   +30جمع کل-30 +30 = 0هیچ پولی خلق نشد.Sequence DiagramTransfer MoneyClient&#xA;&#xA; |&#xA;&#xA;Wallet Service&#xA;&#xA; |&#xA;&#xA;Validate Wallet&#xA;&#xA; |&#xA;&#xA;Transaction Service&#xA;&#xA; |&#xA;&#xA;Check Balance&#xA;&#xA; |&#xA;&#xA;Ledger Service&#xA;&#xA; |&#xA;&#xA;Create Debit Entry&#xA;&#xA; |&#xA;&#xA;Create Credit Entry&#xA;&#xA; |&#xA;&#xA;Commit&#xA;&#xA; |&#xA;&#xA;Publish Kafka&#xA;&#xA; |&#xA;&#xA;Notification&#xA;&#xA; |&#xA;&#xA;Return SuccessجزئیاتClient&#xA;&#xA; |&#xA;&#xA;API Gateway&#xA;&#xA; |&#xA;&#xA;Wallet Service&#xA;&#xA; |&#xA;&#xA;Ledger Service&#xA;&#xA; |&#xA;&#xA;PostgreSQL&#xA;&#xA; |&#xA;&#xA;Kafka&#xA;&#xA; |&#xA;&#xA;Notification&#xA;&#xA; |&#xA;&#xA;ClientC4 ModelLevel 1Customer&#xA;&#xA;      |&#xA;&#xA;      |&#xA;&#xA;Digital Wallet PlatformLevel 2API Gateway&#xA;&#xA;Authentication&#xA;&#xA;Wallet Service&#xA;&#xA;Ledger Service&#xA;&#xA;Transaction Service&#xA;&#xA;Notification Service&#xA;&#xA;Audit Service&#xA;&#xA;Fraud Detection&#xA;&#xA;KYC ServiceLevel 3داخل Wallet ServiceWallet API&#xA;&#xA;Wallet Validation&#xA;&#xA;Limit Checker&#xA;&#xA;Balance Calculator&#xA;&#xA;Ledger Adapter&#xA;&#xA;Transaction Coordinator&#xA;&#xA;Event PublisherADRADR-001PostgreSQL به جای MongoDecisionPostgreSQLReasonACID&#xA;&#xA;Transaction&#xA;&#xA;ConsistencyADR-002Double Entry AccountingDecisionLedgerReasonAudit&#xA;&#xA;Financial Safety&#xA;&#xA;RecoveryADR-003KafkaDecisionKafkaReasonAsync Notification&#xA;&#xA;Audit&#xA;&#xA;Analytics&#xA;&#xA;RetryADR-004RedisDecisionRedis CacheReasonBalance Cache&#xA;&#xA;Rate Limit&#xA;&#xA;SessionADR-005Idempotency Keyتمام درخواست‌های انتقال باید دارای شناسه یکتای Idempotency-Key باشند تا در صورت Retry یا دوبار کلیک کاربر، تراکنش تکراری ایجاد نشود.ADR-006Saga Patternبرای انتقال بین سرویس‌های مختلف از Saga استفاده می‌شود تا در صورت شکست بخشی از فرآیند، عملیات جبرانی (Compensation) انجام شود.DatabaseDataDatabaseUserPostgreSQLWalletPostgreSQLLedgerPostgreSQLTransactionPostgreSQLCacheRedisEventsKafkaSearchElasticsearchSequence برای TransferClient&#xA;&#xA;↓&#xA;&#xA;Gateway&#xA;&#xA;↓&#xA;&#xA;Wallet Service&#xA;&#xA;↓&#xA;&#xA;Transaction Service&#xA;&#xA;↓&#xA;&#xA;Ledger&#xA;&#xA;↓&#xA;&#xA;Commit&#xA;&#xA;↓&#xA;&#xA;Kafka&#xA;&#xA;↓&#xA;&#xA;NotificationFailure ScenariosNotification DownTransfer موفق است.&#xA;&#xA;Kafka بعداً Notification را ارسال می‌کند.Wallet Service CrashTransaction RollbackKafka Downاز Outbox Pattern استفاده می‌شود؛ ابتدا تراکنش و رویداد در یک تراکنش دیتابیس ثبت می‌شوند و سپس یک Outbox Publisher رویداد را به Kafka ارسال می‌کند. بنابراین هیچ رویدادی از دست نمی‌رود.Database CrashReplication&#xA;&#xA;Automatic FailoverDuplicate RequestIdempotency KeyConcurrent WithdrawSELECT ...&#xA;&#xA;FOR UPDATEیاOptimistic LockامنیتTLS برای تمام ارتباطاتEncryption at RestHSM برای نگهداری کلیدهاJWT + OAuth2RBACAudit Log غیرقابل تغییر (Immutable)Tokenization برای اطلاعات حساسKYC/AML و موتور تشخیص FraudBottleneckهاBottleneckSolutionLedger WritePartition بر اساس WalletId + Connection PoolBalance ReadRedis Cache با Invalidating پس از CommitNotificationKafka + Consumer GroupAuditAsync ConsumerReportingRead ReplicaHot WalletSharding بر اساس WalletId</description><category>Akhtar Sabzi</category><author>Akhtar Sabzi</author><pubDate>Mon, 20 Jul 2026 23:10:19 +0330</pubDate></item></channel></rss>