Apache-2.0
Rust · Real-time

mtwRequest

Eén Rust-runtime voor WebSocket, HTTP en AI-agents.

Stop met drie services aan elkaar plakken. Gedeelde verbinding, auth en state — in één core.

Drie services in één

De meeste stacks bouten een pub/sub-broker, een REST-framework en een agent-runtime aan elkaar — drie deploys, drie auth-oppervlakken, drie failure modes. mtwRequest klapt alle drie samen in één Rust-core.

Drie aparte services
  • →NATS / Centrifugo voor pub/sub
  • →Express / Fastify voor HTTP
  • →Apart agent-framework voor AI
  • →Drie deploys, drie auth-oppervlakken
  • →Handgeschreven lijm voor state-sync
Eén mtwRequest-core
  • ✓WebSocket + HTTP delen dezelfde verbinding
  • ✓AI-agents zijn first-class modules
  • ✓Eén auth, één state, één tracing
  • ✓Module-marketplace voor compositie
  • ✓Apache-2.0 — fork het, ship het

Head-to-head benchmarks

Same-host, Docker 2 CPU / 2 GB per concurrent, payload 128 B, HdrHistogram 3 significante cijfers.

Reproduceerbare runner in bench-suite/.

Scenario mtwRequest vs leiders
🥈 Fanout 100 subs · p50 17.53 ms gelijk met NATS (16.97 ms)
🥇 Fanout 1000 subs · p50 197.53 ms 1.5× sneller dan NATS (299.63 ms)
🥇 Fanout 1000 subs · p99 367.79 ms beter dan NATS (554.70 ms)
🥈 Echo RTT · p50 62.2 µs gelijk met NATS (Δ 3.8 µs)
🥇 Connect storm · rate 50.9 k conn/s 2.7× meer dan NATS

mtwRequest scoort 🥇 of 🥈 op elke latency-metric — én bundelt HTTP, AI-agents, auth, trading en MCP in dezelfde core.

Waar NATS wint

NATS leidt nog op ruwe broadcast-throughput op fanout-1000: 2.66 G/s tegenover 506 M/s bij mtwRequest (5.2× meer). Dat is een structureel plafond van TCP-zonder-WebSocket — een bewuste trade-off om het protocol browser-compatibel te houden. Als uw hot path alleen server-to-server is, is NATS de juiste keuze.

Grafieken van de laatste run

Distributies over mtw, nats, centrifugo en socketio. Gegenereerd door de bench-suite — hetzelfde artefact als u lokaal zou krijgen.

Fanout-latency

1 publisher → N subscribers · 100 en 1000 subs · payload 128 B

SVG
Benchmark-grafiek: Fanout-latency

Echo round-trip

Requester → echo bot → requester · 2.000 round-trips

SVG
Benchmark-grafiek: Echo round-trip

Connect storm

500 gelijktijdige verbindingen · per-connect latency + rate

SVG
Benchmark-grafiek: Connect storm

Draai bench-suite/run.sh in de repo om het op uw eigen host te reproduceren.

Wat zit er in de core

Geen aan elkaar genaaide broker. Eén runtime met batterijen inbegrepen.

Eén runtime, geen drie

pub/sub + REST + AI-agents delen verbinding, auth en state. Geen NATS + Express + apart agent-framework meer aan elkaar plakken.

Duaal wire format

JSON standaard voor interop. MsgPack opt-in via subprotocol mtw.msgpack.v1 — p99-distributie 4.7× strakker, ~50% minder bytes.

Composable modules

Een MtwModule-trait met lifecycle hooks, geprioriteerde middleware, glob-matched pub/sub-kanalen en geschiedenis. Te installeren via de marketplace.

Observability inbegrepen

Structured tracing, healthchecks per module, HdrHistogram-metrics in de bench-suite. Productiebedrading zit in de core.

Multi-language bindings

Native bindings voor Node.js, Python en PHP. Browser via WebAssembly. Hetzelfde wire-protocol over elke client.

Glob pub/sub + history

Abonneer met patronen zoals orders.eu.*. Kanalen dragen herspeelbare geschiedenis; nieuwe abonnees kunnen bijhalen.

Twee zichten op dezelfde runtime

Abonneer vanuit een browser. Stel een server-side module samen. Zelfde verbinding, zelfde auth.

