Skip to content

Backend Architecture

Ihar Suvorau edited this page Sep 14, 2023 · 2 revisions

Hybrid approach

Monolithical web server with background jobs and external services:

flowchart LR
    Frontend --> Controllers

    subgraph backend[Backend]
        subgraph Web[Web Server]
            Controllers
            Auth[Auth Service]
            Users[Users Service]
            Projects[Projects Service]
            Assets[Assets Service]
            Storage[Storage Service]

            Auth --> AuthImpl[Auth Implementation]
            Users --> UsersImpl[Users Implementation]
            Projects --> ProjectsImpl[Projects Implementation]
            Assets --> AssetsImpl[Assets Implementation]
            Assets --> Storage
            Storage --> FileStorageImpl[File Storage Implementation]
            Storage --> BlobStorageImpl[Blob Storage Implementation]
            Storage --> EtcImpl[...]

            AuthImpl --> UtilitiesDB[(Utilities DB)]
            UsersImpl --> UtilitiesDB
            ProjectsImpl --> UtilitiesDB
            AssetsImpl --> UtilitiesDB

            FileStorageImpl --> FileStorage[(File Storage)]

            BlobStorageImpl --> BlobStorage[(Blob Storage)]

            Controllers --> Auth
            Controllers --> Users
            Controllers --> Projects
            Controllers --> Assets
        end

        subgraph BackgroundServices[Background Services]
            DiscoverJob[BPS Discovery Batch Job]
            SimulationJob[Simulation Batch Job]
            WTAJob[Waiting Time Analysis Batch Job]

            Controllers ---> DiscoverJob
            Controllers ---> SimulationJob
            Controllers ---> WTAJob
        end
    end

    subgraph ExternalServices[External Services]
        Notifications[Notifications Service]
        Discovery[BPS Discovery Service]
        Simulation[Simulation Service]
        WTA[WTA Service]
        
        DiscoverJob ---> Discovery
        DiscoverJob ---> Assets
        DiscoverJob ---> Notifications

        SimulationJob ---> Simulation
        SimulationJob ---> Assets
        SimulationJob ---> Notifications

        WTAJob ---> WTA
        WTAJob ---> Assets
        WTAJob --> Notifications
    end
Loading

Event-driven approach using microservices

flowchart LR
    Frontend --> Controllers

    subgraph Web[Web Server]
        Controllers
    end

    Controllers --> Auth
    Controllers --> Users
    Controllers --> Projects
    Controllers --> Assets

    subgraph Broker[Message Topics]
        BPSDiscoveryRequestTopic[[BPS Discovery Request Topic]]
        BPSDiscoveryResultTopic[[BPS Discovery Result Topic]]
        NotificationRequestTopic[[Notification Request Topic]]

        Controllers -- publish ---> BPSDiscoveryRequestTopic
    end

    subgraph Processors[Topic Processors]
        subgraph Group
            BPSDiscoveryRequestProcessor1[[BPS Discovery Request Processor 1]]
            BPSDiscoveryRequestProcessor2[[BPS Discovery Request Processor 2]]
        end
        BPSDiscoveryRequestProcessor1 -- subscribes --> BPSDiscoveryRequestTopic
        BPSDiscoveryRequestProcessor1 -- publishes --> BPSDiscoveryResultTopic
        BPSDiscoveryRequestProcessor2 -- subscribes --> BPSDiscoveryRequestTopic
        BPSDiscoveryRequestProcessor2 -- publishes --> BPSDiscoveryResultTopic
        
        BPSDiscoveryResultProcessor -- subscribes --> BPSDiscoveryResultTopic
        BPSDiscoveryResultProcessor -- publishes --> NotificationRequestTopic

        NotificationProcessor -- subscribes --> NotificationRequestTopic
    end

    BPSDiscoveryRequestProcessor1 -- uses ---> Simod
    BPSDiscoveryRequestProcessor1 -- uses ---> Assets
    BPSDiscoveryRequestProcessor2 -- uses ---> Simod
    BPSDiscoveryRequestProcessor2 -- uses ---> Assets
    BPSDiscoveryResultProcessor -- uses ---> Assets
    NotificationProcessor -- uses ---> Notifications

    Assets -- uses --> Storage
Loading
  • Control the number of concurrently running batch processes
  • Distribute batch processes across multiple machines (e.g., BPS discovery on several machines, simulation on several machines, etc.)
  • Should each processor call an external service or should it use the underlying tool directly?

Clone this wiki locally