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
| Property | Value |
|---|---|
| Pipeline phase | Response |
| Category | Streaming |
| Canonical minimum tier | No canonical entitlement |
| Canonical entitlement | No |
| Supported deployment contract | No |
| Release status | Unsupported 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.
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.
:::
| Percentile | Reported 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
- Proxy opens one change stream per configured namespace
- Events are received and stored in a per-consumer ring buffer
- Connected consumers receive events via WebSocket in order
- If a consumer falls behind, backpressure drops oldest events (at_most_once) or blocks (at_least_once)
- Resume tokens are persisted to survive restarts
Configuration
“Not specified” means required semantics were not declared for that field.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
streams | json | — | Not specified | Stream definitions: {database, collection, consumers[]} |
buffer_size | number | 10000 | Not specified | Max events buffered per consumer |
delivery | select | at_least_once | Not specified | Delivery guarantee |
resume_token_store | select | memory | Not specified | Where to persist resume tokens |
filter_pipeline | json | — | Not specified | Aggregation 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.
Related steps
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.