| Service DesignFunctional RequirementService(s) ResponsiblePriorityScaling Characteristics | |||
| User Authentication | Auth Service | Critical | Read-heavy, cacheable tokens |
| Profile Management | User Service | High | Read-heavy, occasional writes |
| Workout Recording | Activity Service, Sensor Processor | Critical | Write-heavy, high-volume |
| Offline Tracking | Offline Sync Manager | High | Burst processing, conflict resolution |
| Goal Setting | Goal Service | Medium | Balanced read/write |
| Progress Visualization | Progress Service, Analytics Service | Medium | Read-heavy, computation intensive |
| Social Connections | Social Graph Service | Low | Graph operations, relationship-focused |
| Content Sharing | Feed Service | Low | Read-heavy, fan-out writes |
| Personalized Recommendations | Recommendation Engine, ML Pipeline | Medium | Compute-intensive, batch processing |
| Notifications & Reminders | Notification Service, Reminder Service | Medium | High throughput, time-sensitive |
| Device Integration | Device Service | High | Protocol translation, data normalization |
| Specialized Fitness Programs | Health Condition Adapter | Medium | Personalization-focused, rule-based |
| DomainResourceEndpointsVersioning | |||
| User | /users | GET, POST, PATCH, DELETE | v2 |
| Authentication | /auth | POST /login, POST /refresh, POST /logout | v1 |
| Activities | /activities | GET, POST, PATCH, DELETE | v3 |
| Goals | /goals | GET, POST, PATCH, DELETE | v2 |
| Social | /social | GET /feed, GET /connections, POST /share | v1 |
| Devices | /devices | GET, POST, DELETE, POST /sync | v2 |
| Recommendations | /recommendations | GET /workouts, GET /plans | v1 |
Record Activity with Advanced Metricsコピー
POST /v3/activities
Content-Type: application/json
Authorization: Bearer {token}
Request Body:
{
"activity_type": "strength_training",
"start_time": "2025-03-28T16:30:00Z",
"end_time": "2025-03-28T17:15:00Z",
"metrics": {
"energy_expenditure": {
"calories": 320,
"confidence": 0.92
},
"heart_rate": {
"avg": 142,
"max": 165,
"zones": [
{"zone": "easy", "time_seconds": 360},
{"zone": "moderate", "time_seconds": 1200},
{"zone": "intense", "time_seconds": 540}
]
},
"exercises": [
{
"name": "bench_press",
"sets": [
{"weight_kg": 80, "reps": 10, "rest_seconds": 90},
{"weight_kg": 85, "reps": 8, "rest_seconds": 120},
{"weight_kg": 90, "reps": 6, "rest_seconds": 150}
],
"muscle_activation": {
"pectoralis_major": 0.85,
"anterior_deltoid": 0.65,
"triceps_brachii": 0.55
},
"form_quality": 0.88
}
// Additional exercises...
]
},
"device_id": "garmin-fenix7-a12b3c",
"notes": "Felt strong today, increased weight on final set",
"training_factors": {
"sleep_quality": "good",
"nutrition_status": "well_fueled",
"stress_level": "low"
},
"location": {
"venue_id": "gym-123456",
"coordinates": {"lat": 37.7749, "lng": -122.4194}
}
}
Response (200 OK):
{
"activity_id": "act-28a7eb9c420d",
"status": "recorded",
"processing_status": {
"metrics_calculated": true,
"insights_generated": "pending",
"goal_progress_updated": true
},
"achievements": [
{
"id": "bench-press-personal-best",
"title": "New Personal Best: Bench Press",
"description": "You lifted 90kg, beating your previous best of 85kg"
}
],
"goal_impacts": [
{
"goal_id": "goal-78ad23",
"title": "Weekly Strength Training",
"progress": {
"before": 0.66,
"after": 0.83,
"units": "completion_percentage"
}
}
],
"recommendations": {
"recovery": {
"recommended_recovery_time_hours": 48,
"focus_areas": ["chest", "shoulders"]
},
"next_workout": {
"suggested_exercise_focus": "lower_body",
"earliest_recommended_date": "2025-03-30T16:00:00Z"
}
}
}
Error Responses:
400: Invalid activity data
{
"error": "validation_error",
"message": "Invalid activity data",
"details": [{"field": "metrics.exercises[0].sets[1].weight_kg", "issue": "value must be numeric"}]
}
401: Unauthorized
409: Conflicting activity record
{
"error": "conflict",
"message": "An activity already exists within this time range",
"conflicting_activity_id": "act-7862de1"
}
429: Rate limit exceeded
{
"error": "rate_limited",
"message": "Too many activity creations",
"retry_after": 5
}
Get Personalized Recommendations
コピー
GET /v1/recommendations/workouts
Content-Type: application/json
Authorization: Bearer {token}
Query Parameters:
goal_focus: "strength" | "endurance" | "flexibility" | "weight_loss" | "overall"
time_available_minutes: Integer (default: 60)
equipment_available: Comma-separated list (default: "none")
location: "home" | "gym" | "outdoors" (default: "home")
intensity_preference: "light" | "moderate" | "challenging" (default: "moderate")
Response (200 OK):
{
"recommendations": [
{
"id": "rec-34ab72d1",
"title": "Upper Body Strength Circuit",
"description": "A balanced upper body workout with focus on compound movements",
"duration_minutes": 45,
"difficulty": "moderate",
"equipment_needed": ["dumbbells", "resistance_bands"],
"muscle_groups": ["chest", "back", "shoulders", "arms"],
"energy_expenditure": {
"estimated_calories": 320,
"range": {"min": 280, "max": 380}
},
"exercises": [
{
"name": "dumbbell_bench_press",
"sets": 3,
"reps": "8-10",
"weight_guidance": "80% of your 12RM",
"demonstration_video_url": "/assets/videos/dumbbell_bench_press.mp4",
"alternatives": ["push_ups", "chest_press_machine"]
},
// More exercises...
],
"personalization_factors": [
"Based on your strength progress in the last 14 days",
"Adjusted for your recovery status (well recovered)",
"Complementary to your Tuesday workout pattern"
],
"user_ratings": {
"average": 4.7,
"count": 1243
}
},
// Additional recommendations...
],
"meta": {
"recommendation_freshness": "generated_today",
"algorithm_version": "v2.3",
"filtering_applied": ["excluded_recently_completed", "adjusted_for_equipment"]
}
}
Error Responses:
400: Invalid parameters
401: Unauthorized
404: No suitable recommendations found
{
"error": "no_recommendations",
"message": "No suitable workouts found for the specified parameters",
"suggestions": [
"Try increasing available time",
"Add more available equipment options"
]
}
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 enhanced architecture implements a domain-driven design with bounded contexts, clear service boundaries, and specialized components for handling key requirements.
| Non-Functional RequirementArchitecture DecisionRationale | ||
| Consistent sub-100ms response times | Edge computing for sensor processing | Reduces latency by processing data closer to the source |
| 99.99% availability for core tracking | Multi-region active-active deployment | Eliminates single points of failure with geographic redundancy |
| Support for 5M DAU | Horizontal service scaling with stateless design | Allows independent scaling based on domain-specific load |
| Zero data loss for user workouts | Write-ahead logging with eventual consistency | Prioritizes availability while ensuring data durability |
| Security compliance (HIPAA/GDPR) | Domain-based data partitioning with encryption | Enables region-specific compliance with strong protection |
| Offline functionality | Client-side event sourcing with CRDT data structures | Permits conflict-free updates during disconnected operation |
| Adaptive performance | Circuit breakers with degraded service modes | Maintains core functionality during partial system failures |
| Scalable social features | Graph database with materialized views | Optimizes complex social queries with precomputed results |
The architecture has evolved to include:
The feature engineering pipeline transforms raw user data into machine learning features:
| 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?