Recommended way to implement a Channel consumer with async handlers & backpressure?
Hey everyone
Iโm working on a microservice (DDD style) where aggregates communicate through an in-memory Channel (System.Threading.Channels). Producers push domain messages/events into it, and a background consumer runs handlers for each message.
I want to keep backpressure (so producers block if the consumer is behind) but still handle multiple messages asynchronously โ without serializing everything or flooding the system.
Hereโs the trade-off Iโm running into:
await foreach (var msg in reader.ReadAllAsync()){ await HandleAsync(msg); // preserves backpressure but no parallelism}await foreach (var msg in reader.ReadAllAsync()){ _ = Task.Run(() => HandleAsync(msg)); // loses backpressure}
await foreach (var msg in reader.ReadAllAsync()){ await HandleAsync(msg); // preserves backpressure but no parallelism}await foreach (var msg in reader.ReadAllAsync()){ _ = Task.Run(() => HandleAsync(msg)); // loses backpressure}