graph TB
    subgraph "Client Side"
        App[Ruby Application]
        Client[Sidekiq::Client]
    end

    subgraph "Sidekiq Server Process"
        CLI[Sidekiq::CLI]
        Config[Sidekiq::Config]
        Launcher[Sidekiq::Launcher]
        Manager[Sidekiq::Manager]
        Poller[Sidekiq::Scheduled::Poller]
        Processor[Sidekiq::Processor]
        Job[Sidekiq::Job]
        MiddlewareChain[Middleware::Chain]
        BasicFetch[Sidekiq::BasicFetch]
    end

    subgraph "Storage"
        Redis[Redis/Valkey/Dragonfly]
    end

    subgraph "Web Interface"
        WebUI[Sidekiq::Web UI]
        API[Sidekiq::API]
    end

    App -->|enqueues jobs| Client
    Client -->|pushes to| Redis

    CLI -->|starts| Launcher
    CLI -->|configures| Config
    Config -.->|configures| Launcher

    Launcher -->|manages| Manager
    Launcher -->|schedules| Poller
    Manager -->|manages| Processor

    Poller -->|enqueues due jobs| Redis
    Redis -->|fetches jobs| BasicFetch
    BasicFetch -->|provides work to| Processor
    MiddlewareChain -->|wraps| Processor
    Processor -->|executes| Job

    WebUI -->|uses| API
    API -->|reads from| Redis
    WebUI -->|monitors| Redis

    Manager -->|pushes to| Redis
    Processor -->|fetches jobs| Redis
sequenceDiagram
    participant App as Ruby Application
    participant Client as Sidekiq::Client
    participant Middleware as Client Middleware
    participant Redis as Redis
    participant Poller as Scheduled::Poller
    participant Manager as Manager
    participant Processor as Processor
    participant ServerMW as Server Middleware
    participant Worker as Worker Class

    Note over App, Worker: Client-Side (Job Enqueuing)

    App->>Client: perform_async(*args)
    Client->>Middleware: invoke middleware chain
    Middleware->>Redis: LPUSH to queue

    Note over App, Worker: OR Schedule for later

    App->>Client: perform_in(time, *args)
    Client->>Redis: ZADD to scheduled set

    Note over App, Worker: Server-Side (Job Processing)

    loop Continuous polling
        Poller->>Redis: Check scheduled/retry sets
        Poller->>Redis: Move due jobs to queues
    end

    Manager->>Processor: start worker
    Processor->>Redis: BRPOP from queue
    Redis-->>Processor: job payload
    Processor->>ServerMW: invoke middleware chain
    ServerMW->>Worker: perform(*args)

    alt Success
        Worker-->>ServerMW: [Success]
        ServerMW-->>Processor: return result
        Processor->>Manager: report success
    else Failure
        Worker-->>ServerMW: [Failure]
        ServerMW-->>Processor: raise exception
        Processor->>Redis: Schedule retry or move to dead
    end

See also Amdahl’s Law