noex

|

Vytvářejte odolné, škálovatelné systémy v TypeScriptu

Node.js je skvělý, ale...

Běžné problémy, které zpomalují vývoj a způsobují produkční incidenty

Race Conditions

Sdílený měnitelný stav vede k nepředvídatelným chybám

Kaskádové chyby

Jedna chyba může shodit celou aplikaci

Složitost škálování

Distribuované systémy jsou obtížné na správné nastavení

noex tyto problémy řeší

Základní koncepty

Osvědčené vzory z Erlang/OTP, přepracované pro TypeScript

GenServer

Stavové procesy bez race conditions. Sekvenční zpracování zpráv garantuje konzistenci.

class Counter extends GenServer {
  init() { return 0; }

  handleCall(msg: 'get') {
    return this.state;
  }

  handleCast(msg: 'inc') {
    this.state++;
  }
}

Supervisor

Automatický restart při selhání. Filozofie 'nech to spadnout' s chytrými strategiemi obnovy.

const supervisor = new Supervisor({
  children: [
    { id: 'counter', start: () => Counter },
    { id: 'cache', start: () => Cache }
  ],
  strategy: 'one_for_one',
  maxRestarts: 3
});

Registry

Vyhledávání procesů podle jména. Najděte procesy pomocí názvu místo správy referencí.

// Register a process
Registry.register('user:123', userProcess);

// Find it anywhere
const user = Registry.lookup('user:123');
await user.call({ type: 'getProfile' });

Vestavěné služby

Produkčně připravené utility, které bezproblémově spolupracují s vašimi procesy

Cache

In-memory cache s TTL a automatickým čištěním

Session storageAPI responsesComputed data
cache.ts
// Cache with TTL
const cache = new Cache({ ttl: 60_000 });

await cache.set('user:123', userData);
const user = await cache.get('user:123');

// Auto-cleanup on expiration

EventBus

Publish/subscribe messaging mezi procesy

Decoupled communicationEvent sourcingReal-time updates
eventbus.ts
// Pub/sub messaging
const bus = new EventBus();

bus.subscribe('order:created', async (order) => {
  await sendConfirmation(order);
});

bus.publish('order:created', newOrder);

RateLimiter

Token bucket rate limiting pro API a zdroje

API protectionResource throttlingDoS prevention
ratelimiter.ts
// Token bucket rate limiting
const limiter = new RateLimiter({
  tokens: 100,
  interval: 60_000
});

if (await limiter.acquire('api:user:123')) {
  // Process request
}

Observabilita v základu

Monitorujte své procesy v reálném čase bez jakékoli konfigurace

noex dashboard — Terminal
┌─ Process Tree ────────────────┐ ┌─ Stats Table ─────────────────────────────────────┐
supervisor:main │ │ ID │ Status │ Msgs │ Mem │ Up │
│ ├─ counter (running) │ │─────────────────┼─────────┼──────┼────────┼───────│
│ ├─ cache (running) │ │ counter │ running1.2k2.4 MB │ 01:23 │
│ ├─ rate-limiter (running) │ │ cache │ running │ 847 │ 12 MB │ 01:23 │
│ └─ event-bus (running) │ │ rate-limiter │ running │ 156 │ 1.1 MB │ 01:23 │
│ │ │ event-bus │ running2.1k3.2 MB │ 01:23 │
└───────────────────────────────┘ └───────────────────────────────────────────────────┘
┌─ Memory ──────────────────────┐ ┌─ Event Log ───────────────────────────────────────┐
│ │ [12:34:56] GenServer started: counter │
67% / 256MB │ │ [12:34:57] GenServer started: cache │
│ │ │ [12:34:58] Supervisor: main (4 children) │
└───────────────────────────────┘ └───────────────────────────────────────────────────┘
[q]uit [r]efresh [?]help [1-3]layout │ Processes: 4 │ Up: 00:01:23
npx @hamicek/noex dashboard

Webový dashboard

Webové rozhraní pro vzdálený monitoring

Terminálové UI

Interaktivní terminálový dashboard s klávesovou navigací

Metriky procesů

CPU, paměť a propustnost zpráv v reálném čase

Strukturované logy

Události s časovými razítky a úrovní závažnosti

Aktualizace v reálném čase Bez konfigurace Podpora clusteru

Distribuovaný od návrhu

Škálujte napříč stroji s transparentní lokací. Vaše procesy fungují stejně na jednom stroji i na stovkách.

Lokální uzel Vzdálené uzly
Auto-discovery Bez single point of failure Bezešvý failover

P2P Clustering

Uzly se automaticky objevují pomocí mDNS nebo seed nodů. Žádný centrální koordinátor není potřeba.

Globální registr

Registrujte a vyhledávejte procesy napříč všemi uzly podle jména. Jedno API pro lokální i vzdálené procesy.

Transparentní lokace

Posílejte zprávy procesům bez ohledu na jejich fyzické umístění. Runtime se postará o routování.

cluster.ts
// Register a process globally
await GlobalRegistry.register('user:session:123', pid);

// Find it from any node in the cluster
const pid = await GlobalRegistry.whereis('user:session:123');

// Send a message - works across nodes
await GenServer.call(pid, { type: 'get_data' });

Stejné API pro lokální i vzdálené procesy

Vyzkoušejte si to

Prozkoumejte reálné příklady a uvidíte noex v akci

counter.ts
import { GenServer, Supervisor, Registry } from class=class="hl-string">"hl-string">'@hamicek/noex';

class Counter extends GenServer {
  init() {
    return 0;
  }

  handleCall(msg: { type: class=class="hl-string">"hl-string">'get' }) {
    return this.state;
  }

  handleCast(msg: { type: class=class="hl-string">"hl-string">'increment' } | { type: class=class="hl-string">"hl-string">'decrement' }) {
    if (msg.type === class=class="hl-string">"hl-string">'increment') {
      this.state++;
    } else {
      this.state--;
    }
  }
}

class=class="hl-string">"hl-comment">// Start the counter
const counter = await Counter.start();

class=class="hl-string">"hl-comment">// Interact with it
await counter.cast({ type: class=class="hl-string">"hl-string">'increment' });
await counter.cast({ type: class=class="hl-string">"hl-string">'increment' });
const value = await counter.call({ type: class=class="hl-string">"hl-string">'get' });

console.log(class=class="hl-string">"hl-string">'Counter value:', value);
Terminál

Připraveni budovat odolné systémy?

Začněte za pár minut jednoduchou instalací přes npm

Instalujte přes npm
$ npm install @hamicek/noex

Rychlý start

  1. 1
    Nainstalujte balíček npm install @hamicek/noex
  2. 2
    Importujte a používejte import { GenServer } from '@hamicek/noex'
  3. 3
    Spusťte svůj proces await Counter.start()
counter.ts
import { GenServer } from class=class="hl-string">"hl-string">'@hamicek/noex';

class Counter extends GenServer {
  init() { return 0; }

  handleCast(msg: class=class="hl-string">"hl-string">'inc') {
    this.state++;
  }
}

const counter = await Counter.start();

Podpořte projekt

Líbí se vám noex? Pomozte nám pokračovat ve vývoji

Bitcoin
Bitcoin QR Code