SimpleCORE
POWER & INDUSTRY / PROJECT

Penstock

Bring high-volume field data into one processing system.

In-house development · Industrial data gateway

Chapters 6Topics 20
PROJECT STORY
01 / 06
BROWSER

Manage the complete path, from collection to operations.

Penstock Flow runs multiple collection, transformation, and storage pipelines in one process. DSS packs connect industrial protocols; Console and Agent manage configuration, deployment, and state across nodes. This screen shows an integration test with three Ubuntu nodes and thirteen simulated devices, rather than a customer production deployment or throughput benchmark.

Architecture Data path

01 / 03

Less serialization and allocation on the in-process path.

Sources decode input into columnar RecordBatch buffers: primitive integer/float arrays and variable-length byte regions. Batch reuse reduces per-record object allocation; passing references within one process avoids serialization.

An FNV-1a key hash or round-robin routing selects a partition. Per-partition SPSC rings use LMAX Disruptor, with transforms inline on the same path. Backpressure and partition/core budgets regulate ingress and processing resources.

BatchBuffer flushes by row count or time. A separate I/O executor passes batches to DrainTarget, with outbox and circuit-breaker behavior supporting recovery. High throughput is a design objective; actual rates depend on protocols, transforms, storage, and hardware.

Protocols IEC 104

01 / 09
IEC 60870-5-104

Monitoring and control on one connection.

Transport
TCP · default port 2404
Role
Master · outbound connection
Control
Select / Operate

The gateway connects to a device’s TCP server and receives monitoring ASDUs. Spontaneous messages and general interrogation carry addresses, timestamps, and quality into collected records.

Control ASDUs use the same session. Select/Operate commands pass through the command extension’s policy and approval checks, with device-specific addresses and supported commands configured for each target.

BROWSER

Commands pass through policy. Execution leaves an audit trail.

The command extension defaults to deny. It checks allowed protocols, verbs, targets, and roles, together with rate limits, maintenance windows, clock state, and criticality. Two-person approval, an emergency path, an audit journal, and routing to the owning cluster node govern execution. Operator identities from management certificates are checked by policy; actual device responses and protocol-specific command stages remain part of the control flow. The screenshot shows the approval queue in an integration test.

Engineering Flow engine

01 / 04
FLOW / DATA PLANE

Java 21 and a partitioned runtime.

Runtime
JDK 21 · Gradle Kotlin DSL
Processing
LMAX Disruptor 4 · Netty
State
Apache Ignite 3.1

Plain Java and ServiceLoader compose modules without a DI framework. Connectors, transforms, and extensions register through SPIs, with Typesafe HOCON configuration. The runtime handles daemon, one-shot, and scheduled execution.

Disruptor implements partition rings and Netty handles network I/O. Apache Ignite supports distributed state and analysis windows. Agrona, DataSketches, and fastdoubleparser support processing; expressions compile ahead of batch evaluation.

Resilience4j supplies reconnect backoff. The sink-path circuit breaker is a separate heartbeat-based implementation, rather than the library’s standard circuit breaker.

© 2026 SIMPLECORE INC.CONTEXT. STRUCTURE. EXPERIENCE.