Subscribing user guide presents an overview of Consumers adaptive rate limiting algorithm. This section describes the algorithm in detail along with all configuration options that can be used to fine-tune it.
Measurement window for each subscription is LIMITER_PERIOD seconds. Each LIMITER_PERIOD seconds recalculation of output rate is triggered. There are three algorithm phases (modes), by default subscription is started in normal mode:
In slow mode requests are sent each SLOW_DELAY seconds:
In heatbeat mode requests are sent each HEARTBEAT_DELAY seconds:
Each of parameters written in capital letters can be configured:
| Parameter name | Option | Default value |
|---|---|---|
| LIMITER_PERIOD | consumer.rate.limiter.supervisor.period | 30 |
| SPEEDUP_TOLERANCE | consumer.rate.failures.speedup.tolerance.ratio | 0.01 |
| TOLERANCE | consumer.rate.failures.nochange.tolerance.ratio | 0.05 |
| CONVERGENCE_FACTOR | consumer.rate.convergence.factor | 0.2 |
| SLOW_DELAY | consumer.rate.limiter.slow.mode.delay | 1 |
| HEARTBEAT_DELAY | consumer.rate.limiter.hearbeat.mode.delay | 60 |
The rate limit is applied to a particular data center and tries to divide the rate among assigned consumers. It tries to work on the basis of consumers' needs by tracking actual delivery rate. Use ALGORITHM=negotiated to enable it (that's the default).
A deprecated algorithm is also available (although not recommended), which works as follows: if your hermes cluster runs N consumers per subscription (in all data centers), the maximum global rate for this subscription will be divided as {subscriptionPolicy.rate} / N for each consumer (ALGORITHM=strict). This algorithm should be avoided, as it changes the rate limit semantics to be global instead of data center based.
By tracking latest RATE_HISTORY_SIZE DELIVERY_ATTEMPT_RATE samples, the algorithm is able to determine busy and non-busy consumers and balance the available global rate among them over time.
| Parameter name | Option | Default value |
|---|---|---|
| ALGORITHM | consumer.maxrate.strategy | strict |
| BALANCE_INTERVAL | consumer.maxrate.balance.interval.seconds | 30 |
| UPDATE_INTERVAL | consumer.maxrate.update.interval.seconds | 15 |
| RATE_HISTORY_SIZE | consumer.maxrate.history.size | 1 |
| BUSY_TOLERANCE | consumer.maxrate.busy.tolerance | 0.1 |
| MIN_MAX_RATE | consumer.maxrate.min.value | 1.0 |
| MIN_CHANGE_PERCENT | consumer.maxrate.min.allowed.change.percent | 1.0 |
| MIN_SIGNIFICANT_CHANGE_PERCENT | consumer.maxrate.min.significant.update.percent | 9.0 |