bestyii/yii2-snowflake 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

bestyii/yii2-snowflake

Composer 安装命令:

composer require bestyii/yii2-snowflake

包简介

Snowflake for Yii2

README 文档

README

snowflake

雪花算法ID生成器 (Yii2 组件)

Latest Stable Version Total Downloads License

环境要求

PHP >= 7.0

安装

安装此扩展的首选方法是:composer.

项目根目录下运行

php composer.phar require --prefer-dist bestyii/yii2-snowflake "*"

或添加到composer.json文件的require区域中.

"bestyii/yii2-snowflake": "*"

配置

快速上手

在配置文件中加入

return [
    //...
    'components' => [
        //...
        'snowflake' => [
            'class' => 'bestyii\snowflake\Snowflake',
            'startDate' => '2022-12-31',
        ],
    ],
];
参数 说明
startDate 起始日期 , 字符串Y-m-d格式, 如: '2022-12-31'

高级配置

雪花算法生成的 ID 并不能保证唯一,如当两个不同请求同一时刻进入相同的数据中心的相同节点时,而此时该节点生成的 sequence 又是相同时,就会导致生成的 ID 重复。 所以要想使用雪花算法生成唯一的 ID,就需要保证同一节点同一毫秒内生成的序列号是唯一的。

此扩展内置了基于redis的序列号生成器\bestyii\snowflake\RedisSequenceResolver,保证同一毫秒生成的序列号不同。

return [
    //...
    'components' => [
        //...
        'snowflake' => [
            'class' => 'bestyii\snowflake\Snowflake',
            'startDate' => '1970-1-1',
            'datacenterId' => 11,
            'workerId' => 22,
            'sequencer' =>  '\bestyii\snowflake\RedisSequenceResolver', 
        ],
    ],
];
参数 说明
startDate 起始日期
datacenterId 数据中心id
workerId 主机id
sequencer \bestyii\snowflake\RedisSequenceResolver, 需要配置 yii2-redis 组件

如何使用

手动

生成id

$id = \Yii::$app->snowflake->id();
// 401621641244704768

解析id

\Yii::$app->snowflake->parseId($id);
//[
//    'timestamp' => '1011001001011011000110000010011110010'
//    'sequence' => '000000000000'
//    'workerid' => '00000'
//    'datacenter' => '00000'
//]

使用Behavior自动生成id

本组件支持通过附加ActiveRecord Model的behavior方式来完成自动生成id

使用下列语法:

public function behaviors()
{
    return [
        'snowflake' => [
            'class' => '\bestyii\snowflake\SnowflakeBehavior',
            'attributes' => 'id',// default:id
        ],
    ];
}

在数据保存之前, 该behavior(行为)会自动生成id.

雪花算法说明

本项目基于 godruoyi/php-snowflake 实现.

snowflake-algorithm

Snowflake 是 Twitter 内部的一个 ID 生算法,可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码。其组成为:

  • 第一个 bit 为未使用的符号位。
  • 第二部分由 41 位的时间戳(毫秒)构成,他的取值是当前时间相对于某一时间的偏移量。
  • 第三部分和第四部分的 5 个 bit 位表示数据中心和机器ID,其能表示的最大值为 2^5 -1 = 31。
  • 最后部分由 12 个 bit 组成,其表示每个工作节点每毫秒生成的序列号 ID,同一毫秒内最多可生成 2^12 -1 即 4095 个 ID。

需要注意的是:

  • 在分布式环境中,5 个 bit 位的 datacenter 和 worker 表示最多能部署 31 个数据中心,每个数据中心最多可部署 31 台节点 -41 位的二进制长度最多能表示 2^41 -1 毫秒即 69 年,所以雪花算法最多能正常使用 69 年,为了能最大限度的使用该算法,你应该为其指定一个开始时间。

bestyii/yii2-snowflake 适用场景与选型建议

bestyii/yii2-snowflake 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 947 次下载、GitHub Stars 达 3, 最近一次更新时间为 2022 年 08 月 20 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「extension」 「uuid」 「yii2」 「snowflake」 「id generator」 「bestyii.com」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 bestyii/yii2-snowflake 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 bestyii/yii2-snowflake 我们能提供哪些服务?
定制开发 / 二次开发

基于 bestyii/yii2-snowflake 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 947
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 17
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 3
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2022-08-20