Skip to main content

Control Plane architecture

Status: Partially implemented. Most service repositories and local integrations exist. Shared-platform adoption, event completeness, composite authorization, and production evidence remain incomplete.

The Control Plane owns governance and commercial/administrative state. It never becomes a shared business database: each service owns its records and exposes an API or event contract.

Service boundaries

ServiceOwnsSynchronous dependenciesEvents/failure notesStatus
dx-user-goProfiles, organisations/membership, app credentials/delegation state, identity-provider coordinationKeycloakProduces org.member.*; current publisher/outbox adoption partial; group producer gapPartially implemented
dx-acl-goGrants, access requests, delegation policy administrationCatalogue ownership lookuppolicy.*, delegation.*; projection lag/reconciliation requiredPartially implemented
dx-authz-goDecision API and OpenFGA projectionOpenFGAConsumes policy/membership/delegation; planned OPA composite pathPartially implemented
dx-catalogue-goDataset metadata, discovery/search representation, ownership factsElasticsearch; internal APIsOwnership/outbox projection; gRPC surface existsPartially implemented
dx-marketplace-goListings, orders/purchase/payment statePayment provider, ACL/entitlement workflowProvider-event idempotency implemented; entitlement reconciliation requiredPartially implemented
dx-registry-goResource/ACL server registrationsPostgreSQLAdministrative CRUD and auditImplemented
dx-credits-goCredit balances and billing entriesPostgreSQL/eventsOwner of credit mutation/idempotencyImplemented
dx-subscription-goSubscription definition/delivery stateData/event sourcesSide-effect idempotency implemented; continued authorization remains partialPartially implemented
dx-audit-goAudit projection and query/exportRabbitMQ/PostgreSQLIdempotent consumer and read API; producer coverage variesImplemented
dx-notification-goNotification templates/dispatch stateRabbitMQ/providerReconnecting consumer; provider effect must be idempotent/reconcilableImplemented
dx-community-layer-goDiscussion/challenge stateOwned database/search as configuredIndependent bounded contextPartially implemented

Identity and membership synchronization

  1. dx-user-go authenticates administrative intent through trusted subject/workload context.
  2. It updates authoritative organisation membership and coordinates identity-provider roles/groups only where that is its contract.
  3. State plus event should commit atomically; current publication path still needs consistent outbox adoption.
  4. dx-authz-go consumes org.member.* and updates the OpenFGA projection idempotently.
  5. Authorization changes only after projection. Missing producer/event/mapping denies; reconciliation detects drift.

Keycloak is the authentication authority, not the definitive owner of every resource relationship. Organisation isolation uses verified membership plus service-owned resource organisation, never a client field alone.

Dataset onboarding and discovery

  1. Provider submits metadata through gateway/catalogue; gateway and catalogue enforce identity and ownership.
  2. Catalogue validates identifiers, provider/organisation, schema, resource type, and supported search fields.
  3. Catalogue writes its owned document/index and a durable ownership relationship event.
  4. Authorization projection makes the provider/organisation the resource owner.
  5. Registry/data/file services may be referenced through contracts; they do not share catalogue storage.
  6. Public/optional discovery returns only the view allowed by authentication/authorization. Invalid optional credentials are rejected.

Failures: invalid metadata is rejected; search unavailable fails or uses an explicitly correct degraded path; ownership publication backlog is observable and the resource is not considered safely accessible until projection succeeds.

Marketplace purchase and entitlement

  1. Marketplace creates/retrieves an idempotent order.
  2. Client/provider completes payment; exact webhook route verifies provider authenticity and stable provider event ID.
  3. Marketplace commits payment/order result once.
  4. Entitlement orchestration creates an ACL grant; ACL remains the grant owner.
  5. policy.* projects to OpenFGA.
  6. Consumer access stays pending until authorization verifies the relationship.
  7. Expiry/refund/revocation removes entitlement and triggers audit/notification/reconciliation.

Unknown provider outcome is reconciled before retry. Duplicate callback cannot duplicate order, credit, or entitlement.

Registry, credits, audit, and notifications

Registry records discoverable service endpoints/contracts but does not make them reachable or trusted; gateway/GitOps/identity still govern exposure. Credits owns monetary/usage balance transitions and must use locks/idempotency. Audit consumes immutable security/business facts into an append-oriented projection. Notifications consume facts and own dispatch attempts; they must not become the authoritative business state.

Configuration and governance

Each service validates its dependencies/security posture at startup. Central governance defines service names, ports, public prefixes, workload audiences, authorization vocabulary, event names/versions, data classification, and deployment policies. Services own domain configuration. Runtime flags cannot bypass required authentication or authorization.

Common failure posture

  • Required owner/PDP/database unavailable: fail request/readiness; never fabricate an allow.
  • Broker unavailable: authoritative write succeeds only with durable outbox; backlog alerts and later dispatch.
  • Projection lag: report pending/deny for access-sensitive flows and reconcile.
  • Duplicate event/webhook: return/reuse idempotent result.
  • Notification/audit consumer failure: retry/DLQ/replay; preserve authoritative source fact.
  • Cross-organisation identifier mismatch: deny and audit.

See ACL, authorization, messaging, and observability.