Skip to main content

ADR 036: Event driven Communication and Loose Coupling

Date: 2026-03-10

Status: Reviewed

Decision Makers: CIVITAS/CORE Architecture Board

Context

CIVITAS/CORE is built as a modular platform with multiple independent components. These components need to exchange information without becoming tightly coupled in deployment, runtime behavior, or release cycles.

Synchronous point-to-point communication alone is not sufficient for this kind of platform. It creates stronger temporal coupling, requires immediate availability of dependent services, and makes integration flows harder to scale and evolve. For many platform interactions, especially state changes and configuration propagation, asynchronous communication is the more suitable default.

The platform already establishes CloudEvents as the event envelope for bus-based configuration communication in ADR 013. This ADR extends that direction into a broader communication principle for the platform.

The intended architecture is:

  • asynchronous event-driven communication as the default for cross-component integration
  • loose coupling through the message bus
  • CloudEvents as the standard event envelope
  • direct synchronous calls only where there is a clear need for immediate request-response behavior

Checked Architecture Principles

  • [full] Model-centric data flow
  • [full] Distributed architecture with unified user experience
  • [full] Modular design
  • [full] Integration capability through defined interfaces
  • [full] Open source as the default
  • [full] Cloud-native architecture
  • [full] Prefer standard solutions over custom development
  • [full] Self-contained deployment
  • [full] Technological consistency to ensure maintainability
  • [partial] Multi-tenancy
  • [partial] Security by design

Comments on partial ratings:

  • Multi-tenancy: Event-driven communication supports tenant-aware architectures, but tenant isolation still depends on topic design, authorization, and deployment boundaries.
  • Security by design: The pattern supports controlled integration, but secure event transport, access control, and payload validation still need explicit implementation.

Decision

Communication between CIVITAS/CORE platform components should be event driven and loosely coupled by default.

This means:

  • State changes and cross-component integration flows should be communicated asynchronously over the message bus.
  • CloudEvents are used as the standard event envelope for these interactions.
  • Components should publish and consume events instead of directly orchestrating each other wherever feasible.
  • Direct synchronous calls remain allowed for use cases that require immediate responses, for example user-facing queries or tightly scoped control operations.

Consequences

  • Components can evolve more independently because they do not always need to know who consumes their events.
  • The platform becomes more resilient to temporary unavailability of downstream services.
  • Event versioning, schema governance, idempotent consumers, retries, and observability become mandatory design concerns.
  • Some business flows will become eventually consistent, which must be reflected in UI behavior and operational expectations.
  • Architecture and implementation teams must avoid falling back to synchronous point-to-point calls as the default integration pattern.

Alternatives

  • Primarily synchronous REST-based communication: Rejected because it increases temporal coupling and reduces resilience in a distributed platform.
  • Direct component-specific integrations without shared event standards: Rejected because it would weaken interoperability and increase maintenance effort.
  • Strictly event-only communication for every interaction: Rejected because some request-response scenarios are valid and should remain possible where justified.

See also

  • ADR 013: Use CloudEvents Standard for Bus based Configuration Communication
  • ADR 016: Configuration Adapter (CA) SDK Language