Architecture Overview
Formbricks is designed as a stateless application that can scale horizontally. The architecture consists of: Key Components:- Formbricks Instances: Stateless Next.js application (multiple replicas)
- PostgreSQL: Shared database (single primary or HA cluster)
- Redis/Valkey: Shared cache and session store
- Object Storage: File uploads (S3, MinIO, etc.)
- Load Balancer: Distributes traffic across instances
Formbricks is stateless, meaning any instance can serve any request. All state is stored in PostgreSQL and Redis.
When to Scale
Consider horizontal scaling when you experience:- High Response Volume: >100,000 survey responses per day
- Concurrent Users: >500 active survey takers simultaneously
- CPU/Memory Pressure: Single instance reaching 70%+ utilization
- Response Time Degradation: API latency increasing
- Availability Requirements: Need for zero-downtime deployments
Kubernetes Scaling (Recommended)
Horizontal Pod Autoscaler (HPA)
The Formbricks Helm chart includes built-in HPA configuration:values.yaml
- HPA monitors CPU and memory metrics from Kubernetes metrics server
- When utilization exceeds 60%, new pods are automatically created
- When utilization drops, pods are gradually removed (with stabilization)
- Minimum of 2 replicas ensures high availability
Pod Disruption Budget (PDB)
Prevent disruptions during maintenance:values.yaml
- Prevents all pods from being evicted simultaneously
- Ensures availability during cluster upgrades
- Protects against node drains
Resource Requests and Limits
Define resource requirements per pod:values.yaml
- Set
requestsbased on average usage - Set
limits.memoryto prevent OOM kills - Omit
limits.cputo avoid CPU throttling (Kubernetes recommendation) - Monitor actual usage and adjust
Multi-Zone Deployment
Distribute pods across availability zones for fault tolerance:values.yaml
- Spreads pods evenly across availability zones
- Ensures pods are on different nodes when possible
- Survives zone-level failures
Docker Compose Scaling
For Docker Compose deployments, manually scale services:Docker Swarm (Recommended for Docker)
docker-compose.yml
nginx.conf
Traditional Docker Compose
Without Swarm, use external load balancer:Load Balancing Strategies
Algorithm Selection
Choose the right load balancing algorithm:| Algorithm | Best For | Description |
|---|---|---|
| Round Robin | Equal capacity instances | Distributes requests sequentially |
| Least Connections | Variable request duration | Routes to instance with fewest connections |
| IP Hash | Session affinity needs | Same client IP always goes to same instance |
| Least Response Time | Mixed workloads | Routes to fastest responding instance |
Session Affinity (Sticky Sessions)
Formbricks uses Redis for session storage, so sticky sessions are NOT required. However, they can reduce Redis load:Database Scaling
PostgreSQL Performance
Formbricks queries are optimized for read-heavy workloads: Connection Pooling:- 3 instances × 20 connections = 60 total connections
- Ensure PostgreSQL
max_connections> total connections needed - Typical PostgreSQL setting:
max_connections = 100-200
PostgreSQL High Availability
Options for HA PostgreSQL:-
Cloud Managed (Recommended):
- AWS RDS Multi-AZ
- Google Cloud SQL HA
- Azure Database for PostgreSQL
- Automated failover and backups
-
Self-Managed:
- Patroni + etcd/Consul
- Stolon
- Repmgr
- PostgreSQL streaming replication
-
Kubernetes:
- CloudNativePG operator
- Zalando PostgreSQL operator
- Bitnami PostgreSQL HA Helm chart
Redis Scaling
Redis Configuration for HA
Formbricks uses Redis for:- Cache storage (response caching, query results)
- Rate limiting
- Audit logs (when enabled)
- Session storage
- Distributed locks (for license checks, telemetry)
- Redis Sentinel: Automatic failover with monitoring
- Redis Cluster: Sharding for large datasets (likely overkill for Formbricks)
- Managed Redis: AWS ElastiCache, Google Memorystore, Azure Cache
Formbricks is resilient to Redis failures. If Redis is unavailable:
- Cache misses fall back to database queries
- Rate limiting may be degraded
- Sessions may be lost (users logged out)
External Redis/Valkey
Use external Redis for production:Object Storage Scaling
For file uploads at scale, use S3-compatible storage:- Unlimited storage capacity
- No local disk I/O overhead
- Automatic replication and durability
- CDN integration for fast delivery
Monitoring & Observability
OpenTelemetry Metrics
Formbricks includes built-in OpenTelemetry support:apps/web/instrumentation-node.ts:1
Prometheus Metrics
Expose Prometheus metrics for Kubernetes monitoring:values.yaml
- HTTP request duration and count
- Database query performance
- Redis cache hit/miss rates
- Node.js runtime metrics (heap, event loop lag)
- Custom application metrics
Health Checks
Formbricks exposes health endpoints:Performance Optimization
Next.js Caching Strategy
Formbricks uses Reactcache() for request-level caching:
- React Cache: Request-level deduplication
- Redis Cache: Cross-request caching for expensive queries
- PostgreSQL: Database-level query caching
packages/cache/src/cache-keys.ts:11
Database Query Optimization
Formbricks follows strict database patterns:Optimized Query Patterns:
- Never use
skip/offsetwithprisma.response.count()(causes table scans) - Always use cursor-based pagination for large datasets
- Filter by indexed fields (
surveyId,createdAt) - Run count and data queries in parallel with
Promise.all
apps/web/app/api/(internal)/pipeline/lib/telemetry.ts:144
Rate Limiting
Formbricks includes built-in rate limiting:apps/web/modules/core/rate-limit/rate-limit.ts:87
Scaling Checklist
Assess Current Performance
- Monitor CPU, memory, and database metrics
- Identify bottlenecks (application, database, Redis)
- Establish baseline performance metrics
Optimize Single Instance
- Tune PostgreSQL configuration (connection pooling, query cache)
- Configure Redis eviction policies
- Enable Prometheus metrics for visibility
- Optimize slow database queries
Prepare for Horizontal Scaling
- Migrate to external PostgreSQL (managed service recommended)
- Migrate to external Redis/Valkey
- Configure S3 for file uploads
- Set up health check endpoints
Deploy Multiple Instances
- Start with 2 replicas for high availability
- Configure load balancer with health checks
- Enable session affinity (optional)
- Test failover scenarios
Enable Autoscaling
- Configure HPA with CPU/memory targets
- Set appropriate min/max replica counts
- Configure Pod Disruption Budget
- Test scale-up and scale-down behavior
Performance Benchmarks
Typical performance for a properly configured instance:| Metric | Single Instance (2 CPU, 2GB RAM) | Scaled (3 instances) |
|---|---|---|
| Survey Responses/sec | ~50 | ~150 |
| Concurrent Users | ~200 | ~600 |
| API Response Time (p95) | <200ms | <150ms |
| Database Connections | ~20 | ~60 |
Actual performance varies based on survey complexity, response data size, and infrastructure configuration.
Troubleshooting
Database Connection Pool Exhausted
Database Connection Pool Exhausted
Symptoms:
Error: Connection pool timeoutSolutions:- Increase connection limit in DATABASE_URL:
connection_limit=30 - Reduce number of instances or connections per instance
- Increase PostgreSQL
max_connections - Use PgBouncer for connection pooling
Redis Memory Exhaustion
Redis Memory Exhaustion
Symptoms:
Redis OOM errors, eviction warningsSolutions:- Increase Redis memory:
maxmemory 4gb - Configure eviction policy:
maxmemory-policy allkeys-lru - Reduce cache TTL values
- Scale Redis vertically or use Redis Cluster
Uneven Load Distribution
Uneven Load Distribution
Symptoms: Some instances at 90% CPU, others at 20%Solutions:
- Switch to least-connections load balancing
- Disable session affinity if not needed
- Check for long-running requests blocking instances
- Verify all instances are healthy and receiving traffic
Slow Database Queries
Slow Database Queries
Symptoms: High API latency, database CPU at 100%Solutions:
- Enable PostgreSQL slow query log
- Add missing indexes on frequently queried columns
- Review Prisma query patterns in logs
- Consider database read replicas for analytics
Further Reading
- Kubernetes HPA Documentation
- PostgreSQL Performance Tuning
- Redis Persistence and Durability
- Next.js Production Deployment
For assistance with scaling beyond 10 instances or enterprise-level deployments, contact the Formbricks team for architecture consulting.