An ID generator for distributed microservices.
Project description
Yz-id
Introduction
An ID generator for distributed microservices. 一个分布式ID生成器框架,适用于微服务领域的全局ID生成。基于snowflake的设计理念, 设计出这个可自行根据需要重新分配了各部分的bit位的ID生成器框架。
在分布式系统中,整体的业务被拆分成多个自治的微服务,每个微服务之间需要通过网络进行通信和交互, 由于网络的不确定性,会给系统带来各种各样的不一致问题,为了避免和解决不一致问题, 最重要的模式是做系统之间的实时核对和事后核对,核对的基础就是领域对象及系统间的请求需要有唯一ID来标识。
在源码的extras
中已经举例出三种ID组合方式方案。
-
【Snowflake】:
版本 毫秒级时间 机器ID 序列号 63 62-22 21-12 11-0 -
【Sonyflake】:
版本 10毫秒级时间 序列号 机器ID 63 62-24 23-16 15-0 -
【Anonymous】:
-
【最大峰值】:
版本 类型 生成方式 秒级时间 序列号 机器ID 63 62 60-61 59-30 29-10 0-9 -
【最小粒度】:
版本 类型 生成方式 毫秒级时间 序列号 机器ID 63 62 60-61 59-20 19-10 0-9
生成方式:(嵌入式,restful,中心分发)
anonymous
适用于一些杂糅的架构场景,可以应对各种情景下的ID生成方式。 -
Quick start
安装模块
$ pip install yzid
如果上面的三种方案适用你需要的场景,可以直接使用:
# Anonymous:
from yzid import get_id_service
time_epoch = 1610351662
idsvc1 = get_id_service(time_epoch=time_epoch, machine_code=1)
id1 = idsvc1.generate_id()
# Snowflake
from yzid import get_snowflake_service
time_epoch = 1610351662 * 1000
idsvc2 = get_snowflake_service(time_epoch=time_epoch, machine_code=1)
id2 = idsvc2.generate_id()
# Sonyflake
from yzid import get_sonyflake_service
time_epoch = 1610351662*100
idsvc3 = get_sonyflake_service(time_epoch=time_epoch, machine_code=1)
id3 = idsvc3.generate_id()
如果没有合适的,可以自定义组合方案。 自定义组合ID组成示例:
from yzid.core.service import IdService
def get_id_service(
time_epoch: int,
machine_code: int,
generate_method: int = 2,
mode_type: int = 1,
version: int = 0,
):
"""
:param time_epoch: 时间起点
:param machine_code: 机器序号
:param generate_method: (嵌入式,restful,中心分发)
:param mode_type: (最大峰值,最小粒度)
:param version:
:return:
"""
_type = {
"max_peak": [
("machine", (10, machine_code)), # (<name>: (<bit_count>, <default_value>))
("sequence", 20), # (<name>: (<bit_count>, 0))
("duration", 30),
("method", (2, generate_method)),
("type", (1, 1)),
("version", (1, version)),
],
"min_granularity": [
("machine", (10, machine_code)),
("sequence", 10),
("duration", 40),
("method", (2, generate_method)),
("type", (1, 0)),
("version", (1, version)),
]
}
structure = _type.get("max_peak") if mode_type == 1 else _type.get("min_granularity")
return IdService(
structure=structure,
time_epoch=time_epoch,
time_unit=1 if mode_type == 1 else 10**3, # 秒级和毫秒级的选择
time_name="duration",
sequence_name="sequence"
)
structure
参数必须是有序的可迭代对象,在设计组合时,低位在前,高位在后;
命名字段的值可以是Tuple[int, int]
或int
,只有单个int时,即只指定该组成部分占用的位数,默认值为0。
structure
里的所有组成部分的位数总和必须为64,否则报异常错误。
在ID的组成部分中,有两个部分是必不可少的————时间
和序列号
,所以无论在structure
中的命名组合是什么,
都必须在实例化时指明它们的名称:
time_name="duration",
sequence_name="sequence"
这样的yzid
才知道需要对哪个部分进行时间操作和累加操作。
time_unit
是时间单位,为了告诉yzid
是使用秒级、百毫秒级、十毫秒级、毫秒级、还是微秒级的;
time_unit
必须是底数为10的指数值:
- 秒级 = 10**0 或 1
- 百毫秒级 = 10**1 或 10
- 十毫秒级 = 10**2 或 100
- 毫秒级 = 10**3 或 1000
- 微秒级 = 10**6 或 1000000
time_epoch
是起始时间戳,是一个重要的参数,而且需要警惕。一旦启用,不可变更。否则可能会造成ID重复。
Documentation
暂无.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file yzid-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: yzid-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.7.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ce0dddd7f6b506d7d24b3a8a371969477a9649107dcdb59ba78a6e55f2e9c68 |
|
MD5 | dc0f3048c64acd8812c838232c1f2f12 |
|
BLAKE2b-256 | c961e6a1333746b882e56a2163ef69c51c9b845b7c5a1235358c1ced983a98aa |