A high-performance Snowflake ID generator supporting multiple algorithms (drift, traditional, lock-free) for distributed systems. Supports .NET Framework 4.6.1-4.8, .NET 6-10, .NET Standard 2.0+, and .NET Standard 2.1.
$ dotnet add package Jordium.Snowflake.NET�����ֲܷ�ʽ ID ������������ Twitter Snowflake �㷨�� .NET ʵ�֡�֧������ʵ�ַ�ʽ�������ڲ�ͬ��Ӧ�ó�����
Install-Package Jordium.Snowflake.NET
dotnet add package Jordium.Snowflake.NET
<PackageReference Include="Jordium.Snowflake.NET" Version="1.0.0" />
using Jordium.Framework.Snowflake;
// ���� ID ������
var options = new IDGeneratorOptions
{
WorkerId = 1, // ���� ID (0-31)
DataCenterId = 1, // �������� ID (0-31)
Method = 1 // �㷨�汾 (1=Ư��, 2=��ͳ, 3=����)
};
var generator = new DefaultIDGenerator(options);
// ���� ID
long id = generator.NewLong();
Console.WriteLine($"Generated ID: {id}");
var options = new IDGeneratorOptions
{
WorkerId = 1,
DataCenterId = 1,
Method = 1,
// �Զ���λ������
WorkerIdBitLength = 5, // Worker ID λ�� (Ĭ�� 5)
DataCenterIdBitLength = 5, // �������� ID λ�� (Ĭ�� 5)
SeqBitLength = 12, // ���к�λ�� (Ĭ�� 12)
// ��ʱ�䣨���ڼ���ʱ�����
BaseTime = new DateTime(2020, 1, 1, 0, 0, 0, DateTimeKind.Utc),
// ���кŷ�Χ
MinSeqNumber = 0,
MaxSeqNumber = 4095, // 2^12 - 1
// Ư���㷨ר�ã����Ư�ƴ���
TopOverCostCount = 2000
};
var generator = new DefaultIDGenerator(options);
// Program.cs �� Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ע��Ϊ����
services.AddSingleton<IIDGenerator>(sp =>
{
var options = new IDGeneratorOptions
{
WorkerId = 1,
DataCenterId = 1,
Method = 1
};
return new DefaultIDGenerator(options);
});
}
// Controller ��ʹ��
public class OrderController : ControllerBase
{
private readonly IIDGenerator _idGenerator;
public OrderController(IIDGenerator idGenerator)
{
_idGenerator = idGenerator;
}
[HttpPost]
public IActionResult CreateOrder()
{
long orderId = _idGenerator.NewLong();
// ʹ�����ɵ� ID
return Ok(new { OrderId = orderId });
}
}| �㷨�汾 | ʵ���� | ���ó��� | ���� | ʱ��ز����� | �Ƽ��� |
|---|---|---|---|---|---|
| Method 1 | SnowflakeWorkerV1 | ����Ӧ�á��߲������� | ???? | ? �������к� | ????? |
| Method 2 | SnowflakeWorkerV2 | ͨ�ó�������ʵ�� | ???? | ?? �׳��쳣 | ??? |
| Method 3 | SnowflakeWorkerV3 | �ֲ�ʽ��Ⱥ������ | ????? | ?? ����ز����쳣 | ???? |
�ص���
lock ͬ�����ó�����
����ʾ����
var options = new IDGeneratorOptions
{
WorkerId = 1,
DataCenterId = 1,
Method = 1,
TopOverCostCount = 2000 // ���Ư�ƴ���
};
var generator = new DefaultIDGenerator(options);
// ��ѡ�������¼�
generator.GenIdActionAsync = arg =>
{
if (arg.ActionType == 1) // ��ʼƯ��
{
Console.WriteLine($"��ʼƯ��: WorkerId={arg.WorkerId}");
}
};�ص���
lock ͬ�����ó�����
����ʾ����
var options = new IDGeneratorOptions
{
WorkerId = 1,
DataCenterId = 1,
Method = 2
};
var generator = new DefaultIDGenerator(options);
try
{
long id = generator.NewLong();
}
catch (Exception ex)
{
// ʱ��ز�ʱ���׳��쳣
Console.WriteLine($"ʱ��ز�����: {ex.Message}");
}�ص���
������
����ʾ����
var options = new IDGeneratorOptions
{
WorkerId = 1,
DataCenterId = 1,
Method = 3
};
var generator = new DefaultIDGenerator(options);
// �����㷨�ڶ� WorkerId �������������
// ʾ��������Ⱥ
// Service 1: WorkerId = 1
// Service 2: WorkerId = 2
// Service 3: WorkerId = 3
// ...| �㷨 | ������ | ˵�� |
|---|---|---|
| Method 1 | 600-800 �� ID/�� | Lock �ڵ��������±����ȶ� |
| Method 2 | 500-700 �� ID/�� | ��ʵ�֣������е� |
| Method 3 | 400-600 �� ID/�� | CAS ��ͻ���������½� |
�������� WorkerId �߲����������Ƽ� Method 1
| �㷨 | ������ | ˵�� |
|---|---|---|
| Method 1 | 800-1200 �� ID/�� | Lock �й̶����� |
| Method 2 | 700-1100 �� ID/�� | ��ʵ�� |
| Method 3 | 1200-1800 �� ID/�� | ������������ ? |
�������� WorkerId �ֲ�ʽ�������Ƽ� Method 3
| �߳��� | ������ | ƽ���ӳ� | ��ע |
|---|---|---|---|
| 1 | 1200-1500 �� ID/�� | 0.067-0.083 ��s | ���߳����� |
| 2 | 900-1200 �� ID/�� | 0.167-0.222 ��s | ��Ⱦ��� |
| 4 | 700-900 �� ID/�� | 0.444-0.571 ��s | �жȾ��� |
| 8 | 600-800 �� ID/�� | 1.000-1.333 ��s | �߶Ⱦ��� |
| WorkerId ���� | ÿ�������� | �������� | �������� |
|---|---|---|---|
| 2 | 50,000 | 1000-1300 �� ID/�� | +10-15% |
| 4 | 25,000 | 1200-1500 �� ID/�� | +35-45% |
| 8 | 12,500 | 1400-1800 �� ID/�� | +50-60% |
| ������ | �������� | �ظ��� | ��� |
|---|---|---|---|
| �� WorkerId ���� | 100 �� | 0 | ? ͨ�� |
| �� WorkerId ���� | 100 �� | 0 | ? ͨ�� |
| ��������32 �̣߳� | 320 �� | 0 | ? ͨ�� |
| ����ѹ����5 �룩 | 1000 ��+ | 0 | ? ͨ�� |
ע����ʵ�������ܶ�������Ӱ�죺
- CPU �ͺź���Ƶ
- �ڴ��ٶ�
- ����ϵͳ����
- .NET ����ʱ�汾
- �Ƿ��� Debug/Release ģʽ
- ϵͳ�������
��������Ϊ���Ͳ��Ի����µIJο�ֵ��ʵ�ʲ��������� ��30% �IJ����� �Ƽ���ʵ��Ӳ�������½��л������Ի��ȷ���ݡ�
����������������������������������������������������������������������������������������������������������������������
�� ʱ��� (41 λ) �� ��������(5λ)�� ����ID (5λ) �� ���к�(12λ) ��
�������������������������������������ة��������������������������ة��������������������������ة�����������������������������
Լ 69 �� 32 �� 32 ̨ 4096/����
| ���� | Worker λ | DC λ | Seq λ | ���� |
|---|---|---|---|---|
| �� | 5 | 5 | 12 | 32 DC �� 32 Worker �� 4096/ms |
| ���������� | 4 | 6 | 12 | 64 DC �� 16 Worker �� 4096/ms |
| ����� | 6 | 4 | 12 | 16 DC �� 64 Worker �� 4096/ms |
| �Ͳ��� | 5 | 5 | 10 | 32 DC �� 32 Worker �� 1024/ms |
Լ��������
�Ƽ�������
// ʾ�����ӻ���������ȡ
var workerId = Environment.GetEnvironmentVariable("WORKER_ID");
var options = new IDGeneratorOptions
{
WorkerId = ushort.Parse(workerId ?? "1"),
DataCenterId = 1,
Method = 1
};| �㷨 | ������ʽ |
|---|---|
| Method 1 | ʹ��Ԥ�����к� 1-4�����֧�� 4 �λز� |
| Method 2 | ֱ���׳��쳣 |
| Method 3 | ��ʱ�䣨< 1�룩���ߵȴ�����ʱ�����쳣 |
ȷ��ÿ�������� WorkerId �� DataCenterId ���Ψһ���ɣ�
// ����ʾ�� ?
// Server 1: WorkerId=1, DataCenterId=1
// Server 2: WorkerId=1, DataCenterId=1 �� ������ظ� ID
// ��ȷʾ�� ?
// Server 1: WorkerId=1, DataCenterId=1
// Server 2: WorkerId=2, DataCenterId=1
// Server 3: WorkerId=1, DataCenterId=2����嵥��
AddSingleton��DefaultIDGenerator ʵ��MIT License