Bamboo-leaf это система генерации распределённых идентификаторов, написанная на Java. Она реализует алгоритмы сегмента базы данных и снежинки (snowflake). Алгоритм сегмента базы данных основан на подходах tinyid от Didi Chuxing и tddl-Sequence от Alibaba, объединив лучшие черты обоих решений и внедрив новые методы реализации и расширение алгоритма. Это позволяет системе лучше адаптироваться к различным сценариям использования, повысить производительность и надёжность при высокой конкуренции, а также сделать её более удобной для интеграции.
Алгоритм снежинки (snowflake) вдохновлен оригинальным алгоритмом и реализацией uid-generator от Baidu. В новой версии были переопределены размеры различных частей снежинки, что позволило решить проблемы ограничения количества узлов workerid и повторения последовательностей при обратном хронологическом порядке времени. Также было увеличено количество создаваемых идентификаторов за каждое миллисекунду.
Система предоставляет Bamboo-leaf-client (SDK), который позволяет локально генерировать идентификаторы, обеспечивая лучшую производительность и доступность. Все компоненты системы могут быть интегрированы через Bamboo-leaf-client, позволяя ежедневно генерировать миллиарды уникальных идентификаторов.
## Бамбуковая листва структура кода
bamboo-leaf
----bamboo-leaf-server
----bamboo-leaf-client
----bamboo-leaf-core
----bamboo-leaf-autoconfigure
----bamboo-leaf-demo
Класс интерфейса: BambooLeafSnowflakeClient
Номер | Интерфейс | Описание | Функциональное описание |
---|---|---|---|
1 | public long snowflakeId(String namespace); | Оригинальный алгоритм Snowflake | Возвращает значение типа Long |
2 | public String snowflakeId16(String namespace); | Оригинальный алгоритм Snowflake + случайное число | Возвращает строку длиной 16 символов: 13 символов (оригинальный алгоритм Snowflake преобразован в 36-ричную систему), 3 символа (случайное число преобразовано в 36-ричную систему) |
3 | public String snowflakeId20(String namespace); | Оригинальный алгоритм Snowflake + namespace + случайное число | Возвращает строку длиной 20 символов: 13 символов (оригинальный алгоритм Snowflake преобразован в 36-ричную систему), 3 символа (namespace преобразован в 36-ричную систему), 3 символа (случайное число преобразовано в 36-ричную систему) |
Класс интерфейса: BambooLeafSegmentClient
|
Номер | Интерфейс | Описание | Функциональное описание |
---|---|---|---|
1 | public Long segmentId(String namespace); | Возвращает значения от 1 до Long.MAX_VALUE | Возвращает значение типа Long |
2 | public Long dateSegmentId(String namespace); | Возвращает последовательность длиной 19 байтов в формате даты | Например: 202101010000000001. Последовательность будет сброшена после достижения значения 99999999999. Этот алгоритм может выдавать максимум 99999999999 уникальных номеров каждый день |
3 | public String dateSegmentId(String namespace, String prefix); | Возвращает последовательность типа String с префиксом + дата Формат: префикс + 8 цифр yyyyMMdd + 11 цифр последовательности |
Например: P202101010000000001 При превышении значения последовательности 99999999999 она сбрасывается. Этот алгоритм позволяет создавать до 99999999999 уникальных номеров за день |
4 | public Long timeSegmentId(String namespace); | Возвращает последовательность типа long с временем, состоящую из 19 цифр Формат: 12 цифр yyMMddHHmmss + 7 цифр последовательности |
Например: 2101010101010000001 При превышении значения последовательности 9999999 она сбрасывается. Этот алгоритм позволяет создавать до 9999999 уникальных номеров каждую секунду |
| 5|public String timeSegmentId(String namespace, String prefix);| возвращает последовательность типа String с временным префиксом
формат: префикс + 12 цифр yyMMddHHmmss + 7 цифр последовательности | Например: P2101010101010000001
При превышении значения последовательности 9999999 она сбрасывается.
Этот алгоритм позволяет создавать до 9999999 уникальных номеров каждую секунду |
| 5|public String timeSegmentId(String namespace, String prefix);| возвращает последовательность типа String с временным префиксом
формат: префикс + 12 цифр yyMMddHHmmss + 7 цифр последовательности | Например: P2101010101010000001
При превышении значения последовательности 9999999 она сбрасывается.
Этот алгоритм позволяет создавать до 9999999 уникальных номеров каждую секунду |## Высокая производительность
Примечание: QPS всего кластера = QPS одного узла * количество узлов.
leaf-segment
зависит от базы данных; когда БД недоступна, клиент продолжает использовать кэшированные данные некоторое время (в зависимости от шага и скорости генерации последовательностей).
поддерживает несколько БД (необходимо обеспечивать согласованность данных между ними).
leaf-snowflake
при запуске получает Worderid, зависящий от базы данных; ранее это не влияло на работу при недоступности БД.
Заключение: децентрализованная модель локального клиента обеспечивает максимальную доступность, не зависящую от центральной службы bamboo-server.
Не применимо к следующим сценариям:
JDK 1.8+, Maven, MySQL, Java Client в настоящее время зависит только от JDK.