Camunda 8 Vs Temporal
Camunda 8 (BPMN + stream processing + RocksDB) y Temporal (code-first + durable execution + DB pluggable) son los dos approaches dominantes a workflow orchestration moderno. Camunda excele en human tasks y decision modeling (BPMN/DMN); Temporal excele en code-centric coordination de microservicios con queries directas y multi-region nativo. Para el MVP planeado (BPMN-required), tomar prestado de Temporal: single state store con direct queryability.
Decisión arquitectónica fundamental¶
flowchart TB
subgraph Camunda[Camunda 8]
C1[BPMN diagrams]
C2[Engine interprets BPMN]
C3[(RocksDB - embedded)]
C4[Exporters to ES/SQL to UIs]
C1 --> C2 --> C3 --> C4
end
subgraph Temporal[Temporal]
T1[Code - Go/Java/TS/Python]
T2[Engine executes your code]
T3[(Pluggable DB<br/>Postgres/MySQL/Cassandra)]
T4[Queries directas al engine]
T1 --> T2 --> T3 --> T4
end
Tabla de comparación detallada¶
| Dimensión | Camunda 8 / Zeebe | Temporal |
|---|---|---|
| Workflow definition | BPMN 2.0 XML (visual) | Code (TypedSDK in Go/Java/TS/Python) |
| Authoring tool | Web Modeler, Desktop Modeler | IDE normal |
| Target audience | Business analysts + devs | Devs only |
| Engine execution | Interpreta BPMN | Ejecuta código directamente |
| State store | RocksDB embebido en broker | DB pluggable (Postgres/MySQL/Cassandra) |
| State queryability | Via exporters (eventual consistency) | Direct API queries |
| Visibility lag | Seconds (export pipeline) | Real-time |
| Versioning in-flight | Migration explícita (compleja) | GetVersion() markers en código |
| Signals | Message events + event-based gateways | Native signal API |
| Queries at runtime | NO (vía store secundario) | Native query handlers |
| Multi-region | NO native, setup manual | SÍ native replication |
| Horizontal scaling | Partitions + Raft (8192 max) | Shards + DB scaling |
| Performance | Single-digit ms por BPMN node | Sub-ms por activity |
| Failure recovery | Raft consensus + snapshots | DB durability |
| DMN support | Built-in (FEEL engine) | NO (external) |
| Human tasks | First-class (Tasklist) | Build it yourself |
| Process mining | Built-in (Optimize) | External tools |
| Connectors | ~40 pre-built | Activities (write your own) |
Cuándo elegir cada uno¶
Camunda 8 mejor cuando:¶
- Human tasks son parte importante del workflow (compliance, approvals)
- Business analysts modelan los procesos (no solo devs)
- Compliance/audit requiere modelos visuales documentables
- Decision tables (DMN) son requirement
- Process mining integrado es valioso
- Visual debugging de workflows en producción
Temporal mejor cuando:¶
- Pure code teams (devs only)
- Microservices coordination con lógica compleja conditional
- Multi-region es requirement
- Versioning de workflows long-running es crítico
- Real-time visibility es esencial
- Polyglot teams (Go + Python + TypeScript)
El "trade-off del modelo de workflow"¶
| Pro de BPMN (Camunda) | Pro de Code (Temporal) |
|---|---|
| Visual, accesible a no-devs | Familiar para devs |
| Estándar industrial (compliance) | Type-safe en compile time |
| Stakeholder alignment más fácil | Refactor amigable |
| Decision tables nativas | Versioning natural (git) |
| Tools maduros (Modeler) | Testing con tools del lenguaje |
| Con de BPMN (Camunda) | Con de Code (Temporal) |
|---|---|
| Slower que código nativo | No visual para stakeholders |
| Spec compliance overhead | Solo para devs |
| Versionado runtime complejo | Sin standard inter-vendor |
| BPMN puede ser limitante | Polyglot SDK overhead |
Patterns prestables de Temporal para el MVP¶
Aunque el MVP es BPMN-centric (Camunda-style), hay patterns de Temporal valiosos:
1. Single state store con direct queryability¶
flowchart LR
subgraph C8[Camunda 8 - eventually consistent]
CR[(RocksDB)] --> CE[Exporter] --> CES[(Elasticsearch)] --> CU[UI]
end
subgraph T[Temporal - strong consistent]
TP[(Postgres)] --> TD[Direct query] --> TU[UI]
end
subgraph MVP[MVP plan - strong consistent]
MP[(Postgres)] --> MD[Direct query] --> MU[UI]
end
Eliminar el doble-store reduce 50% de la complejidad operacional.
2. Versioning markers¶
Aunque BPMN no soporta versioning runtime natural, considerar:
<bpmn:scriptTask id="task">
<zeebe:script>
if (process.version >= 2) {
// new logic
} else {
// old logic
}
</zeebe:script>
</bpmn:scriptTask>
Permite "in-flight updates" sin migration formal.
3. Real-time query handlers¶
API para queries personalizadas contra el state actual de una instance:
Donde customStatus es una expresión FEEL evaluada en tiempo real contra las variables.
4. DB pluggable¶
Aunque PostgreSQL es la elección para MVP, dejar interface abierta:
interface StateStore {
save(state: ProcessState): Promise<void>;
load(key: string): Promise<ProcessState>;
query(filter: Filter): AsyncIterator<ProcessState>;
}
// Implementations: PostgresStateStore, SQLiteStateStore, etc.
Lo que NO replicar de Temporal en el MVP¶
- Code-first workflows: rompe el contrato BPMN del MVP
- Polyglot SDK: ~1M LOC para mantener 4 lenguajes
- Multi-region replication: out of MVP scope
- In-flight versioning sin migration: complejidad muy alta
Mapeo de features Camunda 8 → MVP simplificado¶
Combinando las mejores ideas de ambos:
| Feature | Camunda 8 | Temporal | MVP |
|---|---|---|---|
| Workflow definition | BPMN ✓ | Code | BPMN |
| State store | RocksDB + ES | Postgres | Postgres |
| Queryability | Via export | Direct | Direct |
| Visibility | Eventually consistent | Real-time | Real-time |
| Versioning | Migration | In-flight | Migration |
| Multi-region | Manual | Native | NO (single region) |
| Human tasks | First-class | DIY | First-class |
| DMN | Native | NO | Native |
| Connectors | ~40 | Activities | Workers (simple SDK) |
El MVP toma de Camunda el modelo de negocio (BPMN, human tasks, DMN) y de Temporal la arquitectura de datos (single store, direct queries, real-time visibility).
Conclusión¶
Camunda y Temporal son ambos válidos pero optimizan diferentes dimensiones: - Camunda: business stakeholder + human task heavy + decision modeling - Temporal: dev-only + microservices coordination + multi-region
Para un MVP que aspira ser "drop-in replacement de Camunda 8 simplificado", el approach es: 1. Mantener BPMN/DMN/Tasklist (lo que diferencia a Camunda) 2. Adoptar single state store de Temporal (operacionalmente más simple) 3. Direct queries sin export pipeline obligatorio 4. Mantener job worker pattern (común a ambos) 5. Skip multi-region y in-flight versioning (no requeridos)
Esto da el 80% del valor de Camunda con 50% de la complejidad operacional.