Skip to content

A modern TypeScript library for synchronizing Redux stores across multiple processes and machines using TCP, Unix Domain Sockets, and IPC.

License

Notifications You must be signed in to change notification settings

siarheidudko/redux-cluster

Repository files navigation

Redux Cluster 2.0

npm npm NpmLicense GitHub last commit GitHub release

A modern TypeScript library for synchronizing Redux stores across multiple processes and machines using TCP, Unix Domain Sockets, and IPC.

๐ŸŒ Need WebSocket support for browsers? Check out redux-cluster-ws - our companion package that extends Redux Cluster with WebSocket transport for browser clients.

๐ŸŒŸ Key Features

  • ๐Ÿ”„ Real-time State Synchronization across multiple processes/machines
  • ๐ŸŒ Multiple Transport Options: TCP, Unix Domain Sockets, IPC
  • ๐ŸŒ WebSocket Support: Available via redux-cluster-ws
  • ๐Ÿ“ก Bidirectional Communication - any node can dispatch actions
  • ๐Ÿ”’ Built-in Security with authentication and IP banning
  • โšก High Performance with optimized networking and compression
  • ๐Ÿ—๏ธ Master-Slave Architecture with automatic leader election
  • ๐Ÿ”ง TypeScript First with comprehensive type definitions
  • ๐ŸŽฏ Redux Compatible - works with existing Redux ecosystem

๐Ÿ›๏ธ Architecture Overview

Redux Cluster implements a master-slave architecture where one server manages the authoritative state and distributes updates to all connected clients:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                        Redux Cluster Network                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         TCP/Socket          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚   Client A  โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚   Server    โ”‚    โ”‚
โ”‚  โ”‚  (Worker)   โ”‚                             โ”‚  (Master)   โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                             โ”‚             โ”‚    โ”‚
โ”‚                                              โ”‚             โ”‚    โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         TCP/Socket          โ”‚             โ”‚    โ”‚
โ”‚  โ”‚   Client B  โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚             โ”‚    โ”‚
โ”‚  โ”‚  (Worker)   โ”‚                             โ”‚             โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                       โ”‚         โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         TCP/Socket                   โ”‚         โ”‚
โ”‚  โ”‚   Client C  โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚  โ”‚  (Worker)   โ”‚                                                โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                                โ”‚
โ”‚                                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Data Flow

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    1. Action     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    2. Process   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Client    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚   Server    โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚    Redux    โ”‚
โ”‚             โ”‚                  โ”‚  (Master)   โ”‚                 โ”‚   Store     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ–ฒ                                โ”‚                               โ”‚
       โ”‚                                โ–ผ                               โ”‚
       โ”‚         4. State Update  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    3. State Changed   โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚  Broadcast  โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                  โ”‚   Engine    โ”‚
                                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                         โ”‚
                                         โ–ผ
                              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                              โ”‚    All Clients      โ”‚
                              โ”‚   (Auto-sync)       โ”‚
                              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿš€ Quick Start

1. Installation

npm install redux-cluster redux

2. Basic TCP Example

Server (Master):

const { createStore } = require('redux-cluster');

// Simple counter reducer
const counterReducer = (state = { counter: 0 }, action) => {
  switch (action.type) {
    case 'INCREMENT': return { counter: state.counter + 1 };
    case 'DECREMENT': return { counter: state.counter - 1 };
    default: return state;
  }
};

// Create store and server
const store = createStore(counterReducer);
const server = store.createServer({ port: 8080 });

console.log('Server started on port 8080');

// Server can dispatch actions
store.dispatch({ type: 'INCREMENT' });

Client (Worker):

const { createStore } = require('redux-cluster');

const store = createStore(counterReducer);
const client = store.createClient({ 
  host: 'localhost', 
  port: 8080 
});

// Client receives all state updates automatically
store.subscribe(() => {
  console.log('New state:', store.getState());
});

// Client can also dispatch actions
store.dispatch({ type: 'INCREMENT' });

๐ŸŒ Transport Options

Redux Cluster supports multiple transport mechanisms:

TCP (Network)

// Server
const server = store.createServer({ 
  host: 'localhost',
  port: 8080 
});

// Client  
const client = store.createClient({ 
  host: 'localhost',
  port: 8080 
});

Unix Domain Sockets (Local)

// Server
const server = store.createServer({ 
  path: '/tmp/redux-cluster.sock' 
});

// Client
const client = store.createClient({ 
  path: '/tmp/redux-cluster.sock' 
});

IPC (Node.js Cluster)

import cluster from 'cluster';

