Skip to main content

dfe-loader docs

High-performance loader from message transports (Kafka, gRPC, Memory) into ClickHouse. Point it at a topic, give it a routing rule, and it parses, routes, promotes schema columns, enriches, buffers per table, and inserts -- RowBinary by default so ClickHouse skips JSON parsing, with at-least-once Kafka delivery.

This is the index. Read architecture.md for the 10,000-foot view, clickhouse/ for the insert layer, and pipeline/ for the hot path.


What dfe-loader does for you​

You give itIt handlesYou don't write
A Kafka topic or a gRPC pushJSON parse (sonic-rs, SIMD), zero-copy Arc<[u8]>, anything not JSON dead-letteredA consumer, a parser, an input gate
The routing fields (table_fields, org_routes)Pre-flatten routing to db.table, dot-notation nested access, the default table on a missA router, a dispatch table
A ClickHouse tableSchema reflected from system.columns, fields promoted to typed columns, the rest kept in _jsonA schema mapping, an ORM, a migration
insert_format (default RowBinary)Dynamic Map<String,Value> -> RowBinary over the HTTP Client; JSONEachRow fallbackA serialiser, a type encoder, a wire format
capture_mode (full/raw_only/json_only/extracted_only)_json and _raw population per table, overridable per-table and per-DDLConditional capture plumbing
Enrichment toggles (geoip/reputation/risk)Flat enriched columns injected on the promoted row onlyLookup, caching, CIDR matching
Nothing extraPer-table buffering, batch salvage, held-batch retry, schema-cache recovery, one offset commit per flush cycleThe resilience layer

Everything else in these docs is "and here is how the pieces work".


10,000-foot view​


Where things live​

AreaDocCovers
System shapearchitecture.mdLayers, the dynamic insert, the client crates
Configurationconfiguration.mdThe cascade and the settings that change behaviour
Operationsoperations.mdRunning, config-check, metrics/top, hot-reload, DLQ
Build featuresfeature-flags.mdCargo features and the ClickHouse client crates
Insert layerclickhouse/RowBinary vs JSONEachRow, the dynamic insert, schema cache, type handling, TLS, DDL directives
Hot pathpipeline/Routing, extraction, enrichment, capture modes, buffering
Transportstransport/Kafka / gRPC / Memory, the common header
Deploymentdeployment/Container + chart publishing, schemas
Performanceperformance/Hot-path optimisations, parser-selection history, PGO/BOLT

The client dependency, in one line​

dfe-loader inserts through the official clickhouse crate from crates.io, with dfe-clickhouse reading the server's exception code out of a rejection. The dynamic RowBinary layer the clickhouse crate keeps out of scope -- runtime Map<String,Value> encoding -- comes from dfe-clickhouse's dynamic module. See clickhouse/clickhouse-ext.md.