NameResolver and provides the
channel a usable subchannel when asked.
A LoadBalancer typically implements three interfaces:
LoadBalancer is the main interface. All methods on it are invoked sequentially
in the same synchronization context (see next section) as returned by
io.grpc.LoadBalancer.Helper#getSynchronizationContext . It receives the results
from the NameResolver, updates of subchannels' connectivity states, and the
channel's request for the LoadBalancer to shutdown.SubchannelPicker does the actual load-balancing work. It selects
a Subchannel for each new RPC.Factory creates a new LoadBalancer instance.
Helper is implemented by gRPC library and provided to Factory. It provides functionalities that a LoadBalancer implementation would typically
need.
All methods on the LoadBalancer interface are called from a Synchronization Context,
meaning they are serialized, thus the balancer implementation doesn't need to worry about
synchronization among them. io.
allows implementations to schedule tasks to be run in the same Synchronization Context, with or
without a delay, thus those tasks don't need to worry about synchronizing with the balancer
methods.
However, the actual running thread may be the network thread, thus the following rules must be followed to prevent blocking or even dead-locking in a network:
handleResolvedAddresses())
while calling into another method that also involves locks, be cautious of deadlock. Generally
you wouldn't need any locking in the LoadBalancer if you follow the canonical implementation
pattern below.A LoadBalancer keeps states like the latest addresses from NameResolver, the
Subchannel(s) and their latest connectivity states. These states are mutated within the
Synchronization Context,
A typical SubchannelPicker holds a snapshot of these states. It may
have its own states, e.g., a picker from a round-robin load-balancer may keep a pointer to the
next Subchannel, which are typically mutated by multiple threads. The picker should only mutate
its own state, and should not mutate or re-acquire the states of the LoadBalancer. This way the
picker only needs to synchronize its own states, which is typically trivial to implement.
When the LoadBalancer states changes, e.g., Subchannels has become or stopped being READY, and
we want subsequent RPCs to use the latest list of READY Subchannels, LoadBalancer would create a
new picker, which holds a snapshot of the latest Subchannel list. Refer to the javadoc of onSubchannelState() how to do
this properly.
No synchronization should be necessary between LoadBalancer and its pickers if you follow the pattern above. It may be possible to implement in a different way, but that would usually result in more complicated threading.
| Modifier and Type | Class and Description |
|---|---|
| public static class | LoadBalancer.CreateSubchannelArgs
Arguments for creating a |
| public static class | LoadBalancer.ErrorPicker
Deprecated
Use A picker that always returns an erring pick.
new FixedResultPicker(PickResult.withError(error)) instead.
|
| public abstract static class | LoadBalancer.Factory
Factory to create |
| public static class | LoadBalancer.FixedResultPicker
A picker that always returns the same result. |
| public abstract static class | LoadBalancer.Helper
Provides essentials for LoadBalancer implementations. |
| public static class | LoadBalancer.PickResult
A balancing decision made by |
| public abstract static class | LoadBalancer.PickSubchannelArgs
Provides arguments for a |
| public static class | LoadBalancer.ResolvedAddresses
Represents a combination of the resolved server address, associated attributes and a load balancing policy config. |
| public abstract static class | LoadBalancer.Subchannel
A logical connection to a server, or a group of equivalent servers represented by an |
| public abstract static class | LoadBalancer.SubchannelPicker
The main balancing logic. |
| public static interface | LoadBalancer.SubchannelStateListener
Receives state changes for one |
| Modifier and Type | Field and Description |
|---|---|
| public static final Attributes. | |
| public static final LoadBalancer. | |
| private int |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public Status | Returns: true if the resolved addresses were accepted. false if rejected.the resolved server addresses, attributes, and config. resolvedAddressesAccepts newly resolved addresses from the name resolution system. |
| public boolean | canHandleEmptyAddressListFromNameResolution()
Whether this LoadBalancer can handle empty address group list to be passed to |
| public abstract void | handleNameResolutionError(Status
a non-OK status error)Handles an error from the name resolution system. |
| public void | handleResolvedAddresses(LoadBalancer.
the resolved server addresses, attributes, and config. resolvedAddressesHandles newly resolved server groups and metadata attributes from name resolution system. |
| public void | handleSubchannelState(LoadBalancer.
the involved Subchannel subchannel,the new state stateInfo)
Deprecated
This method will be removed.
Handles a state change on a Subchannel.
|
| public void | requestConnection()
The channel asks the LoadBalancer to establish connections now (if applicable) so that the upcoming RPC may then just pick a ready connection without waiting for connections. |
| public abstract void |