Skip to content

Commit 212296b

Browse files
committed
Add cluster feature docs
1 parent 9e3245d commit 212296b

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

README.md

+87
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,91 @@ 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.clusterDiscoveryEntryFunction = "get_cluster_nodes"; // discovery function used to fetch nodes
221+
config.clusterDiscoveryDelayMillis = 60_000; // how often client polls the discovery server
222+
```
223+
224+
3. Create a client using the config made above.
225+
226+
```java
227+
TarantoolClusterClient client = new TarantoolClusterClient(config);
228+
client.syncOps().insert(45, Arrays.asList(1, 1));
229+
```
230+
231+
#### Auto-discovery caveats
232+
233+
* You need to set _not empty_ value to `clusterDiscoveryEntryFunction` to enable auto-discovery feature.
234+
* There are only two cases when a discovery task runs: just after initialization of the cluster
235+
client and a periodical scheduler timeout defined in `TarantoolClusterClientConfig.clusterDiscoveryDelayMillis`.
236+
* A discovery task always uses an active client connection to get the nodes list.
237+
It's in your responsibility to provide a function availability as well as a consistent
238+
nodes list on all nodes you initially set or obtain from the task.
239+
* It's possible to obtain a list which does NOT contain the node we are currently
240+
connected to. It leads the client to try to reconnect to another node from the
241+
new list. It may take some time to graceful disconnect from the current node.
242+
The client does its best to catch the moment when no messages are pending by the
243+
client.
244+
159245
## Where to get help
160246
161247
Got problems or questions? Post them on
@@ -164,6 +250,7 @@ Got problems or questions? Post them on
164250
base for possible answers and solutions.
165251
166252
## Building
253+
167254
To run tests
168255
```
169256
./mvnw clean test

0 commit comments

Comments
 (0)