Backpressure gets more "interesting" when you throw QoS into the mix. If the client has hard latency requirements, the server can't afford to "stop the world" when it gets backed up (à la TCP).
Keeping your queues shallow can be a solution, but only if your system doesn't need the benefits of batching that deep queues can bring. You then have to be a bit smarter about crediting the client, only handing credits out when you know you'll be able to complete that work within the QoS requirements, instead of simply whenever you have space in your queues. (Simply rate-limiting the source will work in a pinch too, at the cost of potential throughput.)
Keeping your queues shallow can be a solution, but only if your system doesn't need the benefits of batching that deep queues can bring. You then have to be a bit smarter about crediting the client, only handing credits out when you know you'll be able to complete that work within the QoS requirements, instead of simply whenever you have space in your queues. (Simply rate-limiting the source will work in a pinch too, at the cost of potential throughput.)