Skip to content

Sequence diagrams

Overview of run simulation sequence

This is scenario used when direct job submission is used and simulation job is executed in Celery worker.

sequenceDiagram
    autonumber
    actor User
    participant FrontendApp as JavaScript App in Browser
    box Backend
    participant BackendApp as Flask
    participant Database as Database
    participant CeleryQueue as Celery Queue
    end

    User->>FrontendApp: Run simulation
    activate FrontendApp
    FrontendApp->>BackendApp: POST /jobs/direct
    activate BackendApp
    BackendApp->>+BackendApp: Create Simulation object internally
    BackendApp->>CeleryQueue: Submit job
    activate CeleryQueue
    CeleryQueue-->>BackendApp: Return Job ID
    deactivate CeleryQueue
    BackendApp->>+BackendApp: Update Simulation object with Job ID
    BackendApp->>Database: Commit Simulation object to Database
    activate Database
    Database-->>BackendApp: Acknowledge Commit
    deactivate BackendApp
    deactivate Database
    BackendApp-->>FrontendApp: POST /jobs/direct response (Simulation ID)
    FrontendApp->>User: Add new simulation card
    loop Progress check every 2 seconds
        FrontendApp->>BackendApp: GET /jobs?job_id={job_id}
        BackendApp->>Database: Query Simulation status
        activate Database
        Database-->>BackendApp: Return Simulation status
        deactivate Database
        BackendApp-->>FrontendApp: Return Simulation status
        opt status changed
            FrontendApp->>User: Update progress 
        end
        opt status is completed
            FrontendApp->>BackendApp: GET /results?job_id={job_id}
            activate BackendApp
            BackendApp->>Database: Query Simulation results
            activate Database
            Database-->>BackendApp: Return Simulation results
            deactivate Database
            BackendApp-->>FrontendApp: Return Simulation results
            deactivate BackendApp
            FrontendApp->>User: Display results
        end
    end
    deactivate FrontendApp

Job submission in more details

sequenceDiagram
    autonumber
    participant Client as REST Client
    participant BackendApp as Flask
    participant Database as Database
    participant CeleryQueue as Celery Queue
    participant CeleryBroker as Celery Broker (Redis)

    activate Client
    Client->>BackendApp: POST /jobs/direct
    activate BackendApp
    BackendApp->>+BackendApp: Create Simulation object internally
    BackendApp->>CeleryQueue: Submit job
    activate CeleryQueue
    CeleryQueue->>CeleryBroker: Queue simulation tasks
    CeleryQueue->>CeleryBroker: Queue merge task
    CeleryQueue-->>BackendApp: Return merge task (chord) id
    deactivate CeleryQueue
    BackendApp->>+BackendApp: Update Simulation object with Job ID
    BackendApp->>Database: Commit Simulation object to Database
    activate Database
    Database-->>BackendApp: Acknowledge Commit
    deactivate BackendApp
    deactivate Database
    BackendApp-->>Client: POST /jobs/direct response (Simulation ID)
    deactivate Client

Single task execution:

sequenceDiagram
    # simulation execution
    autonumber
    participant Client as REST Client
    participant BackendApp as Flask
    participant Database as Database
    participant CeleryQueue as Celery Queue
    participant CeleryBroker as Celery Broker (Redis)
    participant CeleryBackend as Celery Backend (Redis)
    participant CeleryWorker as Celery Worker
    participant SimulationProcess as Simulation process
    participant LogsWatcher as Simulation monitor
    participant SimulationLogs as Simulation logfile
    participant SimulationOutput as Simulation output file

    activate CeleryWorker
    CeleryBroker->>CeleryWorker: Fetch simulation task

    CeleryWorker->>BackendApp: POST /tasks
    activate BackendApp
    BackendApp->>Database: Commit update of task object
    activate Database
    Database-->>BackendApp: Acknowledge Commit
    deactivate Database
    BackendApp-->>CeleryWorker: POST /tasks response
    deactivate BackendApp

    CeleryWorker->>LogsWatcher: Starts monitoring process
    activate LogsWatcher
    CeleryWorker->>SimulationProcess: Starts simulation process
    activate SimulationProcess

    par logfile production
        loop every 1000 primary particles
            SimulationProcess->>SimulationLogs: Appends lines with status
        end
    and logfile monitoring
        loop watch logfile for new lines
            LogsWatcher->>SimulationLogs: Reads line with progress

            LogsWatcher->>BackendApp: POST /tasks (not often than every 2 seconds)
            activate BackendApp
            BackendApp->>Database: Commit update of task object
            activate Database
            Database-->>BackendApp: Acknowledge Commit
            deactivate Database
            BackendApp-->>LogsWatcher: POST /tasks response
            deactivate BackendApp
        end
    end

    SimulationProcess->>SimulationOutput: Saves output file
    deactivate SimulationProcess
    deactivate LogsWatcher

    CeleryWorker->>SimulationOutput: Reads output into JSON

    CeleryWorker->>BackendApp: POST /tasks
    activate BackendApp
    BackendApp->>Database: Commit update of task object
    activate Database
    Database-->>BackendApp: Acknowledge Commit
    deactivate Database
    BackendApp-->>CeleryWorker: POST /tasks response
    deactivate BackendApp

    CeleryWorker->>CeleryBackend: Save task results

    deactivate CeleryWorker