Scale Horizontally

This guide shows you how to scale your Azu application across multiple servers.

Stateless Design

Ensure your application is stateless:

# Bad: In-memory state
@@users_cache = {} of Int64 => User

# Good: External cache
Azu.cache.set("user:#{id}", user.to_json)

Session Storage

Use Redis for sessions:

class SessionStore
  def self.create(user_id : Int64) : String
    session_id = Random::Secure.hex(32)
    Azu.cache.set(
      "session:#{session_id}",
      {user_id: user_id, created_at: Time.utc}.to_json,
      expires_in: 24.hours
    )
    session_id
  end

  def self.get(session_id : String) : Int64?
    data = Azu.cache.get("session:#{session_id}")
    return nil unless data
    JSON.parse(data)["user_id"].as_i64
  end
end

Load Balancer Configuration

Nginx as Load Balancer

HAProxy Configuration

Docker Swarm

Scale with Docker Swarm:

Deploy to swarm:

Kubernetes Deployment

WebSocket Scaling

Handle WebSockets across multiple servers with Redis pub/sub:

Database Scaling

Read Replicas

Connection Pooling

Use PgBouncer for PostgreSQL:

Cache Scaling

Use Redis Cluster:

Monitoring at Scale

Add instance identification:

See Also

Last updated

Was this helpful?