hgraph-kafka
C++-first Kafka services for hgraph, implementing the contract in hgraph RFC 0015. The extension uses librdkafka's C API and exposes the same service model to native C++ and Python graphs.
For installation, concepts, recovery and commit semantics, operational
configuration, and Python/C++ usage patterns, see the
Kafka user guide.
Runnable Python worker, publisher, and bounded-replay examples are in
python/examples.
One path-bound, multi-interface service_impl owns the Kafka clients for a
configuration. Subscriptions, publish requests, explicit commits, and events
all bind to that service instance. Graph output reaches Kafka through the
service's sink inputs; records, delivery reports, and events re-enter the root
graph through one standard unbounded burst push source. Subscription lifecycle
envelopes use that same ordered transport as their records. Kafka clients and
worker threads are created on graph start and stopped with the graph.
The public record and configuration shapes are hgraph compound scalars. Kafka headers preserve order, duplicates, null values, and empty byte strings.
Native C++
The installed package exports hgraph::kafka:
#include <hgraph/kafka/service.h>
#include <hgraph/kafka/value_builders.h>
#include <hgraph/lib/std/operators/conversion.h>
#include <hgraph/lib/std/operators/registration.h>
using namespace hgraph;
using namespace hgraph::kafka;
struct KafkaGraph {
static constexpr auto name = "kafka_graph";
static void compose(Wiring &w) {
const auto path = service::path("primary");
register_service(
w, path,
service_config().bootstrap_servers({Str{"localhost:9092"}}).build());
auto key = wire<stdlib::const_, TS<KafkaSubscriptionKey>>(
w, subscription_key()
.topics({Str{"orders"}})
.group_id(Str{"orders-worker"})
.build());
auto subscription = subscribe(w, path, key);
auto record = wire<stdlib::const_, TS<KafkaProduceRecord>>(
w, make_produce_record(Bytes{"ready"}));
auto delivery = publish(
w, path, publish_request(w, Str{"status"}, record));
auto cursor = wire<stdlib::getattr_, TS<KafkaCursor>>(
w, subscription, Str{"cursor"});
commit(w, path, cursor);
auto event = events(w, path);
}
};
KafkaSubscriptionOutput provides the record and its matching next-offset
cursor on the same graph tick, plus subscription state. A cursor is accepted
only while its subscription identity, assignment generation, and partition
remain live. Commits are monotonic per assigned partition.
Python
The Python authoring surface lowers to the same native service:
import hgraph as hg
import hgraph_kafka as kafka
@hg.graph
def app():
kafka.register_kafka_service(
kafka.KafkaServiceConfig.from_bootstrap_servers(
["localhost:9092"], client_id="orders-worker"
),
path="primary",
)
key = kafka.KafkaSubscriptionKey(
topics=("orders",),
group_id="orders-worker",
start_position=kafka.KafkaStartPosition.committed(),
)
subscription = kafka.kafka_subscribe(
hg.const(key, tp=hg.TS[kafka.KafkaSubscriptionKey]),
path="primary",
)
kafka.kafka_commit(subscription["cursor"], path="primary")
The core hgraph wheel owns a guarded compatibility shim at the released
hgraph.adaptors.kafka import path. Existing message_publisher,
message_subscriber, KafkaMessage, and register_kafka_adaptor imports
continue to work when hgraph-kafka is installed. The extension wheel installs
only hgraph_kafka; it never contributes files to the core hgraph package.
Recovery and simulation
Subscriptions support explicit topic, pattern, or partition selection; group or independent assignment; earliest, latest, committed, timestamp, explicit, and graph-start positions; snapshot, timestamp, and explicit stop boundaries; key filters; deterministic timestamp/topic/partition/offset replay; and explicit or graph-delivery commits.
Simulation is intentionally limited to bounded, record-time recovery. The
consumer preloads the finite replay and schedules records at deterministic
graph times. Publish, commit, unbounded asynchronous input, and
OnGraphDelivery commit mode are rejected in simulation rather than silently
changing their semantics.
Build and test
This is a first-party extension in the hgraph monorepo. It remains a separate CMake package and Python distribution: the top-level core package does not link librdkafka or install these modules.
For an in-tree native development build from the repository root:
cmake -S . -B build-kafka \
-DHGRAPH_BUILD_KAFKA_EXTENSION=ON \
-DBUILD_TESTING=ON
cmake --build build-kafka --parallel
ctest --test-dir build-kafka --output-on-failure
The extension can still be configured independently against an installed hgraph SDK:
cmake -S . -B build -DCMAKE_PREFIX_PATH=/path/to/hgraph/install
cmake --build build --parallel
ctest --test-dir build --output-on-failure
Build its separately deployable ABI3 wheel from the repository root after
making the matching hgraph SDK discoverable through CMAKE_PREFIX_PATH:
CMAKE_PREFIX_PATH=/path/to/hgraph/sdk \
uv build --wheel --package hgraph-kafka --python 3.12
The deterministic suite uses librdkafka's mock cluster and the extension fake transport. To include a real broker round trip, provide a clean topic:
HGRAPH_KAFKA_INTEGRATION_BOOTSTRAP=localhost:9092 \
HGRAPH_KAFKA_INTEGRATION_TOPIC=hgraph-kafka-integration \
ctest --test-dir build --output-on-failure
Wheel builds require the SDK installed by a stable-ABI hgraph wheel. The
extension rejects an SDK that links Python::Python, because that would pin
the nominal ABI3 module to the build interpreter.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hgraph_kafka-0.8.22.tar.gz.
File metadata
- Download URL: hgraph_kafka-0.8.22.tar.gz
- Upload date:
- Size: 103.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41cb38c6fb2b5463335806c5b8eecc64d30049d3cbc7652c117a8e60fbdff80e
|
|
| MD5 |
01e73eece907f7c6d6eeba1ed40996c4
|
|
| BLAKE2b-256 |
b27a02d2f1f0f8cbffb2d0adc55ae79971823beb88c1f77315a44c33630b4882
|
Provenance
The following attestation bundles were made for hgraph_kafka-0.8.22.tar.gz:
Publisher:
release-wheels.yml on hhenson/hgraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hgraph_kafka-0.8.22.tar.gz -
Subject digest:
41cb38c6fb2b5463335806c5b8eecc64d30049d3cbc7652c117a8e60fbdff80e - Sigstore transparency entry: 2684134146
- Sigstore integration time:
-
Permalink:
hhenson/hgraph@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Branch / Tag:
refs/tags/0.8.22 - Owner: https://github.com/hhenson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheels.yml@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hgraph_kafka-0.8.22-cp312-abi3-win_amd64.whl.
File metadata
- Download URL: hgraph_kafka-0.8.22-cp312-abi3-win_amd64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.12+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58313c1c948c1bb4b0b7d73e57ee76e4f25c289d2648fddb60116c4da0130fd8
|
|
| MD5 |
cabf0eccc511df58367f2cff5c25269b
|
|
| BLAKE2b-256 |
2fcca5e90937ad96321c9c53bc90a3e43eaecdb4dffb17cd81217c4d239f04a8
|
Provenance
The following attestation bundles were made for hgraph_kafka-0.8.22-cp312-abi3-win_amd64.whl:
Publisher:
release-wheels.yml on hhenson/hgraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hgraph_kafka-0.8.22-cp312-abi3-win_amd64.whl -
Subject digest:
58313c1c948c1bb4b0b7d73e57ee76e4f25c289d2648fddb60116c4da0130fd8 - Sigstore transparency entry: 2684134171
- Sigstore integration time:
-
Permalink:
hhenson/hgraph@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Branch / Tag:
refs/tags/0.8.22 - Owner: https://github.com/hhenson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheels.yml@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hgraph_kafka-0.8.22-cp312-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: hgraph_kafka-0.8.22-cp312-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.8 MB
- Tags: CPython 3.12+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ce99e022118d52663018106bd1f471be874dd0c3b541b1c1149fb1ef33e79ee6
|
|
| MD5 |
1f47478aad95268d0eba4e9971d67bb3
|
|
| BLAKE2b-256 |
8db7935adfd8cb32a5bc607d775f2e64b40ee2cd945e58784642e7c6d72517a9
|
Provenance
The following attestation bundles were made for hgraph_kafka-0.8.22-cp312-abi3-manylinux_2_28_x86_64.whl:
Publisher:
release-wheels.yml on hhenson/hgraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hgraph_kafka-0.8.22-cp312-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
ce99e022118d52663018106bd1f471be874dd0c3b541b1c1149fb1ef33e79ee6 - Sigstore transparency entry: 2684134163
- Sigstore integration time:
-
Permalink:
hhenson/hgraph@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Branch / Tag:
refs/tags/0.8.22 - Owner: https://github.com/hhenson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheels.yml@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hgraph_kafka-0.8.22-cp312-abi3-macosx_15_0_arm64.whl.
File metadata
- Download URL: hgraph_kafka-0.8.22-cp312-abi3-macosx_15_0_arm64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12+, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3da0c38a6917382af23d99d4e651857745755b041972a67f5010227f011df6df
|
|
| MD5 |
77c7c73182137074e4d13f74ac8d118f
|
|
| BLAKE2b-256 |
3dc87119ef4c58eb69e0bfdcf66cfeb0e0afa449e2820b6a20ffc2a0e99c4ce1
|
Provenance
The following attestation bundles were made for hgraph_kafka-0.8.22-cp312-abi3-macosx_15_0_arm64.whl:
Publisher:
release-wheels.yml on hhenson/hgraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hgraph_kafka-0.8.22-cp312-abi3-macosx_15_0_arm64.whl -
Subject digest:
3da0c38a6917382af23d99d4e651857745755b041972a67f5010227f011df6df - Sigstore transparency entry: 2684134154
- Sigstore integration time:
-
Permalink:
hhenson/hgraph@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Branch / Tag:
refs/tags/0.8.22 - Owner: https://github.com/hhenson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-wheels.yml@cd053a351ac7416fcec4fbccc464d92f03a3c000 -
Trigger Event:
push
-
Statement type: