| Functional RequirementService(s) ResponsiblePriority | ||
| User Management | Auth Service, User Service | High |
| Activity Tracking | Activity Service, Device Integration | High |
| Goal Setting | Goal Service | Medium |
| Progress Monitoring | Goal Service, Analytics Service | Medium |
| Social Interaction | Social Service | Low |
| Device Integration | Device Integration Service | High |
| Notifications | Notification Service | Medium |
| ServiceAPI EndpointPurposeConsumers | |||
| Auth Service | POST /auth/register | Create new user | Mobile/Web Apps |
| Auth Service | POST /auth/login | Authenticate user | Mobile/Web Apps |
| User Service | GET /users/{id} | Get user profile | Mobile/Web Apps, Social Service |
| Activity Service | POST /activities | Record new activity | Mobile/Web Apps, Device Service |
| Activity Service | GET /activities | Get activity history | Mobile/Web Apps, Analytics Service |
| Goal Service | POST /goals | Create new goal | Mobile/Web Apps |
| Goal Service | GET /goals/{id}/progress | Check goal progress | Mobile/Web Apps, Notification Service |
| Social Service | POST /social/follows | Follow another user | Mobile/Web Apps |
| Social Service | GET /social/feed | Get social activity feed | Mobile/Web Apps |
| Notification Service | GET /notifications | Get user notifications | Mobile/Web Apps |
| Device Service | POST /devices/sync | Sync device data | Mobile/Web Apps, Wearables |
Record Activity : Log a new fitness activityPOST /activities
Parameters/Body:
- activity_type: String (running, cycling, etc.), required
- start_time: Timestamp, required
- end_time: Timestamp, required
- metrics: Object containing:
- distance_km: Number, optional
- calories: Number, optional
- steps: Integer, optional
- heart_rate_avg: Number, optional
- location_data: Array of coordinates, optional
- device_id: String, optional
Returns:
- activity_id: String, unique identifier
- status: "success" or error code
- achievements: Array of unlocked achievements, if any
Error Handling:
- 400: Invalid input
- 401: Unauthorized
- 500: Server error
Authentication:
- Requires valid user token
Create Goal : Set a new fitness goal
POST /goals
Parameters/Body:
- goal_type: String (distance, duration, etc.), required
- target_value: Number, required
- unit: String (km, minutes, etc.), required
- timeframe: String (daily, weekly, monthly), required
- start_date: Date, required
- end_date: Date, optional
Returns:
- goal_id: String, unique identifier
- status: "success" or error code
Error Handling:
- 400: Invalid input
- 401: Unauthorized
- 500: Server error
Authentication:
- Requires valid user token
Data EntityStorage SolutionAccess PatternRationaleUser ProfilesPostgreSQLRead-heavy, relationalData has relational integrity needsActivity RecordsMongoDBWrite-heavy, document-basedSemi-structured data with varying attributesSensor DataTimescaleDBHigh-volume time-seriesOptimized for time-series queriesGoals & ProgressPostgreSQLRead/write balancedTransactional updates neededSocial GraphNeo4jGraph traversalOptimized for relationship queriesMedia FilesObject Storage (S3)Write once, read manyCost-effective for binary data
Users Table (PostgreSQL)
CREATE TABLE users (
user_id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(255),
birthdate DATE,
height_cm INTEGER,
weight_kg DECIMAL(5,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
preferences JSONB
);
Activities Collection (MongoDB)
{
"_id": "ObjectId",
"user_id": "UUID",
"activity_type": "String",
"start_time": "ISODate",
"end_time": "ISODate",
"duration_seconds": "Number",
"metrics": {
"distance_km": "Number",
"calories": "Number",
"steps": "Number",
"heart_rate_data": [{"time": "ISODate", "value": "Number"}]
},
"location_data": [{"timestamp": "ISODate", "lat": "Number", "lng": "Number"}],
"device_id": "String"
}
Goals Table (PostgreSQL)
CREATE TABLE goals (
goal_id UUID PRIMARY KEY,
user_id UUID REFERENCES users(user_id),
goal_type VARCHAR(50) NOT NULL,
target_value DECIMAL(10,2) NOT NULL,
current_value DECIMAL(10,2) DEFAULT 0,
unit VARCHAR(50) NOT NULL,
start_date DATE NOT NULL,
end_date DATE,
status VARCHAR(50) DEFAULT 'active'
);
The architecture follows a microservices pattern with clear separation of concerns.
| Non-Functional RequirementArchitecture Decision/ComponentRationale | ||
| Scalability (10M users) | Microservices architecture | Each service can scale independently based on demand |
| High Availability (99.9%) | Multi-AZ deployment with auto-scaling | Ensures resilience against zone failures |
| Low Latency (<500ms) | CDN + Regional caching + Read replicas | Reduces network latency and database load |
| Data Security | API Gateway with centralized auth, encryption | Single point for security enforcement |
| Strong Consistency (critical data) | PostgreSQL for user and goal data | ACID transactions for important user data |
| Eventual Consistency (analytics) | MongoDB and event-driven design | Prioritizes availability and performance |
| Offline Support | Local storage + sync queue | Ensures functionality without network connectivity |
| Regulatory Compliance | Data partitioning by region | Helps meet data residency requirements |
flowchart TD
subgraph Client["Client Layer"]
MobileApp["Mobile Apps\niOS/Android"]
WebApp["Web Application"]
Wearables["Wearable Devices\nWatches/Bands"]
end
subgraph Gateway["API Layer"]
APIGateway["API Gateway\nRouting/Auth/Rate Limiting"]
CDN["CDN\nStatic Assets"]
end
subgraph Services["Service Layer"]
AuthService["Auth Service\nRegistration/Login"]
UserService["User Service\nProfiles/Preferences"]
ActivityService["Activity Service\nWorkout Tracking"]
GoalService["Goal Service\nTargets/Progress"]
SocialService["Social Service\nFriends/Sharing"]
NotificationService["Notification Service\nReminders/Alerts"]
DeviceService["Device Integration\nWearables/Sensors"]
AnalyticsService["Analytics Service\nInsights/Reports"]
end
subgraph DataStorage["Data Layer"]
UserDB[(User DB\nPostgreSQL)]
ActivityDB[(Activity DB\nMongoDB)]
GoalDB[(Goal DB\nPostgreSQL)]
SocialDB[(Social Graph\nNeo4j)]
AnalyticsDB[(Analytics\nClickhouse)]
Cache[(Cache\nRedis)]
BlobStorage[(Media Storage\nS3/Blob)]
TimeSeriesDB[(Sensor Data\nTimescaleDB)]
end
subgraph Infra["Infrastructure Layer"]
MQ["Message Queue\nKafka"]
PushNotifications["Push Notification\nSystem"]
Monitoring["Monitoring & Logging"]
ML["ML Pipeline"]
end
%% Client connections
MobileApp --> APIGateway
WebApp --> APIGateway
MobileApp --> CDN
WebApp --> CDN
Wearables --> DeviceService
%% API Gateway routing
APIGateway --> AuthService
APIGateway --> UserService
APIGateway --> ActivityService
APIGateway --> GoalService
APIGateway --> SocialService
APIGateway --> NotificationService
APIGateway --> DeviceService
APIGateway --> AnalyticsService
%% Service to database connections
AuthService --> UserDB
UserService --> UserDB
UserService --> BlobStorage
ActivityService --> ActivityDB
ActivityService --> TimeSeriesDB
GoalService --> GoalDB
SocialService --> SocialDB
SocialService --> BlobStorage
NotificationService --> Cache
DeviceService --> TimeSeriesDB
AnalyticsService --> AnalyticsDB
%% Cache connections
UserService --> Cache
ActivityService --> Cache
GoalService --> Cache
SocialService --> Cache
%% Async connections
ActivityService --> MQ
GoalService --> MQ
DeviceService --> MQ
MQ --> AnalyticsService
MQ --> NotificationService
NotificationService --> PushNotifications
AnalyticsService --> ML
ML --> AnalyticsService
flowchart TD
A[User Device] -->|"Activity Data\n(JSON Payload)"| B[Data Ingestion API]
subgraph Validation["Validation Layer"]
B --> C[Schema Validator]
C --> D{Data Valid?}
D -->|No| E[Error Handler]
D -->|Yes| F[Data Normalizer]
end
subgraph Processing["Processing Layer"]
F --> G[Metrics Calculator]
F --> H[GPS Processor]
G --> I[Enrichment Service]
H --> I
I --> J[ML Calorie Estimator]
end
subgraph Storage["Storage Layer"]
J --> K[Activity Writer]
K --> L[(Activity DB)]
K --> M[(Time-Series DB)]
K --> N[Event Publisher]
end
subgraph Consumers["Downstream Consumers"]
N --> O[Message Queue]
O --> P[Goal Updater]
O --> Q[Achievement Processor]
O --> R[Analytics Engine]
O --> S[Social Feed Updater]
end
E -->|"Retry or\nError Response"| T[Client Error Handler]
T --> A
The Activity Processing Pipeline is a critical component that handles high-volume workout data:
| ServiceTechnologies UsedAlternatives ConsideredDecision Rationale | |||
| API Gateway | Kong | AWS API Gateway, Apigee | Better customization, open-source flexibility |
| Auth Service | Node.js, JWT | Spring Boot, Auth0 | Developer productivity, ecosystem support |
| User Service | Go, PostgreSQL | Java, MySQL | Performance, type safety for CRUD operations |
| Activity Service | Scala, MongoDB | Node.js, Cassandra | Concurrency model, schema flexibility |
| Goal Service | Go, PostgreSQL | Python, MongoDB | Transaction support, query capabilities |
| Device Integration | Rust, gRPC | C++, REST | Performance, protocol efficiency |
| Analytics Service | Python, Spark | R, Hadoop | ML libraries, data processing capabilities |
| Client Apps | React Native | Native iOS/Android | Faster development, code sharing |
MongoDB vs. PostgreSQL for Activity Data
Kafka vs. RabbitMQ for Messaging
| Failure ScenarioImpactMitigation StrategyRecovery Time | |||
| Activity Service Down | Users can't log workouts | Client-side queuing with local storage | Immediate for tracking, sync when recovered |
| Database Failure | Data unavailability | Automatic failover to replicas | <30 seconds |
| Cache Failure | Increased DB load | Circuit breaker pattern, graceful degradation | <1 minute |
| Message Queue Failure | Async processing delayed | Message persistence, replay capability | <5 minutes |
| CDN Outage | Media content unavailable | Multi-CDN strategy with fallback | <5 minutes |
| Regional Outage | Service unavailability in region | Multi-region deployment | <30 minutes for full recovery |
What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?