One-on-one and group chat: Support text, images, videos, voice messages, and file sharing.
Presence: Show online/offline status.
Push notifications: For new messages and other events.
Message history: Store and retrieve past conversations.
Read receipts: Indicate message delivery and read status.
Calls and video calls: Real-time audio and video communication.
Low latency: Real-time message delivery.
High availability: Minimal downtime.
Scalability: Handle millions of concurrent users.
Reliability: Ensure message delivery and consistency.
Security: End-to-end encryption, user authentication.
1 million daily active users
Average 10 messages sent per user per day
Peak hours with 20% of users active simultaneously
Daily messages: 1 million users * 10 messages/user = 10 million messages
Messages per second (average): 10 million messages / 86400 seconds/day ≈ 116 messages/second
Peak concurrent users: 1 million users * 20% = 200,000 users
Peak messages per second: 116 messages/second * (200,000 users / 1 million users) = 232 messages/second
Send a message:
POST /v1/conversations/{conversation_id}/messages
Get a message:
GET /v1/conversations/{conversation_id}/messages?limit=20
Update user profile:
PUT /v1/users/{user_id}
Users table:
Messages table:
Conversations table:
Participants table:
Connection: When a user opens Messenger, the client establishes a WebSocket connection with the Chat Service. This connection is persistent and bi-directional.
Authentication: The client authenticates with the API Gateway, which verifies the user's identity.
Real-time Messaging:
Offline Messages:
History Service:
Notifications:
Additional Considerations:
History Service
. Chat Service
. NoSQL (Cassandra) vs. SQL Database for History Service
Redis vs. Memcached for Presence Service
WebSocket Connection Failures:
Publish-Subscribe System (Kafka) Failures:
Kafka/RabbitMQ Failures: Utilize robust monitoring and alerting systems to quickly detect and address issues. Implement automatic failover mechanisms for brokers and queues.
Cassandra Failures: Employ multi-data center replication to ensure high availability even in case of regional outages. Regularly perform disaster recovery drills to test resilience.