NAME
ElasticSearch::Transport - Base class for communicating with ElasticSearch
DESCRIPTION
ElasticSearch::Transport is a base class for the modules which communicate with the ElasticSearch server.
It handles failover to the next node in case the current node closes the connection. All requests are round-robin'ed to all live servers.
Currently, the available backends are:
http
(default)Uses LWP to communicate using HTTP. See ElasticSearch::Transport::HTTP
httplite
Uses HTTP::Lite to communicate using HTTP. See ElasticSearch::Transport::HTTPLite
thrift
Uses
thrift
to communicate using a compact binary protocol over sockets. See ElasticSearch::Transport::Thrift
You shouldn't need to talk to the transport modules directly - everything happens via the main ElasticSearch class.
SYNOPSIS
use ElasticSearch;
my $e = ElasticSearch->new(
servers => 'search.foo.com:9200',
transport => 'httplite',
timeout => '10',
);
my $t = $e->transport;
$t->protocol # eg 'http'
$t->next_server # next node to use
$t->current_server # eg '127.0.0.1:9200' ie last used node
$t->default_servers # seed servers passed in to new()
$t->servers # eg ['192.168.1.1:9200','192.168.1.2:9200']
$t->servers(@servers); # set new 'live' list
$t->refresh_servers # refresh list of live nodes
$t->clear_clients # clear all open clients
$t->register('foo',$class) # register new Transport backend
WHICH TRANSPORT SHOULD YOU USE
Although the thrift
interface has the right buzzwords (binary, compact, sockets), the Perl backend is very slow. Until that is improved, I recommend one of the http
backends instead.
The httplite
backend is about 30% faster than the default http
backend, and will probably become the default after more testing in production.
Note: my experience with HTTP::Lite so far has been flawless - I'm just being cautious.
SUBCLASSING TRANSPORT
If you want to add a new transport backend, then these are the methods that you should subclass:
init()
$t->init($params)
Currently a no-op. Receives a HASH ref with the parameters passed in to new()
, less servers
, transport
and timeout
.
Any parameters specific to your module should be deleted from $params
send_request()
$json = $t->send_request($server,$params)
where $params = {
method => 'GET',
cmd => '/_cluster',
qs => { pretty => 1 },
data => '{ "foo": "bar"}',
}
This must be overridden in the subclass - it is the method called to actually talk to the server.
See ElasticSearch::Transport::HTTP for an example implementation.
protocol()
$t->protocol
This must return the protocol in use, eg "http"
or "thrift"
. It is used to extract the list of bound addresses from ElasticSearch, eg http_address
or thrift_address
.
client()
$client = $t->client($server)
Returns the client object used in "send_request()". The server param will look like "192.168.5.1:9200"
. It should store its clients in a PID specific slot in $t->{_client}
as clear_clients()
deletes this key.
See "client()" in ElasticSearch::Transport::HTTP and "client()" in ElasticSearch::Transport::Thrift for an example implementation.
Registering your Transport backend
You can register your Transport backend as follows:
BEGIN {
ElasticSearch::Transport->register('mytransport',__PACKAGE__);
}
SEE ALSO
LICENSE AND COPYRIGHT
Copyright 2010 Clinton Gormley.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.