Skip to content

Commit 2254610

Browse files
committed
Add cluster feature docs
1 parent 4715727 commit 2254610

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ To get the Java connector for Tarantool 1.6.9, visit
1717

1818
## Table of contents
1919
* [Getting started](#getting-started)
20+
* [Cluster support](#cluster-support)
2021
* [Where to get help](#where-to-get-help)
2122

2223
## Getting started
@@ -156,6 +157,97 @@ System.out.println(template.query("select * from hello_world where hello=:id", C
156157

157158
For more implementation details, see [API documentation](http://tarantool.github.io/tarantool-java/apidocs/index.html).
158159

160+
## Cluster support
161+
162+
To be more fault-tolerant the connector provides cluster extensions. In
163+
particular `TarantoolClusterClient` and built-in `RoundRobinSocketProviderImpl`
164+
used as a default `SocketProvider` implementation. When currently connected
165+
instance is down then the client will try to reconnect to the first available
166+
instance using strategy defined in a socket provider. You need to supply
167+
a list of nodes which will be used by the cluster client to provide such
168+
ability. Also you can prefer to use a [discovery mechanism](#auto-discovery)
169+
in order to dynamically fetch and apply the node list.
170+
171+
#### Basic cluster client usage
172+
173+
1. Configure `TarantoolClusterClientConfig`:
174+
175+
```java
176+
TarantoolClusterClientConfig config = new TarantoolClusterClientConfig();
177+
// fill other settings
178+
config.operationExpiryTimeMillis = 2000;
179+
config.executor = Executors.newSingleThreadExecutor();
180+
```
181+
182+
2. Create an instance of `TarantoolClusterClientImpl`. You need to provide
183+
an initial list of nodes:
184+
185+
```java
186+
String[] nodes = new String[] { "myHost1:3301", "myHost2:3302", "myHost3:3301" };
187+
TarantoolClusterClient client = new TarantoolClusterClient(config, nodes);
188+
```
189+
190+
3. Work with the client using same API as defined in `TarantoolClient`:
191+
192+
```java
193+
client.syncOps().insert(23, Arrays.asList(1, 1));
194+
```
195+
196+
#### Auto-discovery
197+
198+
Auto-discovery feature allows a cluster client to fetch addresses of
199+
cluster nodes to reflect changes related to the cluster topology. To achieve
200+
this you have to create a LUA function on the server side which returns
201+
a single array result. Client periodically pools the server to obtain a
202+
fresh list and apply it if its content changes.
203+
204+
1. On the server side create a function which returns nodes:
205+
206+
```bash
207+
tarantool> function get_cluster_nodes() return { 'host1:3301', 'host2:3302', 'host3:3301' } end
208+
```
209+
210+
You need to pay attention to a function contract we are curretly supporting:
211+
* The discovery function must NOT consume any parameters.
212+
* The discovery function must return a singe array result (any other cases such as
213+
multi-return result will be discarded)
214+
215+
2. On the client side configure discovery settings in `TarantoolClusterClientConfig`:
216+
217+
```java
218+
TarantoolClusterClientConfig config = new TarantoolClusterClientConfig();
219+
// fill other settings
220+
config.clusterDiscoveryEntryInstance = "10.0.0.15:3301"; // target discovery server
221+
config.clusterDiscoveryEntryFunction = "get_cluster_nodes"; // discovery function used to fetch nodes
222+
config.clusterDiscoveryDelayMillis = 60_000; // how often client polls the discovery server
223+
```
224+
225+
3. Create a client using the config made above.
226+
227+
```java
228+
TarantoolClusterClient client = new TarantoolClusterClient(config);
229+
client.syncOps().insert(45, Arrays.asList(1, 1));
230+
```
231+
232+
#### Auto-discovery caveats
233+
234+
* You need to supply both `clusterDiscoveryEntryInstance` and `clusterDiscoveryEntryFunction`
235+
to enable auto-discovery feature.
236+
* There are only two cases when a discovery task runs: just after initialization of the cluster
237+
client and a periodical scheduler timeout defined in `TarantoolClusterClientConfig.clusterDiscoveryDelayMillis`.
238+
* It's possible both provide an initial node list and enable auto-discovery.
239+
In this way client will establish first connection to the Tarantool server using
240+
the initial list and when the client receives a new list it will replace the list if required.
241+
* When auto-discovery is enabled but the initial node list isn't provided the client
242+
will wait for the list obtained from the discovery server. If fetching and connection
243+
take more than `TarantoolClientConfig.initTimeoutMillis` then client will be closed
244+
by timeout.
245+
* It's possible to obtain a list which does NOT contain the node we are currently
246+
connected to. It leads the client to try to reconnect to another node from the
247+
new list. It may take some time to graceful disconnect from the current node.
248+
The client does its best to catch the moment when no messages are pending by the
249+
client.
250+
159251
## Where to get help
160252
161253
Got problems or questions? Post them on
@@ -164,6 +256,7 @@ Got problems or questions? Post them on
164256
base for possible answers and solutions.
165257
166258
## Building
259+
167260
To run tests
168261
```
169262
./mvnw clean test

0 commit comments

Comments
 (0)