Skip to main content

Client library for KXY Open ID Service - ID segment allocation

Project description

kxy-open-id-client

Python 客户端库,用于对接 KXY Open ID 服务,实现分布式 ID 分段分配。

特性

  • 简洁易用的 API
  • 支持同步和异步调用
  • 完整的类型提示支持
  • 详细的错误处理
  • 基于 httpx 的高性能 HTTP 客户端

安装

使用 pip 安装

pip install kxy-open-id-client

从源码安装

git clone https://github.com/kxy/kxy-open-id-client.git
cd kxy-open-id-client
pip install -e .

快速开始

基础用法(同步)

from kxy_open_id_client import SegmentClient

# 创建客户端实例
client = SegmentClient(base_url="http://localhost:5801")

# 分配 ID 段
segment = client.allocate_segment(
    system_code="my-system",
    db_name="my_database",
    table_name="users",
    field_name="id",
    segment_count=10000  # 可选,默认 10000
)

print(f"分配到的 ID 段: {segment.start}{segment.end}")
# 输出: 分配到的 ID 段: 1 到 10000

异步用法

import asyncio
from kxy_open_id_client import SegmentClient

async def main():
    client = SegmentClient(base_url="http://localhost:5801")

    # 异步分配 ID 段
    segment = await client.allocate_segment_async(
        system_code="my-system",
        db_name="my_database",
        table_name="orders",
        field_name="order_id",
        segment_count=5000
    )

    print(f"分配到的 ID 段: {segment.start}{segment.end}")

asyncio.run(main())

详细用法

客户端配置

from kxy_open_id_client import SegmentClient

client = SegmentClient(
    base_url="http://localhost:5801",  # 服务地址
    timeout=30.0,                      # 请求超时时间(秒)
    verify_ssl=True,                   # 是否验证 SSL 证书
    headers={                          # 自定义请求头
        "X-Custom-Header": "value"
    }
)

错误处理

from kxy_open_id_client import (
    SegmentClient,
    OpenIdAPIError,
    OpenIdConnectionError,
    OpenIdTimeoutError
)

client = SegmentClient(base_url="http://localhost:5801")

try:
    segment = client.allocate_segment(
        system_code="my-system",
        db_name="my_database",
        table_name="users",
        field_name="id"
    )
except OpenIdAPIError as e:
    # API 返回错误响应
    print(f"API 错误 {e.code}: {e.msg}")
    if e.trace_id:
        print(f"Trace ID: {e.trace_id}")
except OpenIdConnectionError as e:
    # 连接失败
    print(f"连接错误: {e}")
except OpenIdTimeoutError as e:
    # 请求超时
    print(f"请求超时: {e}")

ID 生成器(同步,线程安全)

from kxy_open_id_client import SegmentClient, IdGenerator

# 创建客户端实例
client = SegmentClient(base_url="http://localhost:5801")

# 创建 ID 生成器(线程安全)
id_gen = IdGenerator(
    segment_client=client,
    system_code="my-system",
    db_name="my_database",
    table_name="users",
    field_name="id",
    segment_count=10000  # 每次申请的 ID 数量
)

# 生成 ID(自动管理号段,线程安全)
for _ in range(5):
    print(f"Generated ID: {id_gen.next_id()}")
# 输出: Generated ID: 1, 2, 3, 4, 5

ID 生成器(异步,协程安全)

import asyncio
from kxy_open_id_client import SegmentClient, AsyncIdGenerator

async def main():
    # 创建客户端实例
    client = SegmentClient(base_url="http://localhost:5801")

    # 创建异步 ID 生成器(协程安全)
    id_gen = AsyncIdGenerator(
        segment_client=client,
        system_code="my-system",
        db_name="my_database",
        table_name="orders",
        field_name="order_id",
        segment_count=10000
    )

    # 异步生成 ID
    for _ in range(5):
        id_value = await id_gen.next_id()
        print(f"Generated ID: {id_value}")

asyncio.run(main())

多线程并发使用

import threading
from kxy_open_id_client import SegmentClient, IdGenerator

client = SegmentClient(base_url="http://localhost:5801")
id_gen = IdGenerator(
    segment_client=client,
    system_code="my-system",
    db_name="my_database",
    table_name="users",
    field_name="id",
    segment_count=10000
)

