I think what you are looking for is the 'WorkingQueue' retention policy for your stream, which removes messages from the stream once they have been sent and acknowledged by a subscriber to a consumer on the stream.
So for example new order requests are published on 'orders.new.' and you have a stream with retention policy of 'WorkingQueue' listening on subject 'orders.new.*' and worker processes subscribe to a (durable, pull) consumer. Worker processes pull new orders from the stream and once the processing is done successfully they ack the message and it gets deleted form the requests stream. Be sure to adjust the consumer's 'AckWait' and/or use the 'give me more time to process' acknowledgement according to your processing times.
You can repeat this pattern to create workflows (e.g. message goes in the 'orders.new' stream, another message gets published to the 'orders.processing' stream and acked and therefore deleted from 'orders.new') or do long-lived request reply (like submitting a job) e.g. where the reply is published to 'results.' and you define a stream listening on 'results.*' (working queue, or time limit) and you can have the clients wait for the result of their order processing using an ephemeral consumer filtering on 'results.'.