noex

|

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

Inspirováno 40+ lety Erlang/OTP

Proč noex?

Node.js je rychlý a flexibilní, ale budování spolehlivých distribuovaných systémů vyžaduje ověřené vzory. noex přináší prověřené koncepty z Erlang/OTP do TypeScriptu, abyste se mohli soustředit na byznys logiku místo infrastruktury.

Prověřené vzory

GenServer, Supervisor, Registry - koncepty, které pohání WhatsApp, Discord a miliony telekomunikačních systémů po celém světě. Nyní dostupné ve vašem TypeScript kódu.

Odolnost od základu

Přijměte filozofii 'nech to spadnout'. Procesy selhávají elegantně a supervisoři je automaticky restartují. Žádné kaskádové selhání, které by položilo celou aplikaci.

Distribuovaný od začátku

Stejný kód, který běží na jednom stroji, škáluje přes celý cluster. Transparentní lokace zpráv znamená, že při škálování nic nepřepisujete.

Monitoring v základu

Vestavěný webový dashboard a terminálové UI vám ukáže přesně, co se děje. Sledujte stavy procesů, propustnost zpráv a chyby v reálném čase bez jakékoli konfigurace.

Podívejte se, jaké problémy noex řeší

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.

Supervisor

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

Registry

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

Pokročilé vzory

Abstrakce vyšší úrovně pro běžné konkurenční scénáře

GenStateMachine

Explicitní konečné automaty s typovanými stavy a přechody. Ideální pro workflows a protokoly.

WorkflowsProtocolsGame logic

Agent

Jednoduchý kontejner stavu, když potřebujete jen stav, ne celý proces. Funkcionální aktualizace s get/update.

CountersAccumulatorsSimple state

Task

Supervisované asynchronní operace s řízením konkurence. Spouštějte fire-and-forget úlohy nebo čekejte na výsledky.

Batch processingParallel I/OJob queues

Application Framework

Kompletní správa životního cyklu pro produkčně připravené aplikace

Připraveno pro Kubernetes Docker-friendly Otestováno v produkci

Správa životního cyklu

Konzistentní startup sekvence s health checky. Spouštějte, zastavujte a monitorujte aplikaci pomocí jednotného API.

Zpracování signálů

Automatické zpracování SIGINT/SIGTERM pro Docker a Kubernetes. Vaše procesy se korektně ukončí.

Graceful shutdown

prepStop hooky dají službám čas na dokončení prací. Konfigurovatelné timeouty zabrání zaseknutým shutdownům.

application.ts
const MyApp = Application.create({
  async start(config) {
    const supervisor = await Supervisor.start({
      strategy: 'one_for_one',
      children: [
        { id: 'db', start: () => DatabasePool.start(config.dbUrl) },
        { id: 'api', start: () => ApiServer.start(config.port) }
      ]
    });
    return supervisor;
  },

  async prepStop(supervisor) {
    // Stop accepting new requests
  },

  async stop(supervisor) {
    // Final cleanup
  }
});

await Application.start(MyApp, {
  name: 'my-service',
  config: { port: 3000, dbUrl: 'postgres://...' }
});
// Handles SIGINT/SIGTERM automatically

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

EventBus

Publish/subscribe messaging mezi procesy

Decoupled communicationEvent sourcingReal-time updates

RateLimiter

Token bucket rate limiting pro API a zdroje

API protectionResource throttlingDoS prevention

ETS

Erlang Term Storage - rychlé in-memory key-value úložiště s pattern matchingem

Fast lookupsSession dataShared state

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