@startuml !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Dynamic.puml LAYOUT_TOP_DOWN() LAYOUT_WITH_LEGEND() Person(customer, Customer, "A customer") System_Boundary(c1, "Customer Information") { Container(app, "Customer Application", "Javascript, Angular", "Allows customers to manage their profile") Container(customer_service, "Customer Service", "Java, Spring Boot", "The point of access for customer information") Container(message_bus, "Message Bus", "RabbitMQ", "Transport for business events") Container(reporting_service, "Reporting Service", "Ruby", "Creates normalised data for reporting purposes") Container(audit_service, "Audit Service", "C#/.NET", "Provides organisation-wide auditing facilities") ContainerDb(customer_db, "Customer Database", "Oracle 12c", "Stores customer information") ContainerDb(reporting_db, "Reporting Database", "MySQL", "Stores a normalized version of all business data for ad hoc reporting purposes") Container(audit_store, "Audit Store", "Event Store", "Stores information about events that have happened") } Rel_D(customer, app, "Updates his profile using", "HTTPS") Rel(app, customer_service, "Updates customer information using", "JSON/HTTPS") Rel_R(customer_service, customer_db, "Stores data in", "JDBC") Rel_D(customer_service, message_bus, "Sends customer update events to", "async", $index=Index()-1) Rel_U(customer_service, app, "Confirm update to", "async", $index=LastIndex()-2) Rel_L(message_bus, reporting_service, "Sends customer update events to", "async", $index=Index()-1) Rel(reporting_service, reporting_db, "Stores data in", $index=Index()-1) ' $index cab be first arg too (like the old RelIndex... calls), as long it is written with $index=.... Rel_R($index=SetIndex(5)-2, message_bus, audit_service, "Sends customer update events to", "async") Rel($index=Index()-2, audit_service, audit_store, "Stores events in") SHOW_LEGEND() @enduml