ویرگول
ورودثبت نام
Akhtar Sabzi
Akhtar Sabzi
Akhtar Sabzi
Akhtar Sabzi
خواندن ۳ دقیقه·۴ ماه پیش

chat

High Level Requirements

Functional

  • User Authentication

  • One-to-One Chat

  • Group Chat

  • Online Presence

  • Read/Delivered Status

  • Typing Indicator

  • Push Notification

  • Media Upload

  • Message History

  • Search Conversation


Non Functional

  • High Availability (99.99%)

  • Horizontal Scalability

  • Low Latency (<100ms)

  • Eventual Consistency

  • Fault Tolerance

  • Secure Communication

  • Multi Region

  • Millions of concurrent connections


Capacity Estimation

فرض کنیم

100 Million Users 10 Million Daily Active Users 1 Million Concurrent Connections Average Message Size = 1 KB 100 Messages/User/Day

Traffic

10M ×100 =1 Billion Messages/Day ≈11,600 Message/sec Average Peak ≈100,000 Message/sec

بنابراین طراحی باید حداقل

100K Write/sec

را پاسخ دهد.


High Level Architecture

+----------------+ | Mobile/Web App | +-------+--------+ | HTTPS / WebSocket | +---------v---------+ | Global LoadBalancer| +---------+---------+ | +-------------------+------------------+ | | +-------v------+ +---------v-------+ | API Gateway | | WebSocket Gateway| +-------+------+ +---------+--------+ | | | | | Persistent Connections | | +-------v--------------------------------------v------+ | Chat Service Cluster | +--------+---------+----------+-----------+-----------+ | | | | | | | | | | | | +--------v+ +----v----+ +---v----+ +----v-----+ |Presence | |Message | |Group | |Media | |Service | |Service | |Service | |Service | +----+----+ +----+----+ +----+---+ +----+-----+ | | | | | | | | | +------v-----------v----------+ | | Kafka / Event Bus | | +-------------+---------------+ | | +----v-----+ +-----v------+ |Redis | |Notification| |Cluster | |Service | +----+-----+ +-----+------+ | | | APNS / FCM | +----v----------------------------+ | Cassandra / Scylla / DynamoDB | +---------------------------------+ Media | S3 / Object Storage

C4 Context Diagram

+----------------------+ | User | +----------+-----------+ | | Uses Chat System | +----------v-----------+ | Chat Platform | +----------+-----------+ | +--------------------+--------------------+ | | | | | | +-----v----+ +------v-----+ +-------v------+ |Push | |Object | |Identity | |Provider | |Storage | |Provider | |(FCM/APNS) | |(S3) | |OAuth/JWT) | +-----------+ +------------+ +--------------+

C4 Container Diagram

+------------------+ | API Gateway | +--------+---------+ | +-----------+-----------+-----------+ | | | | | | | | +-----v--+ +-----v---+ +-----v---+ +-----v-----+ |AuthSvc | |ChatSvc | |GroupSvc | |PresenceSvc| +-----+--+ +-----+---+ +-----+---+ +-----+-----+ | | | | +-----------+-----------+-----------+ | Kafka Cluster | +--------------+---------------+ | | +------v------+ +-------v------+ |Notification | |Analytics | +-------------+ +--------------+ | +-------v--------+ | Cassandra | +----------------+

Sequence Diagram (Send Message)

User A | | Send Message | v Gateway | | Authenticate | v Chat Service | | Persist Message | v Database | | OK | v Kafka | +----------------------------+ | | v v Notification Presence Service | | | | v | Recipient Online? | | | |Yes | | | v | WebSocket Push | | | Recipient Offline | v Push Notification

Entity Diagram

+-------------+ | User | +-------------+ | id | | username | | status | | lastSeen | +------+------+ | |1 | |N +------v------+ |Conversation | +-------------+ | id | | type | | createdAt | +------+------+ | |1 | |N +------v------+ | Message | +--------------+ | id | | senderId | | content | | type | | sentAt | | status | +------+-------+ | | |N | |1 +------v------+ | Attachment | +-------------+ | id | | url | | size | | mimeType | +-------------+ Conversation 1 | N ConversationMember N | 1 User

Database Choice

DataStorageMessagesCassandra / ScyllaUser ProfilePostgreSQLPresenceRedisCacheRedis ClusterMediaS3SearchElasticsearch


Kafka Topics

message-created message-delivered message-read user-online user-offline typing-event notification-event media-uploaded

Cache Strategy

Redis

Online Users Conversation Cache Unread Counter Recent Messages Session Token Rate Limiter

Sharding Strategy

Conversation Based

Shard = hash(conversationId)

مزایا


  • تمام پیام‌های یک گفتگو روی یک شارد


  • Query ساده


  • ترتیب پیام‌ها حفظ می‌شود


Message Flow

Client ↓ Gateway ↓ Chat Service ↓ Kafka ↓ Database ↓ Redis Update ↓ Notification ↓ Receiver

ADR (Architecture Decision Records)

ADR-001

Decision

استفاده از WebSocket برای ارتباط Real-Time.

Reason


  • Full Duplex


  • Latency پایین


  • کاهش هزینه نسبت به Polling


ADR-002

Decision

ذخیره پیام‌ها در Cassandra/ScyllaDB.

Reason


  • Write Throughput بسیار بالا


  • Horizontal Scaling


  • Partitioning داخلی


  • مناسب Time-Series Data


ADR-003

Decision

استفاده از Kafka برای Event Streaming.

Reason


  • Loose Coupling


  • Retry


  • Replay


  • Back Pressure


  • Event Driven Architecture


ADR-004

Decision

استفاده از Redis برای Presence.

Reason


  • عملیات In-Memory


  • TTL


  • سرعت بسیار بالا


ADR-005

Decision

Media در Object Storage.

Reason


  • کاهش حجم دیتابیس


  • CDN Integration


  • ارزان‌تر


  • Scalability بالا


ADR-006

Decision

Horizontal Scaling برای Chat Service.

Reason


  • Stateless Service


  • Auto Scaling


  • Load Distribution


Failure Scenarios

FailureSolutionChat Service DownLoad Balancer + Auto ScalingKafka DownReplication + ISRRedis DownRedis Cluster + ReplicaDatabase Node DownMulti ReplicaGateway FailureMultiple Gateway InstancesRegion FailureMulti-Region DeploymentMessage DuplicationIdempotency KeyMessage OrderingPartition by ConversationId


Trade-offs

ChoiceProsConsWebSocketReal-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ها) را پوشش می‌دهد.

api gateway
۰
۰
Akhtar Sabzi
Akhtar Sabzi
شاید از این پست‌ها خوشتان بیاید