Power Of Two Choices Load Balancing
The power-of-two-choices
load balancing selects two random service instances and then chooses the one with the least inflight requests.
It avoids the overhead of least-requests
and the worst case for random
where it selects a busy destination.
This strategy acts as follows:
- when the selection happens, it picks two random instances from the list,
- it returns the least loaded instance (based on the number of inflight requests),
- when the operation completes, successfully or not, the number of inflight requests for the instance is decremented.
Check The Power of Two Random Choices paper to learn more about this pattern and the benefits.
Dependency
First, you need to add the random load-balancer to your project:
<dependency>
<groupId>io.smallrye.stork</groupId>
<artifactId>stork-load-balancer-power-of-two-choices</artifactId>
<version>1.1.1</version>
</dependency>
Configuration
For each service expected to use a random service selection, configure the load-balancer
to be power-of-two-choices
:
stork.my-service.service-discovery.type=...
stork.my-service.service-discovery...=...
stork.my-service.load-balancer.type=power-of-two-choices
quarkus.stork.my-service.service-discovery.type=...
quarkus.stork.my-service.service-discovery...=...
quarkus.stork.my-service.load-balancer.type=power-of-two-choices
Supported attributes are the following:
Attribute | Mandatory | Default Value | Description |
---|---|---|---|
use-secure-random |
No | false |
Whether the load balancer should use a SecureRandom instead of a Random (default). Check this page to understand the difference |