I mentioned this in another place on this thread, but a simple AIMD algorithm paired with a token bucket is surprisingly effective at dynamically adjusting to available capacity, even across a fleet of services not sharing state other than the contended resource.
Pretty easy to pair AIMD with token bucket (eg https://github.com/webriots/rate)