Skip to content

Getting Started

Cluster Bootstrap Sequence

From cold start to accepting writes in seconds.

Starting Nodes
node-1:5701
FOLLOWER
node-2:5702
FOLLOWER
node-3:5703
FOLLOWER
  • Java 25+ for the server (--enable-preview is required — virtual threads).
  • Java 17+ is enough for the client SDK.
  • Maven 3.9+.
Terminal window
java --version # expect 25 or higher on the server
Terminal window
git clone <repository>
cd DistributedCache
mvn clean install -DskipTests

Modules:

ModulePurpose
loom-commonWire protocol (MessageType, MessageCodec), Kryo serialization.
loom-serverTCP server, Raft, data structures, WAL, snapshots, CP subsystem.
loom-clientClient SDK: smart routing, near cache, pooling, retry.
loom-spring-bootSpring Boot 4.0.5 auto-configuration + REST controllers.
loom-integration-testsMulti-node IT suite with Jepsen-style chaos harness.

Server-only build: mvn -pl loom-server,loom-common -am clean package -DskipTests.

import com.loomcache.server.embedded.EmbeddedLoomCache;
import com.loomcache.client.LoomClient;
import com.loomcache.client.LoomMap;
EmbeddedLoomCache cache = EmbeddedLoomCache.builder()
.nodeId("embedded-1")
.port(5701)
.dataDir("./embedded-data")
.build();
cache.start();
LoomClient client = cache.client();
LoomMap<String, String> map = client.getMap("users");
map.put("alice", "Alice");
System.out.println(map.get("alice"));
cache.stop();
Terminal window
docker-compose up -d
docker-compose ps

Default port mapping:

ServiceCluster → hostMetrics → host
loomcache-node17654:76549090:9090
loomcache-node27655:76549091:9090
loomcache-node37656:76549092:9090

See Deployment (Docker/K8s) for production layouts.

LoomClient client = LoomClient.builder()
.addSeed("localhost:7654")
.addSeed("localhost:7655")
.addSeed("localhost:7656")
.requestTimeout(Duration.ofSeconds(15))
.maxRetries(3)
.build();
client.connect();
LoomMap<String, String> users = client.getMap("users");
users.put("alice", "Alice");
LoomQueue<String> tasks = client.getQueue("tasks");
tasks.offer("send-welcome-email");
LoomAtomicLong counter = client.consistencySubsystem().getAtomicLong("hits");
counter.incrementAndGet();
LoomTopic<String> events = client.getTopic("events", String.class);
int sub = events.subscribe(m -> System.out.println("got: " + m));
events.publish("hello");
events.unsubscribe(sub);
client.close();
loomcache:
cluster:
seeds: [127.0.0.1:5701, 127.0.0.1:5702, 127.0.0.1:5703]
client:
connect-timeout-ms: 5000
request-timeout-ms: 3000

The starter registers LoomClient and AsyncLoomClient beans. Set loomcache.server.enabled=true to run an embedded CacheNode inside the Spring Boot application.