sbooker/persistent-sequences
Composer 安装命令:
composer require sbooker/persistent-sequences
包简介
Persistent sequences
README 文档
README
Persistent Sequences (sbooker/persistent-sequences)
Конкурентно-безопасная, транзакционная библиотека для создания и управления именованными персистентными последовательностями.
Назначение библиотеки
Эта библиотека является идеальным инструментом для построения единых центров генерации идентификаторов (ID) и бизнес-номеров.
В сложных системах стандартного AUTO_INCREMENT бывает недостаточно. SequenceGenerator решает следующие задачи:
- Централизованная генерация ID: В распределенных системах или при использовании подхода DDD, где ID сущности должен быть сгенерирован до ее сохранения,
SequenceGeneratorможет выступать как надежный и транзакционный источник уникальных ID. - Именованные бизнес-последовательности: Создание независимых последовательностей для счетов (
INV-001), заказов (ORD-002) и т.д. - Атомарность: Гарантированное получение следующего значения в последовательности вместе с другими операциями в рамках одной транзакции.
- Надежность: Безопасная генерация в СУБД, где
AUTO_INCREMENTимеет проблемы в кластерных конфигурациях.
Библиотека интегрирована с sbooker/transaction-manager, что гарантирует безопасность при одновременном доступе.
Ключевые особенности
- Централизованная генерация ID: Может использоваться как единый источник правды для генерации уникальных идентификаторов сущностей.
- Транзакционная безопасность: Генерация нового значения происходит внутри транзакции, управляемой
transaction-manager. - Безопасность при конкурентном доступе: Использует
getLocked()для предотвращения гонок данных. - Именованные последовательности: Неограниченное количество независимых последовательностей.
- Гибкие алгоритмы: Используйте встроенный
Incrementили создайте собственную реализацию интерфейсаAlgorithm. - Разделение чтения и записи (CQRS):
SequenceGeneratorдля изменения иSequenceReaderдля безопасного чтения текущего значения.
Установка
composer require sbooker/persistent-sequences
Вам также понадобится sbooker/transaction-manager и его адаптер для вашей ORM.
Быстрый старт
Шаг 1: Конечная цель — простое получение ID
Ваш прикладной код для генерации уникальных ID или бизнес-номеров будет выглядеть максимально просто:
// Генерируем следующий уникальный ID для нового пользователя $nextUserId = (int)$sequenceGenerator->next('users_pk', new Algorithm\Increment(1)); $user = new User($nextUserId, /* ... */); $transactionManager->persist($user); // Получаем следующий номер для счета $nextInvoiceNumber = $sequenceGenerator->next('invoices', new InvoiceAlgorithm()); // $nextInvoiceNumber будет "INV-2023-0001"
Шаг 2: Сборка зависимостей
Для работы SequenceGenerator требуется TransactionManager.
// bootstrap.php или ваш DI-контейнер /** @var Sbooker\TransactionManager\TransactionManager $transactionManager */ $sequenceGenerator = new Sbooker\PersistentSequences\SequenceGenerator($transactionManager);
Шаг 3: Чтение текущего значения без блокировки (опционально)
Если вам нужно просто узнать последнее сгенерированное значение, не увеличивая его, используйте SequenceReader.
1. Реализуйте SequenceReadStorage:
// src/Infrastructure/Persistence/DoctrineSequenceReadStorage.php use Doctrine\ORM\EntityManagerInterface; use Sbooker\PersistentSequences\Sequence; use Sbooker\PersistentSequences\SequenceReadStorage; final class DoctrineSequenceReadStorage implements SequenceReadStorage { /* ... */ }
2. Соберите и используйте SequenceReader:
// bootstrap.php или ваш DI-контейнер /** @var DoctrineSequenceReadStorage $readStorage */ $sequenceReader = new Sbooker\PersistentSequences\SequenceReader($readStorage); // В вашем коде: $lastUserId = $sequenceReader->last('users_pk');
Продвинутое использование: собственный алгоритм
Вы можете легко создать свой алгоритм, реализовав интерфейс Algorithm.
// src/Sequences/InvoiceAlgorithm.php use Sbooker\PersistentSequences\Algorithm; final class InvoiceAlgorithm implements Algorithm { public function first(): string { return "INV-2023-0000"; } public function next(string $currentValue): string { // Простая (но не идеальная) реализация для примера [$prefix, $year, $number] = explode('-', $currentValue); $nextNumber = str_pad((string)((int)$number + 1), 4, '0', STR_PAD_LEFT); return "$prefix-$year-$nextNumber"; } } // Использование: $nextInvoiceNumber = $sequenceGenerator->next('invoices', new InvoiceAlgorithm()); // вернет "INV-2023-0001"
License
See LICENSE file.
sbooker/persistent-sequences 适用场景与选型建议
sbooker/persistent-sequences 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.12k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2020 年 06 月 04 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 sbooker/persistent-sequences 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 sbooker/persistent-sequences 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 5.12k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 2
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2020-06-04