module ManagedSet:sig..end
Manages a set of clients
type mset
a managed set
typemset_policy =[ `Balance_load | `Failover ]
Sets in which order managed clients are picked from the
services array passed to create_mset:
`Failover: Picks an element from the first service
in services that is enabled and has free capacity.
That means that the first service is preferred until it is
maxed out or it fails, then the second service is preferred,
and so on.`Balance_load: Picks an element from the service in
services that is enabled and has the lowest load.type mset_config = {
|
mset_mclient_config : |
(* | The mclient config | *) |
|
mset_policy : |
(* | The policy | *) |
|
mset_pending_calls_max : |
(* | When an mclient processes this number of calls at the same time, it is considered as fully busy. (Value must by > 0). | *) |
|
mset_pending_calls_norm : |
(* | When an mclient processes less than this number of calls, its load is considered as too light, and it is tried to put more load on this client before opening another one | *) |
|
mset_idempotent_max : |
(* | How often idempotent procedures may be tried to be called. A negative value means infinite. | *) |
|
mset_idempotent_wait : |
(* | Wait this number of seconds before trying again | *) |
Raised by mset_pick when no available endpoint can be found,
or all available endpoints have reached their maximum load.
val create_mset_config : ?mclient_config:Rpc_proxy.ManagedClient.mclient_config ->
?policy:mset_policy ->
?pending_calls_max:int ->
?pending_calls_norm:int ->
?idempotent_max:int ->
?idempotent_wait:float -> unit -> mset_configCreate a config record. The optional arguments set the config components with the same name. The defaults are:
mclient_config: The default mclient configpolicy: `Balance_loadpending_calls_max: max_intpending_calls_norm: 1idempotent_max: 3idempotent_wait: 5.0val create_mset : mset_config ->
(Rpc_client.connector * int) array ->
Unixqueue.event_system -> msetcreate_mset config services: The mset is created with config,
and the services array describes which ports are available,
and how often each port may be contacted (i.e. max number of
connections).
val mset_pick : ?from:int list ->
mset -> Rpc_proxy.ManagedClient.mclient * intPick an mclient for another call, or raise Cluster_service_unavailable.
The returned int is the index in the mset_services array.
If from is given, not all specified mclients qualify for this
call. In from one can pass a list of indexes pointing into
the mset_services array, and only from these mclients the
mclient is picked. For `Failover policies, the order given
in from is respected, and the mclients are checked from left
to right.
val mset_services : mset -> (Rpc_client.connector * int) arrayReturns the service array
val mset_load : mset -> int arrayReturns the number of pending calls per service
val event_system : mset -> Unixqueue.event_systemReturn the event system
val shut_down : mset -> unit
val sync_shutdown : mset -> unit
val trigger_shutdown : mset -> (unit -> unit) -> unitShut down the managed set. See the corresponding functions
Rpc_client.shut_down, Rpc_client.sync_shutdown, and
Rpc_client.trigger_shutdown
val idempotent_async_call : ?from:int list ->
mset ->
(Rpc_proxy.ManagedClient.mclient -> 'a -> ((unit -> 'b) -> unit) -> unit) ->
'a -> ((unit -> 'b) -> unit) -> unitidempotent_async_call
mset async_call arg emit: Picks a new
mclient and calls async_call mclient arg emit.
If the call leads to a fatal error, a new mclient
is picked, and the call is repeated. In total, the call may be
tried mset_idempotent_max times. It is recommended to set
rcache_threshold to 1 when using this function because this
enforces that a different mclient is picked when the first one
fails.
Note that a timeout is not considered as a fatal error by default;
one has to enable that by setting mclient_msg_timeout_is_fatal.
Note that this form of function is compatible with the
generated foo'async functions of the language mapping.
from has the same meaning as in mset_pick.
val idempotent_sync_call : ?from:int list ->
mset ->
(Rpc_proxy.ManagedClient.mclient -> 'a -> ((unit -> 'b) -> unit) -> unit) ->
'a -> 'bSynchronized version. Note that you have to pass an asynchronous function as second argument. The result is synchronous, however.