Skip to content

rekuiperProcess Industrial & IoT Device Data Where It Is Produced.

rekuiper is a single-binary MQTT rule engine and streaming SQL processor written in Rust. It runs on edge gateways between devices and cloud networks—filtering, aggregating, and routing live MQTT, Kafka, Modbus, and OPC-UA telemetry at 1,000,000–2,200,000+ events per second per core.

1,000,000+
events/s per core
Continuous SQL stream throughput in 1.0.0-rc4 (50x–100x faster than Go eKuiper).
< 35 MB
RAM Footprint
Predictable memory under 1,000 parallel rules with zero GC pauses.
100%
Wire Parity
Drop-in REST API, CLI, and SQL compatibility with upstream eKuiper.
20+
Native Connectors
Built-in MQTT, Modbus, OPC-UA, Kafka, Parquet, InfluxDB, and OTLP.

Where it fits ​

Where rekuiper fits: devices and feeds on the left, rekuiper on the gateway in the middle, destinations on the right

You write a rule in SQL. rekuiper executes the rule on every message when the message arrives. You add, change, and remove rules through a REST API while the engine runs.

What changes when you deploy rekuiper on the edge:

  • Transmit less data: One summary row per minute replaces sixty raw readings.
  • Decide locally: An alert fires on the gateway in sub-milliseconds without cloud latency.
  • Survive network disconnects: Results buffer in memory and on disk, then transmit in order when the uplink reconnects.

Try it in 60 seconds ​

This demo requires Docker. A built-in simulator generates sensor readings.

1. Start the engine.

shell
docker run -d --name rekuiper -p 9081:9081 indusstack/rekuiper:1.0.0-rc4

Built-in Web Observability UI

Open http://localhost:9081/ui in your browser to inspect live streams, rules, and rule metrics without installing companion containers.

2. Register simulated sensor readings (ten events per second).

shell
curl -X PUT http://localhost:9081/metadata/sources/simulator/confKeys/demo \
  -H "Content-Type: application/json" \
  -d '{
    "data": [
      {"deviceId": "pump-1", "temperature": 21.5},
      {"deviceId": "pump-1", "temperature": 23.0},
      {"deviceId": "pump-1", "temperature": 24.5}
    ],
    "interval": 100,
    "loop": true
  }'

3. Create a stream to ingest the readings.

shell
curl -X POST http://localhost:9081/streams \
  -H "Content-Type: application/json" \
  -d '{"sql": "CREATE STREAM demo () WITH (TYPE=\"simulator\", CONF_KEY=\"demo\")"}'

4. Add a rule to aggregate five seconds of readings into one row.

shell
curl -X POST http://localhost:9081/rules \
  -H "Content-Type: application/json" \
  -d '{
    "id": "five_second_summary",
    "sql": "SELECT count(*) AS readings, avg(temperature) AS avg_temp FROM demo GROUP BY TUMBLINGWINDOW(ss, 5)",
    "actions": [{ "log": {} }]
  }'

5. Verify the output.

shell
docker logs -f rekuiper
text
[RULE five_second_summary] Matched record: {"readings": Number(49), "avg_temp": Number(23.03)}

Fifty readings enter the pipeline. One row exits. To route this row to MQTT, Kafka, or a database, replace log with another sink.

Continue with the Getting Started Guide.

Common patterns ​

Each pattern requires one or two SQL rules.

Cut the cloud bill ​

Devices publish every second. Cloud analytics require one row per minute. Aggregate on the gateway and send the summary.

sql
SELECT deviceId, avg(temperature) AS avg_temp, max(temperature) AS max_temp
FROM sensors
GROUP BY deviceId, TUMBLINGWINDOW(ss, 60)

Read more: Windows

Alert locally ​

A sensor value crosses a safety threshold. Filter on the gateway and publish an MQTT command or call a webhook immediately. The alert does not wait for cloud round trips.

sql
SELECT deviceId, temperature, meta(topic) AS source_topic
FROM sensors
WHERE temperature > 80

Read more: Rules · REST sink · MQTT sink

The cellular or WAN uplink drops for minutes or hours. Enable the sink cache. Results buffer on disk, and rekuiper resends them in order when the link reconnects.

json
{
  "mqtt": {
    "server": "tcp://cloud.example.com:1883",
    "topic": "site1/summary",
    "enableCache": true
  }
}

Read more: Sink cache

One feed, many destinations ​

One data feed routes to storage, to a dashboard, and to an alert topic. Multiple rules subscribe to one stream. Each rule defines its own SQL and destinations.

RuleSQLDestination
ArchiveSELECT * FROM sensorsParquet files on local disk
DashboardOne-minute averages per deviceInfluxDB
AlertWHERE temperature > 80MQTT command topic

Read more: Sinks

Enrich before sending ​

Messages carry a device ID. Upstream applications require site and asset names. Join the stream with a lookup table in Redis or a SQL database.