# 多线程并发生成 ID(线程安全)
def generate_ids(thread_id: int, count: int):
    for _ in range(count):
        id_value = id_gen.next_id()
        print(f"Thread {thread_id}: Generated ID {id_value}")

threads = []
for i in range(5):
    t = threading.Thread(target=generate_ids, args=(i, 10))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

API 参考

IdGenerator

线程安全的同步 ID 生成器。

__init__(segment_client, system_code, db_name, table_name, field_name, segment_count=10000)

创建 ID 生成器实例。

参数:

  • segment_client (SegmentClient): SegmentClient 实例
  • system_code (str): 系统代码
  • db_name (str): 数据库名称
  • table_name (str): 表名
  • field_name (str): 字段名
  • segment_count (int): 每次分配的 ID 数量,默认 10000

next_id()

生成下一个 ID(线程安全)。

返回: int - 下一个可用的 ID

异常:

  • OpenIdAPIError: API 返回错误
  • OpenIdConnectionError: 连接失败
  • OpenIdTimeoutError: 请求超时

AsyncIdGenerator

协程安全的异步 ID 生成器。

__init__(segment_client, system_code, db_name, table_name, field_name, segment_count=10000)

创建异步 ID 生成器实例(参数同 IdGenerator)。

async next_id()

异步生成下一个 ID(协程安全)。

返回: int - 下一个可用的 ID

异常: 同 IdGenerator.next_id()

SegmentClient

__init__(base_url, timeout=30.0, verify_ssl=True, headers=None)

创建客户端实例。

参数:

  • base_url (str): KXY Open ID 服务的基础 URL
  • timeout (float): 请求超时时间,默认 30 秒
  • verify_ssl (bool): 是否验证 SSL 证书,默认 True
  • headers (dict): 自定义请求头,可选

allocate_segment(system_code, db_name, table_name, field_name, segment_count=10000)

同步分配 ID 段。

参数:

  • system_code (str): 系统代码
  • db_name (str): 数据库名称
  • table_name (str): 表名
  • field_name (str): 字段名
  • segment_count (int): 分配的 ID 数量,默认 10000

返回: SegmentResponse 对象,包含 startend 属性

异常:

  • OpenIdAPIError: API 返回错误
  • OpenIdConnectionError: 连接失败
  • OpenIdTimeoutError: 请求超时

allocate_segment_async(system_code, db_name, table_name, field_name, segment_count=10000)

异步分配 ID 段(参数和返回值同上)。

数据模型

SegmentRequest

  • system_code: str
  • db_name: str
  • table_name: str
  • field_name: str
  • segment_count: int (默认 10000,最大 2^63-1)

SegmentResponse

  • start: int - 段起始 ID
  • end: int - 段结束 ID

ApiResponse[T]

  • code: int - 状态码 (0 表示成功)
  • msg: str - 消息
  • data: Optional[T] - 数据
  • traceId: Optional[str] - 追踪 ID

开发

安装开发依赖

pip install -e ".[dev]"

运行测试

pytest

代码格式化

black kxy_open_id_client

类型检查

mypy kxy_open_id_client

许可证

MIT License

相关项目

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

kxy_open_id_client-0.2.0.tar.gz (13.6 kB view details)

Uploaded Source

Built Distribution

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

kxy_open_id_client-0.2.0-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file kxy_open_id_client-0.2.0.tar.gz.

File metadata

  • Download URL: kxy_open_id_client-0.2.0.tar.gz
  • Upload date:
  • Size: 13.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for kxy_open_id_client-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ff8354461026205612f47cd497e6a00b3200a522b168ca4f6109c056ed3dd6d6
MD5 9972e91d45f35e0c3c461236e1491078
BLAKE2b-256 df1a58f3942072a0a9c7da304bf9e7b4596b486a5a9f07e52065065bee70c445

See more details on using hashes here.

File details

Details for the file kxy_open_id_client-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for kxy_open_id_client-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 18a36a04f6199b035c705e0abf38756993f9bf23950054f81345bf1620e6d014
MD5 93b154e65cbab016ec355de131f44c83
BLAKE2b-256 ec77709bd5fad1636f8185df123842012b719dcb73f28004c309cb58bf8b7ba0

See more details on using hashes here.

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