Cameleer / Compare / Apache Camel vs Cameleer
Same routes. Measured.
Apache Camel vs Cameleer
Cameleer runs Apache Camel's routes, EIPs and YAML DSL as one native binary. We ran the same routes on both, from in-memory routing to REST APIs, Kafka and PostgreSQL. Cameleer starts in milliseconds, runs in megabytes and moves more messages on the same CPUs.
Apache Camel and Cameleer at a glance
Same integration model, different runtime.
| Apache Camel | Cameleer | |
|---|---|---|
| Runtime | Java virtual machine (or a native image with Camel Quarkus) | one native binary, no runtime to install |
| Routes and EIPs | the reference implementation | the same EIPs, endpoint URIs, Simple expressions and headers |
| DSLs | Java, YAML, XML | YAML, XML and Rust; Camel YAML routes run unchanged |
| Components | 300+ components | about 230 components, languages and data formats |
| Startup | about a second on the JVM | milliseconds |
| Memory | hundreds of MB on the JVM | tens of MB |
| Serverless | with Camel Quarkus native or a JVM snapshot | built-in AWS Lambda runtime |
| AI agents | langchain4j-agent, the ai-tool abstraction and an MCP server (Camel 4.22) | four model components; tools as REST routes with schema validation, idempotency, sagas, approval and audit; MCP server planned |
| Ecosystem | two decades, Java libraries, commercial support | younger project, Rust standard library only |
Throughput: in-process routing
Messages per second through the same route on each runtime.
CameleerApache Camel (JVM)Apache Camel (Quarkus native)
Throughput: APIs, Kafka and databases
Requests per second from clients on another machine, and records per second through Kafka. Kafka and PostgreSQL run on their own machine, as in production.
CameleerApache Camel (JVM)Apache Camel (Quarkus native)
Benchmarked use cases
Each one is an ordinary integration, written once and run unchanged on both runtimes. The figure is Cameleer's throughput against Apache Camel on the JVM.
Order API
A REST endpoint reads fields from the JSON order and answers with a JSON confirmation.
2.1x 80,367 vs 37,814 req/s
Order ingestion into Kafka
Each order posted over HTTP is published to Kafka, keyed by order id, then acknowledged.
1.7x 17,854 vs 10,052 req/s
Stream processing
Orders are consumed from Kafka, filtered by amount, reshaped and published to another topic.
8.7x 6,081 vs 698 records/s
Writing to PostgreSQL
Each order posted over HTTP is inserted into PostgreSQL through a pool of 16 connections.
2.3x 11,007 vs 4,710 req/s
CSV batch
A 1,000-row file is split into rows; EU rows are kept, reshaped and written out in batches of 100.
2.1x 998 vs 468 files/s
Order splitting
A JSON order is split into its line items and aggregated back per order.
2.6x 70,926 vs 26,622 orders/s
Full results
Every scenario, including Apache Camel compiled to a native executable with Quarkus. Each figure is the mean of two runs on two identical machines.
Throughput
| scenario | Cameleer | Apache Camel (JVM) | Apache Camel (Quarkus native) | Cameleer vs Camel JVM | Cameleer vs Camel native |
|---|---|---|---|---|---|
| Direct call through a route | 2,230,208 msg/s | 663,701 msg/s | 243,522 msg/s | 3.3x | 9.1x |
| In-memory queue (seda), one-way | 1,644,186 msg/s | 603,426 msg/s | 316,442 msg/s | 2.7x | 5.1x |
| In-memory queue (seda), request-reply | 719,433 msg/s | 117,442 msg/s | 72,113 msg/s | 6.1x | 9.9x |
| Content-based router | 1,144,857 msg/s | 375,212 msg/s | 119,416 msg/s | 3.0x | 9.5x |
| Split and aggregate a JSON order | 70,926 orders/s | 26,622 orders/s | 9,274 orders/s | 2.6x | 7.6x |
| CSV batch (1,000-row files) | 998 files/s | 468 files/s | 163 files/s | 2.1x | 6.1x |
| Kafka stream processing | 6,081 records/s | 698 records/s | 694 records/s | 8.7x | 8.7x |
| HTTP, fixed reply | 99,012 req/s | 56,735 req/s | 28,584 req/s | 1.7x | 3.4x |
| REST API with JSON | 80,367 req/s | 37,814 req/s | 17,860 req/s | 2.1x | 4.4x |
| HTTP into Kafka | 17,854 req/s | 10,052 req/s | 9,267 req/s | 1.7x | 1.9x |
| HTTP into PostgreSQL | 11,007 req/s | 4,710 req/s | 3,540 req/s | 2.3x | 3.1x |
Latency
| scenario, p99 latency | Cameleer | Apache Camel (JVM) | Apache Camel (Quarkus native) |
|---|---|---|---|
| Direct call through a route | 1 µs | 3 µs | 10 µs |
| In-memory queue (seda), request-reply | 38 µs | 85 µs | 137 µs |
| Content-based router | 2 µs | 6 µs | 22 µs |
| Split and aggregate a JSON order | 30 µs | 70 µs | 382 µs |
| CSV batch (1,000-row files) | 1.7 ms | 3.2 ms | 12.5 ms |
| HTTP, fixed reply | 2.9 ms | 3.8 ms | 7.4 ms |
| REST API with JSON | 2.6 ms | 6.3 ms | 12.3 ms |
| HTTP into Kafka | 8.6 ms | 7.8 ms | 12.6 ms |
| HTTP into PostgreSQL | 10.6 ms | 19.8 ms | 27.7 ms |
Memory
| scenario, peak memory | Cameleer | Apache Camel (JVM) | Apache Camel (Quarkus native) |
|---|---|---|---|
| Direct call through a route | 7 MB | 399 MB | 113 MB |
| In-memory queue (seda), one-way | 9 MB | 440 MB | 199 MB |
| In-memory queue (seda), request-reply | 9 MB | 257 MB | 113 MB |
| Content-based router | 7 MB | 332 MB | 113 MB |
| Split and aggregate a JSON order | 8 MB | 299 MB | 114 MB |
| CSV batch (1,000-row files) | 8 MB | 337 MB | 126 MB |
| Kafka stream processing | 36 MB | 214 MB | 130 MB |
| HTTP, fixed reply | 18 MB | 244 MB | 121 MB |
| REST API with JSON | 19 MB | 402 MB | 129 MB |
| HTTP into Kafka | 67 MB | 328 MB | 129 MB |
| HTTP into PostgreSQL | 25 MB | 273 MB | 133 MB |
Startup
| Cameleer | Apache Camel (JVM) | Apache Camel (Quarkus native) | |
|---|---|---|---|
| Time to a started context | 2.5 ms | 1106 ms | 30 ms |
| Memory at startup | 8 MB | 114 MB | 69 MB |
What about Apache Camel on Quarkus native?
Compiling Camel ahead of time with Quarkus and GraalVM (Mandrel) removes most of the JVM's startup time and memory. It is the closest thing to Cameleer in the Java world, so we measured it too.
What native compilation gives Camel
- Startup in tens of milliseconds instead of about a second.
- Much less memory than on the JVM.
- One executable to ship.
What it costs
- No JIT compiler: throughput is lower than the same routes on the JVM.
- Long native builds and closed-world restrictions on reflection and dynamic features.
- Cameleer still starts faster, uses less memory and has more throughput than both.
How we tested
Three identical cloud machines on one private network, default settings on every runtime, and the servers swapped halfway so neither side got the better machine.
Setup
- Three DigitalOcean CPU-optimized droplets (
c-4): 4 dedicated vCPUs (Intel Xeon Platinum 8168), 8 GB RAM, Ubuntu 24.04, regionblr1. - Two servers take turns running each runtime; the third runs the HTTP load generator, Apache Kafka 4.3.2 and PostgreSQL 16.
- Apache Camel 4.23.0 on Temurin 21.0.13. Apache Camel 4.22.1 on Quarkus 3.40.0, compiled with Mandrel 25.0.4.1. Cameleer 0.4.0, built with Rust 1.99.1.
Method
- The same routes on every side, defined once per language from one specification.
- 15 s warmup, then five timed 5-second iterations; the figure is the mean of both servers.
- 64 concurrent HTTP keep-alive connections from the load machine; PostgreSQL pool of 16 on every side.
- Default settings: no JVM flags, no GC or thread tuning. Peak memory and CPU from
/usr/bin/time.
Run it yourself
git clone https://github.com/pmsudhi/cameleer && cd cameleer export DO_TOKEN_FILE=~/do-token.txt scripts/cloud-bench/droplets.sh up scripts/cloud-bench/run.sh all scripts/cloud-bench/droplets.sh down
The routes are in crates/cameleer-bench, benchmarks/java-camel and benchmarks/camel-quarkus. Raw results: benchmarks/results. The full report with every caveat: BENCHMARKS.
Common questions
Is Cameleer a drop-in replacement for Apache Camel?
For routes written in Camel's YAML or XML DSL with the components Cameleer provides, yes: the same endpoint URIs, EIPs, Simple expressions and headers. Routes that call Java beans or use the Java DSL need those parts rewritten, and a few Camel components have no Cameleer equivalent.
Was the JVM warmed up?
Yes. Every scenario runs 15 seconds of warmup before five timed 5-second iterations, on both sides, so the JIT compiler has finished its work before anything is measured.
Was Apache Camel tuned?
Both sides ran their default settings: no JVM flags, no thread pool or GC tuning, and the same connection pool size for PostgreSQL. The routes are identical on both sides.
What about Apache Camel on Quarkus native?
It is in the benchmark. Native compilation makes Camel start much faster and use less memory than on the JVM, but without a JIT compiler its throughput is lower than on the JVM. Cameleer is faster and smaller than both.
Can I run the benchmark myself?
Yes. The routes, the harness and the scripts that create the cloud machines are in the repository under scripts/cloud-bench; a full run costs about one US dollar of cloud time.
Run your Camel routes on Cameleer
Mount a Camel YAML route and run it. No JVM, no build.
docker run --rm -p 8080:8080 -v "$PWD:/routes:ro" pmsudhi/cameleer run /routes/hello-api.camel.yaml