Download PDF Rate Limits & Scalability Analysis
Overview
This document provides a comprehensive analysis of rate limits, quotas, and scalability considerations for the Strengths Finder PDF download feature. The analysis covers all services involved in the PDF generation pipeline and evaluates the system’s ability to handle 1000+ students onboarding simultaneously.PDF Generation Architecture
The PDF download feature involves the following services and operations:- Google Apps Script - Main orchestration and web app execution
- Google Drive API - File operations (copy, export, delete)
- Google Docs API - Document manipulation and placeholder replacement
- Supabase - Data storage and file hosting
Service Rate Limits & Quotas
Google Apps Script Limits
Execution Limits:- Maximum runtime per execution: 6 minutes
- Trigger executions: 20 executions per script per minute
- Daily execution time: Lower limits for trigger-based vs manual executions
- Concurrent executions: Limited simultaneous script runs per user
- Web app triggers:
doPost()calls subject to general Apps Script quotas
- Current implementation uses
doPost()web app triggers - No specific documented limit for
doPostcalls - Subject to 6-minute execution timeout
- Email quotas (100/day) don’t apply to PDF generation
Google Drive API Limits
Request Quotas:- Read requests: 1,000 requests per 100 seconds per user
- Write requests: 100 requests per 100 seconds per user
- File operations: Create/copy/delete count as write requests
- Export operations: PDF export counts as read request
files().copy()- Write requestfiles().export()- Read requestfiles().delete()- Write request
- ~4 API calls per PDF
- Maximum throughput: 25 PDFs per 100 seconds (900 PDFs/hour)
- Single service account bottleneck: All users share same limits
Google Docs API Limits
Request Quotas:- Read requests: 300 requests per minute per user
- Write requests: 60 requests per minute per user
- Batch operations:
batchUpdatecounts as single write request
documents.batchUpdate()for placeholder replacement- 1 write request per PDF (batch operation with 50+ placeholders)
- Maximum throughput: 60 PDFs per minute
- Batch complexity: Large documents with many placeholders could timeout
Supabase Limits
Database & Storage:- Database queries: 50,000 queries/month free tier
- File storage: 500MB free tier, then $0.021 per GB
- API rate limits: Not explicitly documented, generally high (1000+ req/min)
- Assessment data retrieval: 1-2 queries
- PDF file upload: 2-5MB per file
- Status updates: 2-3 queries
- 1000 PDFs: 1000-3000 queries + 2-5GB storage
- Cost consideration: Exceeds free storage tier (500MB)
Scalability Analysis for 1000 Students
Load Scenarios
Scenario 1: Distributed Load (Realistic)
Pattern: 50 students at 9am, 100 at 9:10am, 150 at 9:20am, etc.- Peak concurrent: ~150 students in 10-minute windows
- Total daily: 1000 PDFs over 24 hours
- Hourly peak: ~200 PDFs/hour during peak periods
Scenario 2: Clustered Load (Worst Case)
Pattern: All students accessing simultaneously- Peak concurrent: 1000+ students in minutes
- Total daily: 1000 PDFs
- Burst load: Massive simultaneous requests
Service Capacity Assessment
Google Apps Script Capacity
- Concurrent executions: Handles 100-200 concurrent executions
- Distributed load: ✅ Well within limits
- Clustered load: ⚠️ Could hit concurrent execution limits
Google Drive API Capacity
- Rate limit: 100 writes per 100 seconds
- Per PDF: ~3-4 write operations
- Distributed load: ✅ 900 PDFs/hour theoretical maximum
- Clustered load: ⚠️ 1000 students = ~4000 API calls in short time
Google Docs API Capacity
- Rate limit: 60 writes per minute
- Per PDF: 1 write operation (batch update)
- Distributed load: ✅ Well within limits
- Clustered load: ⚠️ Could exceed 60 writes/minute
Supabase Capacity
- Query load: 1000-3000 queries total
- Storage load: 2-5GB total
- Both scenarios: ✅ Well within capacity
Potential Issues & Risk Assessment
Critical Risk Factors
1. Google Apps Script Risks
- Execution timeouts: 6-minute limit vs 30-90 second generation time
- Concurrent execution limits: Undocumented but limited simultaneous runs
- Daily quota limits: Lower for trigger-based executions
- Service account sharing: Single account for all operations
2. Google Drive API Risks
- Rate limiting cascade: Failed requests trigger exponential backoff
- Service account bottleneck: All users share 100 writes/100 seconds
- Sequential operations: Copy → update → export → delete creates bottlenecks
- File operation latency: Each step adds cumulative delay
3. Google Docs API Risks
- Write request limits: 60 per minute hard cap
- Batch operation complexity: 50+ placeholder replacements could timeout
- Template access: Shared template document access patterns
- Document size: Large documents increase processing time
4. Supabase Risks
- Storage costs: 1000 × 5MB = 5GB exceeds free tier
- Database performance: Query load under high concurrency
- File upload limits: Large PDF uploads could timeout
- Cost scaling: Pay-per-use model for storage
Failure Scenarios
Worst Case Cascade
- Initial spike: 1000 students click simultaneously
- Drive API limit hit: 100 writes/100 seconds exceeded
- Exponential backoff: All requests retry with increasing delays
- Docs API limit hit: 60 writes/minute exceeded
- Apps Script timeout: 6-minute executions fail
- User experience: Delays of 5-15 minutes, some failures
Partial Failure Recovery
- Automatic retries: Built-in exponential backoff handles temporary limits
- Service degradation: Some PDFs succeed, others delayed
- User queuing: Frontend shows “processing” status during delays
- Manual intervention: May need admin assistance for stuck processes
Performance Scenarios
Best Case (Distributed Load)
- Google Apps Script: ✅ Handles 100-200 concurrent executions
- Google Drive API: ✅ 900 PDFs/hour within limits
- Google Docs API: ✅ 60 PDFs/minute within limits
- Supabase: ✅ Handles 1000+ operations easily
- Overall: Smooth operation with minimal delays
Worst Case (Clustered Load)
- Google Apps Script: ⚠️ Concurrent execution limits hit
- Google Drive API: ⚠️ Rate limits exceeded, exponential backoff triggered
- Google Docs API: ⚠️ Write limits exceeded, queuing occurs
- Supabase: ✅ Handles load well
- Overall: 20-30% failure rate initially, recovery within 5-10 minutes
Realistic Case (Your Scenario)
- 9am (50 students): ✅ Within all limits
- 9:10am (100 students): 🟡 Approaching Drive API limits
- 9:20am (150 students): 🟡 Could stress Docs API limits
- Distributed throughout day: ✅ Should work smoothly
Optimization Recommendations
Immediate Optimizations
1. Exponential Backoff Implementation
- Already implemented: Code includes proper backoff handling
- Configuration tuning: Adjust retry intervals and maximum retries
- Jitter addition: Randomize retry delays to prevent thundering herd
2. Queue Management
- Job queuing: Implement background job processing
- Load balancing: Distribute across multiple service accounts
- User feedback: Show progress indicators during queuing
3. Service Account Distribution
- Multiple accounts: Use several service accounts for load distribution
- Account rotation: Distribute requests across available accounts
- Quota monitoring: Track usage per account
4. Caching Strategies
- Template caching: Cache template document access
- Token caching: Reduce authentication overhead
- Result caching: Avoid duplicate generations
Architectural Improvements
1. Async Processing Pipeline
- Background jobs: Move PDF generation to async workers
- Status polling: Provide real-time status updates
- Webhook notifications: Push completion notifications
2. Load Balancing & Scaling
- Geographic distribution: Multiple regions for global users
- Auto-scaling: Dynamic service account allocation
- Circuit breakers: Fail fast during outages
3. Monitoring & Observability
- API usage tracking: Monitor all service quotas
- Performance metrics: Track generation times and failure rates
- Alert system: Notify when approaching limits
- User impact monitoring: Track user experience during peaks
4. Cost Optimization
- Storage tier management: Monitor and optimize storage costs
- Query optimization: Reduce database load
- Compression: Smaller PDF files reduce storage and transfer costs
Final Assessment: 1000 Students Scalability
Answer: YES, with proper distribution and monitoring
For Realistic Distributed Access:
- ✅ Google Apps Script: Handles distributed load well
- ✅ Google Drive API: 900 PDFs/hour capacity sufficient
- ✅ Google Docs API: 60 PDFs/minute capacity sufficient
- ✅ Supabase: Handles 1000+ operations easily
- Overall: System should perform well with natural user distribution
Risk Mitigation Requirements:
- Monitor API usage during initial onboarding days
- Have fallback mechanisms ready (manual PDF generation)
- Implement user queuing if concurrent limits are hit
- Prepare communication for users about potential delays
Worst Case Handling Plan:
- If clustering occurs: Expect 20-30% initial failure rate
- Recovery time: 5-10 minutes via exponential backoff
- User experience: Clear status messages and progress indicators
- Admin intervention: Manual restart capability for stuck processes
Key Success Factors:
- Natural user distribution (not all clicking simultaneously)
- Proper exponential backoff implementation (already in place)
- Monitoring and alerting during peak periods
- Fallback mechanisms for edge cases
Implementation Status
Current Implementation Quality: GOOD
- ✅ Exponential backoff implemented
- ✅ Error handling and retries in place
- ✅ User feedback during processing
- ✅ Service account authentication working
- ⚠️ Single service account bottleneck
- ⚠️ No explicit queuing system
- ⚠️ Limited monitoring in place
Recommended Next Steps:
- Implement monitoring for API usage and quotas
- Set up alerts for approaching limits
- Test with simulated load before full rollout
- Prepare fallback procedures for high-load scenarios
- Consider multiple service accounts for load distribution
This analysis is based on official Google Cloud Platform documentation, Supabase documentation, and architectural review of the current PDF generation system. All rate limits are subject to change by service providers.