GGraziadei opened a new issue, #8816:
URL: https://github.com/apache/storm/issues/8816

   This is a follow-up extracted from the review discussion on #8593 . During 
that review it was pointed out that the control plane and the data plane 
currently share the same executor receive queue, and that under heavy load the 
producer-side buffering of data tuples makes the control plane less responsive. 
This issue tracks that problem on its own so we can discuss and evaluate the 
options properly.
   
   ## Two different traffic types
   
   A Storm executor multiplexes two fundamentally different kinds of traffic 
onto its **single** inbound
   `JCQueue` ("receive-queue"):
   
   - **Data plane**: the actual business tuples flowing between components. 
High volume, bursty, and the
     traffic that backpressure is meant to throttle.
   - **Control plane (system streams)**: low-volume, coordination tuples that 
keep the topology healthy and responsive. 
   
   Storm reserves the `__` prefix for these internal streams. The full set:
   
     | Stream ID | Constant | Defined in | Purpose |
     |-----------|----------|------------|---------|
     | `__system` | `SYSTEM_STREAM_ID` | `StormCommon.java` | System stream 
(startup / coordination). |
     | `__tick` | `SYSTEM_TICK_STREAM_ID` | `Constants.java` | Tick tuples, 
drive tick-based logic and timeouts. |
     | `__flush` | `SYSTEM_FLUSH_STREAM_ID` | `Constants.java` | Flush tuples , 
drive the batch flush. |
     | `__metrics` | `METRICS_STREAM_ID` | `Constants.java` | Metrics data 
stream. |
     | `__metrics_tick` | `METRICS_TICK_STREAM_ID` | `Constants.java` | Metrics 
tick, drives metrics collection / telemetry. |
     | `__ack_init` | `ACKER_INIT_STREAM_ID` | `Acker.java` | Acker: 
anchor/init for a new tuple tree. |
     | `__ack_ack` | `ACKER_ACK_STREAM_ID` | `Acker.java` | Acker: ack 
acknowledgements. |
     | `__ack_fail` | `ACKER_FAIL_STREAM_ID` | `Acker.java` | Acker: failure 
notifications. |
     | `__ack_reset_timeout` | `ACKER_RESET_TIMEOUT_STREAM_ID` | `Acker.java` | 
Acker: reset the tuple-tree timeout. |
     | `__heartbeat` | `HEARTBEAT_STREAM_ID` | `ShellBolt.java` | 
Multilang/shell component heartbeats. |
     | `__eventlog` | `EVENTLOGGER_STREAM_ID` | `StormCommon.java` | Event 
logger stream (debug/eventlogging). |
   
   These have opposite requirements from the data plane: the data plane wants 
throughput and is *expected* to be throttled under load. The control plane, on 
the other hand, does not need the *lowest* possible latency, what it needs is a 
delivery guarantee with bounded, jitter-free latency. In other words, control 
tuples must be delivered within a predictable, stable time bound that does not 
degrade as the data plane saturates. A control signal that arrives a little 
later but always within a known bound is far more useful than one that is 
usually fast but occasionally stalls behind a data backlog: the coordination 
logic (timeouts, ticks, the flush feedback loop) depends on consistency, not 
raw speed.
   
   ## Current behavior: they share the same queue
   
   There is one `JCQueue` per executor, and every inbound tuple, data and 
control alike, goes through it. Note that the flush tuple already uses 
`tryPublishDirect` to bypass producer-side batching, but it is still appended 
to the same MPSC `recvQueue`, so it is delivered FIFO behind whatever data 
backlog is already enqueued.
   
   ## Why this is a problem
   
   Because the two planes share one FIFO queue, data-plane ingestion directly 
degrades control-plane responsiveness: **the data plane can starve or delay the 
control plane**, which is the opposite of what we want. Control-plane traffic 
should be insulated from data-plane buffering and saturation.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to