Skip to content

Commit e7e775e

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

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

README.md

+96
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,100 @@ 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 `TarantoolClusterClientImpl` 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 getClusterNodes() 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 = "getClusterNodes"; // discovery function used to fetch nodes
222+
config.clusterDiscoveryDelayMillis = 60_000; // how often client polls the discovery server
223+
```
224+
225+
See [TarantoolClientConfig](http://tarantool.github.io/tarantool-java/apidocs/index.html?org/tarantool/TarantoolClientConfig.html)
226+
javadoc for more information.
227+
228+
3. Create a client using the config made above.
229+
230+
```java
231+
TarantoolClusterClient client = new TarantoolClusterClient(config);
232+
client.syncOps().insert(45, Arrays.asList(1, 1));
233+
```
234+
235+
#### Auto-discovery caveats
236+
237+
* You need to supply both `clusterDiscoveryEntryInstance` and `clusterDiscoveryEntryFunction`
238+
to enable auto-discovery feature.
239+
* There are only two cases when a discovery task runs: just after initialization of the cluster
240+
client and a periodical scheduler timeout defined in `TarantoolClusterClientConfig.clusterDiscoveryDelayMillis`.
241+
* It's possible both provide an initial node list and enable auto-discovery.
242+
In this way client will establish first connection to the Tarantool server using
243+
the initial list and when the client receives a new list it will replace the list if required.
244+
* When auto-discovery is enabled but the initial node list isn't provided the client
245+
will wait for the list obtained from the discovery server. If fetching and connection
246+
take more than `TarantoolClientConfig.initTimeoutMillis` then client will be closed
247+
by timeout.
248+
* It's possible to obtain a list which does NOT contain the node we are currently
249+
connected to. It leads the client to try to reconnect to another node from the
250+
new list. It may take some time to graceful disconnect from the current node.
251+
The client does its best to catch the moment when no messages are pending by the
252+
client.
253+
159254
## Where to get help
160255
161256
Got problems or questions? Post them on
@@ -164,6 +259,7 @@ Got problems or questions? Post them on
164259
base for possible answers and solutions.
165260
166261
## Building
262+
167263
To run tests
168264
```
169265
./mvnw clean test

0 commit comments

Comments
 (0)