Expand description
mako-engine — event-sourced process runtime for German energy market
communication (MaKo).
§Architecture
Raw EDIFACT bytes (AS4 transport)
│
▼
[edi-energy] parse · validate
│
▼ Command (typed, validated)
EngineContext::spawn / ::resume → Process::execute / ::execute_with / ::execute_with_retry
│
├─ load events → reconstruct state (Workflow::apply + upcast)
├─ handle command (Workflow::handle — pure, deterministic)
└─ append EventEnvelope batch (optimistic concurrency)
EventStore ──► ProjectionRunner ──► Read models
SnapshotStore ──► Process::state_with_snapshot (O(k) replay)
OutboxStore ──► delivery worker ──► AS4 endpoint
DeadlineStore ──► scheduler ──► TimeoutDeadline command
ProcessRegistry ──► inbound message routing ──► Process§Quick start
ⓘ
use mako_engine::{
builder::EngineBuilder,
ids::TenantId,
version::WorkflowId,
event_store::InMemoryEventStore,
};
let ctx = EngineBuilder::new()
.with_event_store(InMemoryEventStore::new())
.build();
// Spawn a new process.
let process = ctx.spawn::<MyWorkflow>(TenantId::new(), WorkflowId::new("…", "FV2024-10-01"));
let envelopes = process.execute(my_command).await?;
// Reconstruct typed state by replaying all events.
let state = process.state().await?;
// Persist routing information and resume on the next message.
ctx.registry().register(tenant, &conv_id.to_string(), process.identity()).await?;
let identity = ctx.registry().lookup(tenant, &conv_id.to_string()).await?.unwrap();
let resumed = ctx.resume::<MyWorkflow>(identity);§Crate modules
| Module | Contents |
|---|---|
ids | Typed identifier newtypes (EventId, StreamId, ProcessId, ProcessIdentity, DeadlineId, …) |
types | Semantic domain identifiers (MaLo, MeLo, MarktpartnerCode, MessageRef, DeviceId, BkvId, UenbId, BillingPeriod) |
version | FormatVersion, WorkflowId, and WorkflowVersionPolicy |
envelope | EventEnvelope and NewEvent |
error | EngineError, WorkflowError |
event_store | EventStore trait (with stream_version) + InMemoryEventStore |
workflow | Workflow trait, EventPayload, CommandContext |
message_adapter | MessageAdapter trait, AdapterRegistry, FnAdapter — cross-FV command translation |
process | Process<W,S> — ergonomic typed process handle |
projection | Projection trait + ProjectionRunner (single-stream and multi-stream) + GlobalProjectionCheckpoint |
snapshot | Snapshot, SnapshotStore + InMemorySnapshotStore / NoopSnapshotStore |
outbox | OutboxMessage, OutboxStore + InMemoryOutboxStore / NoopOutboxStore |
inbox | InboxStore trait + InMemoryInboxStore for AS4 retry deduplication |
deadline | Deadline, DeadlineStore + InMemoryDeadlineStore / NoopDeadlineStore |
registry | ProcessRegistry + InMemoryProcessRegistry / NoopProcessRegistry |
pid_router | PidRouter — maps Prüfidentifikator values to workflow names |
fristen | Regulatory deadline helpers: add_hours (GPKE 24h), add_werktage (WiM/GeLi/MABIS) |
dead_letter | DeadLetterSink trait + LogDeadLetterSink / NoopDeadLetterSink |
erp | ErpAdapter, ErpCommandSource, ErpEvent — ERP/backend integration contract (BO4E) |
builder | EngineModule trait, EngineBuilder, EngineContext |
Modules§
- builder
EngineModuletrait,EngineBuilder, andEngineContext.- dead_
letter - Dead-letter sink for unroutable or unprocessable inbound messages.
- deadline
- Deadline tracking for regulatory process timers.
- envelope
- The
EventEnvelope— the standard wrapper for every persisted event. - erp
- ERP integration traits and reference implementations.
- error
- Engine-level error types.
- event_
store EventStoretrait and the in-process [InMemoryEventStore] implementation.- fristen
- Regulatory deadline calculation helpers.
- ids
- Typed identifier newtypes for all engine-layer concepts.
- inbox
- Inbox deduplication for inbound messages.
- marktrolle
- BDEW Rollenmodell — market-participant role configuration.
- message_
adapter MessageAdapter— cross-format-version message-to-command translation.- metrics
EngineMetrics— process-level event counters for Prometheus export.- migration
- In-flight process state migration across BDEW format-version boundaries.
- outbox
- Outbox pattern for reliable at-least-once outbound message delivery.
- partner
- Trading-partner master data — the
PartnerStoretrait and supporting types. - pid_
router - PID-to-workflow routing table.
- process
Process— ergonomic typed handle for a single MaKo process instance.- profile
- Profile requirements — decouple domain crates from
edi-energy. - projection
Projectiontrait andProjectionRunner.- registry
- Process routing registry.
- snapshot
- Snapshotting support — a performance optimisation for long event streams.
- types
- Semantic domain type wrappers for identifiers used across all MaKo process families.
- version
- Workflow versioning types.
- workflow
Workflowtrait,EventPayload,CommandPayload, andCommandContext.
Macros§
- bo4e_
schema_ url - Construct a BO4E v202501.0.0 JSON Schema URL for a Business Object.