Provided by: libmr-tarantool-perl_0.0.24-2_all 

NAME
MR::IProto - iproto network protocol client
SYNOPSIS
IProto client can be created with full control of its behaviour:
my $client = MR::IProto->new(
cluster => MR::IProto::Cluster->new(
servers => [
MR::IProto::Cluster::Server->new(
host => 'xxx.xxx.xxx.xxx',
port => xxxx,
),
...
],
),
);
Or without it:
my $client = MR::IProto->new(
servers => 'xxx.xxx.xxx.xxx:xxxx,xxx.xxx.xxx.xxx:xxxx',
);
Messages can be prepared and processed using objects (requires some more CPU):
my $request = MyProject::Message::MyOperation::Request->new(
arg1 => 1,
arg2 => 2,
);
my $response = $client->send($request);
# $response isa My::Project::Message::MyOperation::Response.
# Of course, both message classes (request and reply) must
# be implemented by user.
Or without them:
my $response = $client->send({
msg => x,
data => [...],
pack => 'xxx',
unpack => sub {
my ($data) = @_;
return (...);
},
});
Messages can be sent synchronously:
my $response = $client->send($response);
# exception is raised if error is occurred
# besides $@ you can check $! to identify reason of error
Or asynchronously:
use AnyEvent;
my $callback = sub {
my ($reply, $error) = @_;
# on error $error is defined and $! can be set
return;
};
$client->send($request, $callback);
# callback is called when reply is received or error is occurred
It is recommended to disconnect all connections in child after fork() to prevent possible conflicts:
my $pid = fork();
if ($pid == 0) {
MR::IProto->disconnect_all();
}
DESCRIPTION
This client is used to communicate with cluster of balanced servers using iproto network protocol.
To use it nicely you should to implement two subclasses of MR::IProto::Message for each message type, one
for request message and another for reply. This classes must be named as "prefix::*::suffix", where
prefix must be passed to constructor of MR::IProto as value of "prefix" attribute and suffix is either
"Request" or "Response". This classes must be loaded before first message through client object will be
sent.
To send messages asynchronously you should to implement event loop by self. AnyEvent is recommended.
ATTRIBUTES
prefix
Prefix of the class name in which hierarchy subclasses of MR::IProto::Message are located. Used to
find reply message classes.
cluster
Instance of MR::IProto::Cluster. Contains all servers between which requests can be balanced. Also
can be specified in servers parameter of constructor as a list of "host:port" pairs separated by
comma.
max_parallel
Max amount of simultaneous request to all servers.
max_request_retries
Max amount of request retries which must be sent to different servers before error is returned.
retry_delay
Delay between request retries.
PUBLIC METHODS
new( [ %args | \%args ] )
Constructor. See "ATTRIBUTES" and "BUILDARGS" for more information about allowed arguments.
send( [ $message | \%args ], $callback? )
Send $message to server and receive reply.
If $callback is passed then request is done asynchronously and reply is passed to callback as first
argument. Method must be called in void context to prevent possible errors. Only client errors can
be raised in async mode. All communication errors are passed to callback as second argument.
Additional information can be extracted from $! variable.
In sync mode (when $callback argument is skipped) all errors are raised and $! is also set. Response
is returned from method, so method must be called in scalar context.
Request $message can be instance of MR::IProto::Message subclass. In this case reply will be also
subclass of MR::IProto::Message. Or it can be passed as "\%args" hash reference with keys described
in "_send".
send_bulk( \@messages, $callback? )
Send all of messages in "\@messages" and return result (sync-mode) or call callback (async-mode)
after all replies was received. Result is returned as array reference, which values can be instances
of MR::IProto::Response or MR::IProto::Error if request was passed as object, or hash with keys
"data" and "error" if message was passed as "\%args". Replies in result can be returned in order
different then order of requests.
See "_send" for more information about message data. Either $message or "\%args" allowed as content
of "\@messages".
disconnect_all
Class method used to disconnect all iproto-connections. Very useful in case of fork().
PROTECTED METHODS
BUILDARGS( [ %args | \%args ] )
For compatibility with previous version of client and simplicity some additional arguments to
constructor is allowed:
servers
"host:port" pairs separated by comma used to create MR::IProto::Cluster::Server objects.
timeout, tcp_nodelay, tcp_keepalive, dump_no_ints
Are passed directly to constructor of MR::IProto::Cluster::Server.
balance
Is passed directly to constructor of MR::IProto::Cluster.
See "BUILDARGS" in Mouse::Manual::Construction for more information.
_send( [ $message | \%args ], $callback? )
Pure asyncronious internal implementation of send.
$message is an instance of MR::IProto::Message. If "\%args" hash reference is passed instead of
$message then it can contain following keys:
msg Message code.
key Depending on this value balancing between servers is implemented.
data
Message data. Already packed or unpacked. Unpacked data must be passed as array reference and
additional parameter pack must be passed.
pack
First argument of pack function.
unpack
Code reference which is used to unpack reply.
no_reply
Message have no reply.
retry
Is retry is allowed. Values of attributes "max_request_retries" and "retry_delay" is used if
retry is allowed.
is_retry
Callback used to determine if server asks for retry. Unpacked data is passed to it as a first
argument.
SEE ALSO
MR::IProto::Cluster, MR::IProto::Cluster::Server, MR::IProto::Message.
perl v5.30.3 2020-07-21 MR::IProto(3pm)