workspace extends ../common/model/styles.dsl { name "Multiregion/multizone" description "Multiregion/multizone C4 model" !identifiers hierarchical model { user = person "User" regionalKafka = softwareSystem "Regional Kafka" { this -> this "Replication" "Kafka" "Replication" } tango = softwareSystem "Tango" { mobileApp = container "Mobile App" } domain = softwareSystem "Domain" { persistentStorage = container "Persistent storage" { tags "persistentStorage" technology "Aerospike/MySQL/ScyllaDb" this -> this "Replication" "SQL" "Replication" } cache = container "Cache" { tags "cache" technology "Redis" } domainKafka = container "Domain Kafka" { tags "Kafka" } internalServices = container "Internal services" { tags "Internal" -> cache "Cache data" -> persistentStorage "Store persistent data" -> domainKafka "Consumers/Produces" -> regionalKafka "Consumers/Produces" } api = container "API" { tags "API" -> internalServices "Handle API calls/events" user -> this "Uses" } } production = deploymentEnvironment "Multiregion" { multiRegionGroup = deploymentGroup "Multiregion group" domainAGroup = deploymentGroup "Domain A group" domainBGroup = deploymentGroup "Domain B group" regionAGroup = deploymentGroup "Region A group" regionBGroup = deploymentGroup "Region B group" multiRegionInfrastructure = deploymentNode "Multiregion infrastructure" { apiGateway = infrastructureNode "Multiregion API Gateway" } mobileDevice = deploymentNode "Customer's mobile device" "" "iOS or Android" { app = containerInstance tango.mobileApp } regionA = deploymentNode "Region A" { infra = deploymentNode "Region infrastructure" { apiGateway = infrastructureNode "Region API Gateway" kafka = softwareSystemInstance regionalKafka regionAGroup,multiRegionGroup } domainA = deploymentNode "Domain A" { apiGateway = infrastructureNode "Domain API Gateway" regionAGroup api = containerInstance domain.api regionAGroup internal = deploymentNode "Internal area" { containerInstance domain.domainKafka regionAGroup services = containerInstance domain.internalServices regionAGroup containerInstance domain.cache regionAGroup containerInstance domain.persistentStorage domainAGroup } apiGateway -> api } domainB = deploymentNode "Domain B" { apiGateway = infrastructureNode "Domain API Gateway" regionAGroup api = containerInstance domain.api regionAGroup internal = deploymentNode "Internal area" { containerInstance domain.domainKafka regionAGroup services = containerInstance domain.internalServices regionAGroup containerInstance domain.cache regionAGroup containerInstance domain.persistentStorage domainBGroup } apiGateway -> api } infra.apiGateway -> domainA.apiGateway infra.apiGateway -> domainB.apiGateway } regionB = deploymentNode "Region B" { infra = deploymentNode "Region infrastructure" { apiGateway = infrastructureNode "Region API Gateway" kafka = softwareSystemInstance regionalKafka regionBGroup,multiRegionGroup } domainA = deploymentNode "Domain A" { apiGateway = infrastructureNode "Domain API Gateway" regionBGroup api = containerInstance domain.api regionBGroup deploymentNode "Internal area" { containerInstance domain.domainKafka regionBGroup internal = containerInstance domain.internalServices regionBGroup containerInstance domain.cache regionBGroup containerInstance domain.persistentStorage domainAGroup } apiGateway -> api } domainB = deploymentNode "Domain B" { apiGateway = infrastructureNode "Domain API Gateway" regionBGroup api = containerInstance domain.api regionBGroup deploymentNode "Internal area" { containerInstance domain.domainKafka regionBGroup "Kafka" internal = containerInstance domain.internalServices regionBGroup containerInstance domain.cache regionBGroup containerInstance domain.persistentStorage domainBGroup } apiGateway -> api } infra.apiGateway -> domainA.apiGateway infra.apiGateway -> domainB.apiGateway } mobileDevice.app -> multiRegionInfrastructure.apiGateway multiRegionInfrastructure.apiGateway -> regionA.infra.apiGateway multiRegionInfrastructure.apiGateway -> regionB.infra.apiGateway } } views { systemLandscape "SystemLandscape" "Multiregion" { include * autoLayout } deployment * production { include * autolayout } } }