Skip to main content
Version: Next (Private Preview)

Change Stream Fanout

Status: Unsupported concept: dashboard manifest only. No canonical entitlement and no supported deployment contract.

:::danger Unsupported legacy concept

This describes a concept that Nexo does not currently implement. It has no canonical entitlement and no supported deployment contract. Do not infer a CRD, Operator reconciliation path, runtime implementation, or support commitment from the configuration and examples below.

:::

Always confirm availability in the release bundle selected for deployment.

At a glance

PropertyValue
Pipeline phaseResponse
CategoryStreaming
Canonical minimum tierNo canonical entitlement
Canonical entitlementNo
Supported deployment contractNo
Release statusUnsupported concept: dashboard manifest only. No canonical entitlement and no supported deployment contract.

Release accuracy

  • Current documentation: Unsupported concept: dashboard manifest only. No canonical entitlement and no supported deployment contract.

Where any detail below conflicts with the release status above, the release status is authoritative. Field names and examples describe the current dashboard and CRD surface; always confirm behavior against the selected release bundle before relying on it operationally.

Change Stream Fanout current release feature flow. Unsupported concept: dashboard manifest only. No canonical entitlement and no supported deployment contract.

Release-aware feature flow. The diagram is explanatory; the release status on this page is authoritative.

Diagram resources: Open the SVG full screen · Download the editable Excalidraw source

Performance impact

:::warning Unverified performance figures

These figures are illustrative only. They are not current benchmarks or service guarantees and have not been verified by the current test suite.

:::

PercentileReported figure
P50<1ms
P95<3ms
P99<5ms

Note: Fanout is async — does not add latency to normal queries

Overview

The Change Stream Fanout step maintains a single change stream watcher per namespace and fans out events to multiple consumers via WebSocket connections. This eliminates the N-watcher problem where each microservice opens its own change stream, multiplying oplog reads.

Events are buffered per-consumer with configurable backpressure. Resume tokens are stored durably to survive proxy restarts.

When to use

  • Multiple services consuming the same change stream (event-driven architectures)
  • Reducing MongoDB oplog read amplification
  • Building real-time notification systems without per-service watchers
  • CDC (Change Data Capture) pipelines with multiple downstream targets

How it works

  1. Proxy opens one change stream per configured namespace
  2. Events are received and stored in a per-consumer ring buffer
  3. Connected consumers receive events via WebSocket in order
  4. If a consumer falls behind, backpressure drops oldest events (at_most_once) or blocks (at_least_once)
  5. Resume tokens are persisted to survive restarts

Configuration

“Not specified” means required semantics were not declared for that field.

FieldTypeDefaultRequiredDescription
streamsjsonNot specifiedStream definitions: {database, collection, consumers[]}
buffer_sizenumber10000Not specifiedMax events buffered per consumer
deliveryselectat_least_onceNot specifiedDelivery guarantee
resume_token_storeselectmemoryNot specifiedWhere to persist resume tokens
filter_pipelinejsonNot specifiedAggregation pipeline to filter events

Settings reference

No additional settings reference is documented for this component.

Examples

Multi-consumer CDC

steps:
- id: builtin:change-stream-fanout
config:
delivery: at_least_once
resume_token_store: redis
redis_addr: redis:6379
buffer_size: 50000
streams:
- database: orders
collection: events
consumers:
- ws://notification-svc:8080/changes
- ws://analytics-svc:8080/changes
- ws://billing-svc:8080/changes

Best practices

  • Use at_least_once delivery for critical events (notifications, billing)
  • Use Redis or MongoDB for resume token storage in production
  • Apply filter_pipeline to reduce event volume at source
  • Monitor buffer fill rates — sustained 80%+ indicates consumers are too slow

Limitations

  • WebSocket consumers must acknowledge events for at_least_once delivery
  • Maximum 50 consumers per stream (server connection overhead)
  • Cannot fan out change streams that use $match on encrypted fields

Security and operational guidance

  • This is a legacy dashboard concept, not a canonically entitled Nexo component.
  • No supported deployment contract, CRD mapping, Operator reconciliation path, or runtime execution guarantee is published.
  • Treat every configuration example and performance number below as historical design material only.

Release availability

  • Current documentation: Unsupported concept: dashboard manifest only. No canonical entitlement and no supported deployment contract.

See the component catalog for the complete comparison matrix.

Search Nexo documentation

Type to search titles, headings, and page content.