sql
SELECT s.deviceId, s.temperature, a.site, a.asset_name
FROM sensors AS s
INNER JOIN assets AS a ON s.deviceId = a.id

Read more: Lookup tables

Is it a fit? ​

Use rekuiper when...Look elsewhere when...
Your data arrives from OT or IT protocols: Native MQTT, Modbus TCP/RTU, OPC-UA, HTTP, WebSocket, Kafka, AMQP/RabbitMQ, Redis, OTLP, or ZeroMQ.You need legacy building-automation protocols not yet built in (e.g., native BACnet or PROFINET without a protocol converter).
You want streaming logic in SQL (tumbling/hopping/sliding/session windows, joins, analytic functions) managed via REST API, CLI, or Declarative GitOps YAML.You want a drag-and-drop visual wiring tool for non-SQL users (use Node-RED for low-volume visual scripting).
Your edge hardware is constrained (1–2 CPU cores, 64 MB–512 MB RAM) and cannot tolerate Go/JVM garbage-collection pauses or 500 MB+ container images.You need a multi-node distributed cloud shuffle cluster (use Apache Flink or Spark Streaming for datacenter-scale petabyte joins).
You need offline resilience & local sinks: Disk-backed sink cache (sink_cache.rs), Dead-Letter Queues (dlq.rs), and direct writes to Parquet, InfluxDB v1/v2, TDengine, IoTDB, or SQL databases.You only need stateless log forwarding without windowed aggregations, stateful joins, or local rule evaluation (use Vector or Telegraf).
You are building AI-assisted IoT operations: Native Model Context Protocol (rekuiper-mcp) lets AI agents inspect schemas, dry-run SQL rules, and diagnose live pipelines.You only need basic protocol passthrough without filtering, enrichment, or stateful edge computations.

Measured on one CPU core ​

All tests run on dedicated Linux hardware constrained to one physical CPU core and 1 GiB of RAM.

MeasureResultTested on
In-process stream throughput (Zero-parse)2,207,367 events/s (500k in 226 ms, 0 ms drain)1.0.0-rc4
End-to-end JSON stream throughput1,085,885 events/s (500k in 460 ms, 0 ms drain)1.0.0-rc4
MQTT network throughput (Single rule)150,000 to 200,000 messages/s (0.00% loss)0.500
Concurrent rules on one stream1,000 rules (500,000 evaluations/s)0.505
Heap memory under load4.4 to 10.2 MiB (Flat plateau, zero GC pauses)1.0.0-rc4
Static binary footprint~30 MB (Self-contained, zero external deps)1.0.0-rc4
Comparison with eKuiper 2.4.1 under the same limits
Capabilityrekuiper (1.0.0-rc4)eKuiper 2.4.1Performance Delta
In-process stream throughput1,000,000+ events/sN/A (Embedded runtime only)Native Rust speed
Network MQTT throughput150,000 to 200,000 msg/s~20,000 msg/s8x to 10x throughput
Parallel rule scaling1,000 concurrent rules~100 rules10x rule capacity
Memory stability4.4 to 10.2 MiB (Flat)15 to 886 MiB (GC spikes)Zero GC jitter, no OOM
Garbage collectionNone (Deterministic ownership)Present (Stop-the-world sweeps)Zero tail-latency spikes

Method and full results: Benchmark Overview · Throughput · Parallel rules

Connectors ​

Sources (data in)Sinks (data out)
MessagingMQTT, Kafka, RabbitMQ, Redis, ZeroMQ, WebSocketMQTT, Kafka, RabbitMQ, Redis, ZeroMQ, WebSocket
HTTPHTTP pull, HTTP pushREST
DatabasesPostgreSQL, SQLitePostgreSQL, SQLite, InfluxDB v1 and v2, TDengine, IoTDB
Files and mediaCSV, JSON Lines, Parquet, video (FFmpeg)CSV, JSON Lines, Parquet, image
IndustrialModbus TCP/RTU, OPC-UA, EdgeX Foundry, NeuronModbus TCP/RTU, OPC-UA, EdgeX Foundry, Neuron
TelemetryOpenTelemetry (OTLP/HTTP metrics, logs, traces)OpenTelemetry (OTLP/HTTP)
TestSimulator, MemoryLog, Memory, Nop

Details: Sources · Sinks

Where to go next ​

I want toGo to
Build my first real pipeline with MQTTGetting Started Guide
Install on a gateway, in Docker, or in KubernetesInstallation and Deployment
Learn the SQLSQL Reference
Understand how the engine worksArchitecture
Move from eKuiperMigration guide
Automate with the REST API or CLIREST API · CLI
Inspect pipelines with zero companion containersEmbedded UI & rekuiper top
Manage distributed gateways with staged canary rolloutsFleet Management & Control Plane
Design multi-port streaming DAGs with live wire-tapVisual Stream DAG Studio
Use an AI coding assistant with rekuiperModel Context Protocol

rekuiper is open source (Apache-2.0 / MIT) · For an all-in-one MQTT broker with embedded rekuiper rules, see IndraMQTT.