moves / snowflake
Requires
- php: ^8.1
- illuminate/support: ^10.0
Requires (Dev)
- captainhook/captainhook: ^5.10
- illuminate/database: ^10.0
- marcocesarato/php-conventional-changelog: ^1.12
- moves/conventional-commits: ^2.0
- orchestra/testbench: ^8.0
- phpunit/phpunit: ^9.5
README
🚨 警告 🚨
此包仅适用于64位PHP安装。
此包尚未针对Twitter等社交媒体平台常见的实际流量进行测试。
简介
这是Twitter的Snowflake、Sony的Sonyflake以及我们自定义的Modelflake ID生成器的PHP实现。
还包括特质,允许您直接在Eloquent模型类上自动生成ID。
安装
要将此库添加到您的项目中,请运行
composer require moves/snowflake
用法
Eloquent模型
先决条件
对于应用程序的每个单独部署,请确保为SNOWFLAKE_MACHINE_ID环境键设置一个唯一的值。
提供的Eloquent Snowflake生成器特质的默认实现需要您配置缓存驱动程序。
🚨 请注意,file缓存驱动程序不支持在“无服务器”/AWS Lambda等分布式基础设施上的部署。 🚨
Snowflake ID依赖于创建唯一的序列号。在传统的部署系统中,每个“环境”都需要一个物理或虚拟服务器实例,原子序列号生成只需要在各个服务器实例的线程之间进行。然而,在现代的部署系统中,单个“环境”可能包含任意数量的物理或虚拟服务器,因此必须在所有服务器实例之间确保原子锁定。这只能通过专用微服务或共享缓存系统来实现。
用法
要在您的Eloquent模型类上使用您选择的ID生成器,只需将相应的特质添加到您的模型中。
Moves\Snowflake\Traits\EloquentTwitterSnowflakeId 用于Twitter Snowflake
Moves\Snowflake\Traits\EloquentSonyflakeId 用于Twitter Snowflake
Moves\Snowflake\Traits\EloquentModelflakeId 用于Twitter Snowflake
或者
Moves\Snowflake\Traits\EloquentSnowflakeId 以指定您自己的自定义ID生成器类
use Illuminate\Database\Eloquent\Model;
use Moves\Snowflake\Traits\EloquentTwitterSnowflakeId;
public class MyModel extends Model
{
use EloquentTwitterSnowflakeId;
}
在create时,您的模型类将自动生成一个唯一的ID并将其应用于模型实例,然后再将其插入数据库。
请注意,JavaScript仅支持最多53位整数,因此当从API检索数据时,整数Snowflake ID不会被正确处理。因此,所有包含的ID生成特质也将自动在模型的关键字段上添加字符串转换,以便在调用toArray或toJson时将Snowflake ID作为字符串返回。
覆盖默认序列号生成
提供的特性为生成唯一的序列号提供了一个默认实现,依赖于Laravel的Cache外观和原子锁。但是,您可以通过提供自己的函数闭包来返回一个唯一的序列号来覆盖默认实现。有关更多信息,请参阅提供自己的生成器。
提供自己的生成器
要提供自己的生成器类,使用Moves\Snowflake\Traits\EloquentSnowflakeId特性,并实现以下方法头
public function getSnowflakeGenerator(): ISnowflakeGenerator
{
//TODO: Implement
}
您可以构建自己的类,实现ISnowflakeGenerator接口,或者提供一个实例,该实例使用构造函数传递的替代值从本包中的某个生成器。
例如,这是如何向TwitterSnowflake生成器提供自己的序列号生成函数的方法
public function getSnowflakeGenerator(): ISnowflakeGenerator
{
return new TwitterSnowflakeGenerator(
$this->_getMachineId(),
function (): int {
// Closure containing your custom sequence number generation logic
}
);
}
直接使用
此包仍然可以在Eloquent模型类之外使用。在任何需要的地方实例化并调用适当的生成器类
$generator = new TwitterSnowflakeGenerator(
$machineId,
$sequenceNumberClosure
);
$id = $generator->generate;
您还可以使用生成器来解析现有的Snowflake ID,并解析为其组成部分
$parts = $generator->parse($snowflake);
// Expected Output:
// [timestamp] => 1634677016824 (ms)
// [machine] => 1
// [sequence] => 1