mirror of
https://github.com/genuinetools/reg.git
synced 2024-08-21 14:20:23 -04:00
47 lines
1.4 KiB
Markdown
47 lines
1.4 KiB
Markdown
![]() |
# Stickiness
|
||
|
|
||
|
With load balancer, each RPC pick a different backend based on the load
|
||
|
balancing policy. Stickiness policies try to preserve peers for the duration of
|
||
|
a session, so that RPCs with the same stickiness key will be directed to the
|
||
|
same server.
|
||
|
|
||
|
Note that there's only "soft" stickiness now, which means RPCs with the same
|
||
|
stickienss key could still be sent to different servers. If stickiness is
|
||
|
critical for the system, server side application level handling is still
|
||
|
necessary.
|
||
|
|
||
|
## Stickiness Key
|
||
|
|
||
|
A stickiness key works as the session id. RPCs with the same stickiness key will
|
||
|
be assigned to the same backend.
|
||
|
|
||
|
Stickiness key is set as part of the custom metadata.
|
||
|
|
||
|
## Enable stickiness
|
||
|
|
||
|
Stickiness can be enabled by setting `stickinessKey` field in [service
|
||
|
config](https://github.com/grpc/grpc/blob/master/doc/service_config.md).
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"stickinessKey": "sessionid"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
The value `sesseionid` will be used as the key of the metadata entry that
|
||
|
defines the stickiness key for each RPC.
|
||
|
|
||
|
## Send RPC with stickiness
|
||
|
|
||
|
To set the stickiness key for an RPC, set the corresponding metadata. The
|
||
|
following RPC will be sent with stickiness key `session1`.
|
||
|
|
||
|
```go
|
||
|
// "sessionid" is the metadata key specified by service config, "session1" is
|
||
|
// the stickiness key for this RPC.
|
||
|
md := metadata.Paris("sessionid", "session1")
|
||
|
|
||
|
ctx := metadata.NewOutgoingContext(context.Background(), md)
|
||
|
resp, err := client.SomeRPC(ctx, req)
|
||
|
```
|