Browser WebSocket + MsgPack-subprotocol
client.ts
const ws = new WebSocket('wss://api.example.com/mtw', 'mtw.msgpack.v1');

ws.onopen = () => {
  ws.send(JSON.stringify({
    "type": "subscribe",
    "channel": "orders.eu.*"
  }));
};

ws.onmessage = (msg) => {
  const evt = JSON.parse(msg.data);
  console.log('event', evt.channel, evt.payload);
};
Rust MtwModule-trait
price_feed.rs
use mtw_request::{MtwModule, Context, Result};

pub struct PriceFeed;

#[async_trait]
impl MtwModule for PriceFeed {
  fn name(&self) -> &str { "price-feed" }

  async fn on_start(&self, ctx: &Context) -> Result<()> {
    ctx.subscribe("ticker.*").await?;
    Ok(())
  }

  async fn on_message(&self, ctx: &Context, m: Message) -> Result<()> {
    ctx.publish("alerts", m.payload).await
  }
}

Bindings voor elke client

Hetzelfde wire-protocol. Zelfde auth. Andere taal aan de rand.

Node.js

Beschikbaar

Python

Beschikbaar

PHP

Beschikbaar

Browser (WASM)

Roadmap

Wanneer mtwRequest, wanneer niet

Eerlijke defaults. Kies de juiste tool voor uw hot path.

Kies mtwRequest als…

  • • U WebSocket + HTTP + AI-agents in één runtime nodig hebt
  • • Tail-latency op browser-fanout uw SLA is
  • • U module-compositie wilt, geen bevroren broker
  • • U auth, MCP en trading in dezelfde core wilt (in roadmap / shipped)

Kies NATS als…

  • • Uw hot path server-to-server TCP is, geen browsers
  • • U 1 G/s+ ruwe broadcast-throughput nodig hebt
  • • U al een JetStream-cluster draait waar u op vertrouwt
  • • U geen HTTP of AI-agents in hetzelfde proces nodig hebt

Gebouwd op

Saaie fundamenten. Voorspelbaar gedrag.

Rust Tokio tokio-tungstenite ArcSwap MsgPack HdrHistogram WebAssembly Apache-2.0

Veelgestelde vragen

Hoe verschilt mtwRequest van NATS of Centrifugo?
De meeste alternatieven zijn smalle pub/sub-engines. mtwRequest bundelt WebSocket, HTTP en AI-agents in dezelfde Rust-core, met gedeelde verbinding, auth en state — geen drie services aan elkaar plakken. NATS wint nog op ruwe broadcast-throughput (1.20 G/s vs 124 M/s op fanout-500); dat is een structureel plafond van TCP-zonder-WS en een bewuste trade-off voor browsercompatibiliteit.
Zijn de benchmarks reproduceerbaar?
Ja. Same-host runs in Docker met 2 CPU en 2 GB per concurrent, payload 128 B, HdrHistogram op 3 significante cijfers. De runner staat in bench-suite/ in de repo. Niet extrapoleren naar gedistribueerde productie — de suite is voor head-to-head vergelijking.
JSON of MsgPack — wat moet ik gebruiken?
JSON is de standaard voor interop. Schakel MsgPack in via het mtw.msgpack.v1-subprotocol als de tail belangrijk is: p50 daalt 17,5% en de p99-distributie is 4,7× strakker. Wire-grootte is ~50% kleiner. Gebruik het als u een SLA op tail-latency hebt.
Welke taalbindings zijn beschikbaar?
Node.js, Python en PHP zijn vandaag shipped. De browser-binding compileert de core naar WebAssembly en staat op de roadmap. Alle bindings spreken hetzelfde wire-protocol en authenticeren tegen dezelfde verbinding.
Is er een module-marketplace?
Ja. De MtwModule-trait, lifecycle hooks en het middleware-systeem zijn shipped. De publieke registry staat op de roadmap — zie ARCHITECTURE.md voor de huidige stand.
Licentie en support?
Apache-2.0. Source op GitHub bij fastslack/mtwRequest. Commerciële support beschikbaar — boek een consult als u productiehulp wilt.

Reproduceer de bench, fork de core

Apache-2.0. De runner staat in de repo. Voor productiehulp, boek een consult.