Skip to main content

Python client for the Lance Wire Protocol (LWP) — high-performance, low-latency data streaming

Project description

lnc-client

PyPI version Python License: MIT

Python client for the Lance Wire Protocol (LWP) — high-performance, low-latency data streaming.

Lance is an io_uring-based streaming server designed to saturate 100G NICs with minimal latency. This client implements the full LWP binary protocol for Python applications.

Installation

pip install lnc-client

Requirements: Python 3.10+

Quick Start

Producer

import asyncio
from lnc_client import Producer, ProducerConfig

async def main():
    producer = await Producer.connect("localhost:1992", ProducerConfig())

    # Send with ACK (guaranteed delivery)
    batch_id = await producer.send(topic_id=1, data=b'{"price": 6942.25}')

    # Send without waiting for ACK (pipelined, higher throughput)
    batch_id = await producer.send_async(topic_id=1, data=b'fire and forget')

    await producer.close()

asyncio.run(main())

Consumer

import asyncio
from lnc_client import StandaloneConsumer, StandaloneConfig

async def main():
    consumer = await StandaloneConsumer.connect(
        "localhost:1992",
        StandaloneConfig(consumer_name="my-app", topic_id=1),
    )

    while True:
        result = await consumer.poll()
        if result is None:
            await asyncio.sleep(0.05)
            continue

        for record in result.records:
            print(f"Type={record.record_type}, Data={record.value}")

        print(f"Lag: {result.lag} bytes")

asyncio.run(main())

Topic Management

import asyncio
from lnc_client import LanceClient, ClientConfig

async def main():
    async with LanceClient(ClientConfig(host="localhost")) as client:
        topics = await client.list_topics()

        topic = await client.create_topic("my-events")

        # Create with retention (7-day, 1GB max)
        topic = await client.create_topic_with_retention(
            "logs", max_age_secs=7*86400, max_bytes=1024**3
        )

        await client.set_retention(topic["id"], max_age_secs=86400)

asyncio.run(main())

Configuration

ProducerConfig

Option Default Description
batch_size 32768 Max batch size in bytes
linger_ms 5 Max wait before sending partial batch
compression False Enable LZ4 compression
max_pending_acks 64 Max unacknowledged batches

StandaloneConfig

Option Default Description
consumer_name "" Consumer identifier
topic_id 0 Topic to consume from
max_fetch_bytes 65536 Max bytes per fetch
start_offset 0 Initial byte offset
poll_interval_ms 50 Polling interval when idle

ClientConfig

Option Default Description
host "localhost" Lance server hostname
port 1992 Lance server port

TLV Record Types

Records use Type-Length-Value encoding:

Type Code Description
RawData 0x01 Unstructured binary
JSON 0x02 JSON-encoded record
MessagePack 0x03 MessagePack-encoded
KeyValue 0x10 Key-value pair
Timestamped 0x11 Timestamp + data
Null 0xFF Tombstone/empty

Error Handling

from lnc_client import (
    LanceError,
    ConnectionError,
    BackpressureError,
    TopicNotFoundError,
    InvalidFrameError,
)

try:
    await producer.send(topic_id=99, data=b"test")
except TopicNotFoundError:
    print("Topic doesn't exist")
except BackpressureError:
    print("Server is overloaded, slow down")
except ConnectionError:
    print("Connection lost")

Protocol Details

This client implements the Lance Wire Protocol (LWP) v1.0:

  • 44-byte fixed header with CRC32C validation
  • Hardware-accelerated checksums (SSE4.2 / ARM CRC)
  • Backpressure signaling from server
  • Keepalive with 30-second timeout
  • Batched production with ACK tracking
  • Offset-based consumption with seek/rewind
  • LZ4 compression (optional, per-batch)
  • Reconnection with exponential backoff (100ms base, 30s max, jitter)

Development

git clone https://github.com/nitecon/lnc-client-py.git
cd lnc-client-py
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest -v

39 tests covering protocol parsing, CRC32C validation, TLV encoding/decoding, and frame builders.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lnc_client-0.1.1.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lnc_client-0.1.1-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file lnc_client-0.1.1.tar.gz.

File metadata

  • Download URL: lnc_client-0.1.1.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for lnc_client-0.1.1.tar.gz
Algorithm Hash digest
SHA256 25bb099987f848fc80fa5997a8af428aa4838f419386e443e8db3048ed3c5874
MD5 347724b5066fa53bb1d8025b4fd46c8a
BLAKE2b-256 82b792d5c5b835dc45da1d7029154d7e628cc8856e4700c95a006b0cc60c74ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for lnc_client-0.1.1.tar.gz:

Publisher: release.yml on nitecon/lnc-client-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lnc_client-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: lnc_client-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for lnc_client-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 33343e0f2b21b1e7671d69d993b247021324c7a356b90160c06513355deeed27
MD5 ed031705eac4641e9f64f05fe49ff923
BLAKE2b-256 bbdfcfb193f377bf8651e315ad98625269cb9a9bce3832fc2de4a956e5e8fcff

See more details on using hashes here.

Provenance

The following attestation bundles were made for lnc_client-0.1.1-py3-none-any.whl:

Publisher: release.yml on nitecon/lnc-client-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page