You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- `hash_header`: Defines the header Gorouter uses for routing decisions on this route. Required when `loadbalancing` is set to `hash`. Cannot be used with other load balancing algorithms. <%= vars.hash_routing_version %>
16
+
- `hash_balance`: Sets the float number for the balance factor used by Gorouter to manage load imbalance applying the hash-based routing for this route. Optional when `loadbalancing` is `hash`. Cannot be used with other algorithms. <%= vars.hash_routing_version %>
The per-route option `loadbalancing` allows configuring the load balancing algorithm, which defines how the load is distributed between Gorouters and backends.
21
23
22
-
This option supports two settings for load balancing:
24
+
This option supports three settings for load balancing:
23
25
24
26
- `round-robin` distributes the load evenly across all available backends
25
27
- `least-connection` directs traffic to the backend with the fewest active connections at any given time, optimizing resource utilization
28
+
- `hash` distributes requests based on a hash of a specific HTTP header, ensuring requests with the same header are consistently directed to the same backend. <%=vars.hash_routing_version%>
26
29
27
-
28
-
### <aid="lb-set-manifest"></a> Configure Load Balancing in an App Manifest
30
+
### <aid="lb-set-manifest"></a> Configure Load Balancing using an App Manifest
29
31
30
32
To configure per-route load balancing for an application that has not yet been pushed:
31
33
@@ -49,91 +51,155 @@ To configure per-route load balancing for an application that has not yet been p
49
51
cf push -f manifest.yml
50
52
```
51
53
52
-
### <aid="lb-update-route"></a> Change Load Balancing Algorithm of an Existing Route
54
+
### <aid="lb-create-route"></a> Create a Route with a Specific Load Balancing Algorithm Using the CF CLI
55
+
56
+
To create a route with a per-route `loadbalancing` option, you can use the CLI command `create-route`.
To create a route with a per-route `loadbalancing` option, you can use the cli command `create-route`.
79
-
For example:
97
+
<%=vars.hash_routing_version%>
98
+
99
+
Hash-Based Routing is a load-balancing method that routes incoming requests to application instances using a hash of a specific HTTP header value. This ensures consistent routing, so requests with the same header value always go to the same instance. The per-route hash options offer detailed control over hash-based load balancing for individual routes.
100
+
101
+
### <aid="options-hash-set-manifest"></a> Configure Hash-Based Routing with an App Manifest
102
+
1. In the application manifest, include a `route` definition with the following `options` attributes:
103
+
- `loadbalancing` set to `hash`
104
+
- `hash_header` set to the HTTP header name used for routing decisions
105
+
- optionally, `hash_balance` set to a float number for the balance factor used by Gorouter to [manage load imbalance](hash-based-routing.html#handling-imbalance-loads) for this particular route.
106
+
107
+
```yaml
108
+
---
109
+
applications:
110
+
- name: MY-APP
111
+
routes:
112
+
- route: MY-HOST.EXAMPLE.COM
113
+
options:
114
+
loadbalancing: hash
115
+
hash_header: HASH-HEADER-NAME
116
+
hash_balance: 1.2
117
+
```
118
+
119
+
Where `MY-APP` is the name of your app, `MY-HOST.EXAMPLE.COM` is the route you want to map to your app and `HASH-HEADER-NAME` is the HTTP header name.
120
+
121
+
1. Push the app with the manifest:
122
+
123
+
```console
124
+
cf push -f manifest.yml
125
+
```
126
+
127
+
### <aid="options-hash-create-route"></a> Create a Route with Hash-Based Options Using the CF CLI
128
+
129
+
To create a route with hash-specific options, you can use the CLI command `create-route`. For example:
### <aid="options-hash-update-route"></a>Update an Existing Route with Hash Options Using the CF CLI
114
156
115
-
To read route options, you can query the route using the `route` command:
157
+
You can change an existing route that uses the default load balancing algorithm to the hash load balancing algorithm.
158
+
159
+
For example, to change an app route's algorithm from default `round-robin` to `hash` and set `hash_header` to HASH-HEADER-NAME without a balance factor, you can run the `update-route` command:
The response lists the chosen `loadbalancing` algorithm option, e.g. `least-connection`:
165
+
To add a balance factor along with the previous settings, you can later run the `update-route` command, for example, with the `hash_balance` option set to `1.5`:
Where `MY-HOST` is the host attribute of the route. The response lists the chosen `loadbalancing` algorithm option as well:
177
+
Setting the balance factor to 0 indicates to Gorouter that load imbalance is accepted and all requests for a particular hash should be routed to the same instance as long as it's healthy, without redirecting to other predetermined instances.
178
+
179
+
### <aid="options-hash-revert"></a> Revert Hash Options Using the CF CLI
180
+
181
+
Running the `update-route` command with the `-r` flag for the option `loadbalancing` removes all hash options from the route, returning to the default load balancing algorithm:
Copy file name to clipboardExpand all lines: deploy-apps/manifest-attributes.html.md.erb
+8-1Lines changed: 8 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -583,7 +583,9 @@ Under each route, you can optionally include an `options` attribute to configure
583
583
584
584
Available options are:
585
585
586
-
- `loadbalancing` - defines how Gorouter distributes requests across the application backends. Valid values are `round-robin` and `least-connection`.
586
+
- `loadbalancing` - defines how Gorouter distributes requests across the application backends. Valid values are `round-robin`, `least-connection` and `hash`.
587
+
- `hash_header` - defines the header used for hash-based routing decisions. Required when `loadbalancing` is set to `hash`.
588
+
- `hash_balance` - defines the balance factor used to manage load imbalance for hash-based routing. Optional when `loadbalancing` is set to `hash`. Values in the 1.1-2.0 range provide the best balance of even distribution and performance. Omitting `hash_balance` or setting it explicitly to 0 indicates that the load situation will not be considered.
Hash-Based Routing is a load-balancing algorithm that distributes incoming requests to application instances based on a hash of a specific HTTP header value, e.g., `X-Resource-ID` or `Tenant-ID`. This ensures consistent routing behavior where requests containing the same header value are always directed to the same instance.
9
+
10
+
## <aid="prerequisites"></a> Prerequisites
11
+
12
+
To use Hash-Based Routing, ensure that
13
+
14
+
- your <%=vars.app_runtime_abbr%> deployment is running version <%=vars.hash_routing_version%> or later.
15
+
- platform operators activate the feature so that the CF feature flag `hash_based_routing` is set to `true`. See [Feature Flags](https://docs.cloudfoundry.org/adminguide/listing-feature-flags.html#flags) for more details.
16
+
17
+
## <aid="key-features"></a> Key Features
18
+
19
+
- **Configurable via Per-Route Options**: Hash-Based load-balancing setup through application route options
20
+
- **Configurable Hash Header**: The HTTP header to consider for Hash-Based Routing is configurable for each route
21
+
- **Session Affinity Precedence**: Session affinity (sticky sessions) is prioritized over Hash-Based Routing
22
+
- **No availability zones preference**: The global properties `locallyOptimistic` and `localAvailabilityZone` are ignored when using Hash-Based Routing
23
+
- **Consistent Hashing**: Implementation of the Maglev Algorithm (see [Maglev: A Fast and Reliable Software Network Load Balancer](https://storage.googleapis.com/gweb-research2023-media/pubtools/2904.pdf) for details)
24
+
- **Minimal Rehashing**: Usage of the Maglev Algorithm to map application instances by hash ensures that hash positions are shifted to other instances as little as possible when application instances are added or removed
25
+
- **Handling imbalanced loads**: Detection and mitigation of imbalanced load on single instances prevents overloading while keeping instances for a particular hash at a minimum
26
+
27
+
Hash-Based Routing implements a clear precedence hierarchy:
28
+
29
+
1. **Sticky Sessions**: First checks if a sticky session is used and the sticky session endpoint is available
30
+
2. **Hash-Based Routing**: Calculates the hash of the specified HTTP header value and routes the requests to a pre-determined application instance
31
+
3. **Default Load Balancing**: Falls back to default load balancing if the header configured in the application route for Hash-Based Routing is absent in the request
32
+
33
+
34
+
## <aid="hash-based-vs-session-affinity"></a> Hash-Based Routing vs. Session Affinity
35
+
36
+
While Session Affinity provides a way to keep session consistency, it works at the session level and can cause scalability issues. Heavy users might be routed to the same instance and stay pinned to it through session affinity, which could lead to overload. Session Affinity usually depends on session cookies (see more details in the [Session Affinity](https://docs.cloudfoundry.org/concepts/http-routing.html#-session-affinity) documentation), which requires implementation effort for web applications.
37
+
38
+
In contrast, Hash-Based Routing offers a more scalable and flexible approach by consistently distributing requests based on a hash of any configurable HTTP header value, not just session identifiers. This allows for load distribution based on tenant IDs, resource IDs, or other business-relevant identifiers. Configurable load imbalance handling enables spillover to other instances (see [Handling imbalanced loads](#handling-imbalance-loads)).
39
+
40
+
Unlike Session Affinity, Hash-Based Routing requires no code changes to the application.
Hash-Based Routing includes mechanisms to detect imbalanced load across application instances. An imbalanced load occurs when certain hashes receive more traffic, such as when a specific tenant generates many requests, resulting in heavier use of their mapped instances than others’. Additionally, multiple high-traffic targets might be assigned to the same instance.
45
+
46
+
To prevent overloading specific instances while others remain underutilized, the acceptable threshold for load imbalance can be configured using the `hash_balance` property.
47
+
This setting determines whether an instance is handling more traffic than its fair share based on the average load across all instances, measured by the number of in-flight requests. For example, with a balance factor of 1.25, no single instance should handle more than 125% of the average number of in-flight requests across all instances managed by the current router. When this threshold is exceeded, the router redirects subsequent requests to other, less-loaded instances.
48
+
Values of the balance factor in the 1.1-2.0 range offer a good balance between even distribution and performance. However, optimal values depend on the application's traffic patterns and load characteristics.
49
+
50
+
This approach ensures that a minimum number of instances process requests for a particular hash while preventing any single instance from becoming overloaded.
The Maglev algorithm used in Hash-Based Routing minimizes rehashing when application instances are added or removed. When a new instance is added, only a small subset of hashes is remapped to it, while most continue to route to their original instances. Similarly, when an instance is removed, only the hashes mapped to that instance are reassigned. This design minimizes disruption and maintains consistent routing behavior as the application scales up or down.
55
+
56
+
## <aid="retries-in-hash-based"></a> Retries in Hash-Based Routing
57
+
58
+
For idempotent requests, Hash-Based Routing supports a retry mechanism. If a request fails due to a network error or a 5xx response from the application instance, the router retries the request with a different, predetermined application instance. The next entry in the Maglev lookup table determines this instance. This approach aligns with the approach to handling imbalances. It ensures that the retry mechanism adhere to the principles of Hash-Based Routing while providing resilience against transient failures.
0 commit comments