I suppose another possibility here would be to use the async
send-ack wrapper, but use the Send[]
API, and await Task.WhenAll
on the array of sent messages. This achieves “batched” parallelism, but also helps with the reordering problem, because you can employ logic like: “if any message in the batch is rejected, pause and retry the whole batch”. Is that better or worse? It depends If consumers are idempotent then using this logic they are guaranteed to get all of the messages in order eventually, even if they initially get some out of order. That might be preferable to writing consumer re-sequencing logic in some cases. After all, this is guaranteed at least once delivery, not guaranteed exactly once delivery.