if (cluster.isMaster) {
  const store = createStore(reducer);
  cluster.fork(); // Start worker
} else {
  const store = createStore(reducer);
  // IPC automatically enabled in cluster workers
}

๐Ÿ”ง Configuration Options

Server Configuration

const server = store.createServer({
  host: 'localhost',     // TCP host
  port: 8080,           // TCP port  
  path: '/tmp/app.sock', // Unix socket path
  logins: {             // Authentication
    'user1': 'password1',
    'user2': 'password2'
  }
});

Client Configuration

const client = store.createClient({
  host: 'localhost',     // TCP host
  port: 8080,           // TCP port
  path: '/tmp/app.sock', // Unix socket path
  login: 'user1',       // Authentication
  password: 'password1'
});

Store Configuration

const store = createStore(reducer, {
  mode: 'action',           // 'action' | 'snapshot'
  serializationMode: 'json', // 'json' | 'protoobject'
  debug: false,             // Enable debug logging
  resync: 30000            // Resync interval (ms)
});

๐Ÿ“Š Synchronization Modes

Action Mode (Default)

Actions are distributed and replayed on all nodes:

Client A: dispatch(ACTION) โ”€โ”€โ–บ Server โ”€โ”€โ–บ broadcast(ACTION) โ”€โ”€โ–บ All Clients
                                  โ”‚
                                  โ–ผ
                              Apply ACTION to master state

Snapshot Mode

Complete state snapshots are distributed:

Client A: dispatch(ACTION) โ”€โ”€โ–บ Server โ”€โ”€โ–บ calculate new state โ”€โ”€โ–บ broadcast(STATE) โ”€โ”€โ–บ All Clients

๐Ÿ”’ Security Features

Authentication

const server = store.createServer({
  logins: {
    'api-service': 'secret-key-123',
    'worker-pool': 'another-secret'
  }
});

const client = store.createClient({
  login: 'api-service',
  password: 'secret-key-123'
});

IP Banning

Automatic IP banning after failed authentication attempts:

  • 5+ failed attempts = 3 hour ban
  • Automatic cleanup of expired bans
  • Configurable ban policies

๐ŸŽฎ Examples

See the examples/ directory for complete working examples:

๐ŸŒ WebSocket Examples: For browser integration examples with WebSocket transport, visit the redux-cluster-ws examples.

Each example includes a README with step-by-step instructions.

๐Ÿ“ฆ Related Packages

redux-cluster-ws

WebSocket transport layer for Redux Cluster, enabling browser client support:

npm install redux-cluster-ws

Features:

  • ๐ŸŒ WebSocket server and client
  • ๐Ÿ”— Seamless integration with Redux Cluster
  • ๐Ÿ–ฅ๏ธ Browser support for web applications
  • ๐Ÿ“ฑ Real-time state synchronization to browsers
  • ๐Ÿ”’ Same security features as core package

Links:

๐Ÿงช Testing

# Run all tests
npm test

# Run specific test suites
npm run test:unit       # Unit tests
npm run test:transport  # Transport integration tests

# Build and test
npm run build
npm run lint

# Run full integration tests (includes Docker)
npm run test:integration-full

๐Ÿ“ˆ Performance

Redux Cluster is optimized for high-throughput scenarios:

  • Compression: gzip compression for all network traffic
  • Binary Protocol: Efficient binary serialization options
  • Connection Pooling: Reuse connections where possible
  • Minimal Overhead: < 1ms latency for local sockets

Benchmark results:

  • TCP: ~10,000 actions/sec
  • Unix Sockets: ~50,000 actions/sec
  • IPC: ~100,000 actions/sec

๐Ÿ—บ๏ธ Roadmap

  • Redis Transport - Redis pub/sub for clustering
  • WebSocket Transport - Available in redux-cluster-ws
  • Conflict Resolution - CRDT-based conflict resolution
  • Persistence Layer - Automatic state persistence
  • Monitoring Dashboard - Real-time cluster monitoring
  • Load Balancing - Multiple master support

๐Ÿค Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Development Setup

git clone https://github.com/siarheidudko/redux-cluster.git
cd redux-cluster
npm install
npm run build
npm test

๐Ÿ“„ License

MIT License - see LICENSE file for details.

๐Ÿ†˜ Support

๐Ÿ’ Support This Project

If Redux Cluster helps you build amazing applications, consider supporting its development:

Your support helps maintain and improve Redux Cluster for the entire community!


Made with โค๏ธ by Siarhei Dudko

About

A modern TypeScript library for synchronizing Redux stores across multiple processes and machines using TCP, Unix Domain Sockets, and IPC.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •