Node Pool¶
- class elastic_transport.NodePool(node_configs, node_class, dead_node_backoff_factor=1.0, max_dead_node_backoff=30.0, node_selector_class=<class 'elastic_transport.RoundRobinSelector'>, randomize_nodes=True)¶
Container holding the
BaseNode
instances, managing the selection process (via aNodeSelector
) and dead connections.It’s only interactions are with the
Transport
class that drives all the actions withinNodePool
.Initially nodes are stored on the class as a list and, along with the connection options, get passed to the
NodeSelector
instance for future reference.Upon each request the
Transport
will ask for aBaseNode
via theget_node
method. If the connection fails (it’s perform_request raises a ConnectionError) it will be marked as dead (via mark_dead) and put on a timeout (if it fails N times in a row the timeout is exponentially longer - the formula is default_timeout * 2 ** (fail_count - 1)). When the timeout is over the connection will be resurrected and returned to the live pool. A connection that has been previously marked as dead and succeeds will be marked as live (its fail count will be deleted).- get()¶
Return a node from the pool using the
NodeSelector
instance.It tries to resurrect eligible nodes, forces a resurrection when no nodes are available and passes the list of live nodes to the selector instance to choose from.
- Return type:
BaseNode
- mark_dead(node, _now=None)¶
Mark the node as dead (failed). Remove it from the live pool and put it on a timeout.
- Parameters:
node (
BaseNode
) – The failed node.- Return type:
- mark_live(node)¶
Mark node as healthy after a resurrection. Resets the fail counter for the node.
- Parameters:
node (
BaseNode
) – TheBaseNode
instance to mark as alive.- Return type:
- resurrect(force=False)¶
Attempt to resurrect a node from the dead queue. It will try to locate one (not all) eligible (it’s timeout is over) node to return to the live pool. Any resurrected node is also returned.
Node selectors¶
- class elastic_transport.NodeSelector(node_configs)¶
Simple class used to select a node from a list of currently live node instances. In init time it is passed a dictionary containing all the nodes options which it can then use during the selection process. When the
select()
method is called it is given a list of currently live nodes to choose from.The selector is initialized with the list of seed nodes that the NodePool was initialized with. This list of seed nodes can be used to make decisions within
select()
Example of where this would be useful is a zone-aware selector that would only select connections from it’s own zones and only fall back to other connections where there would be none in its zones.
- class elastic_transport.RandomSelector(node_configs)¶
Randomly select a node
- class elastic_transport.RoundRobinSelector(node_configs)¶
Select a node using round-robin