1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sunney-bamboo-leaf

13.03.2025 07:40
GitLife Service Account
  1. Оптимизация конфигурации.
  2. Добавлен алгоритм shortDate_segment_id.
Последнее сообщение коммита: 优化配置
Предпросмотр версии
13.03.2025 07:39
GitLife Service Account
  1. Устранение некоторых ошибок (bugs)
  2. Поддержка динамического шага в bamboo-segment.
  3. Оптимизация логов.
  4. Оптимизация комментариев.
  5. Оптимизация демонстрационных примеров (demos)
Последнее сообщение коммита: demo优化
Предпросмотр версии
13.03.2025 07:39
GitLife Service Account

Bamboo-leaf简介

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
----bamboo-leaf-server
----bamboo-leaf-client
----bamboo-leaf-core
----bamboo-leaf-autoconfigure
----bamboo-leaf-demo

Бамбуковая листва список API

1. Список API для алгоритма Snowflake

Класс интерфейса: 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 уникальных номеров каждую секунду |## Высокая производительность

  1. leaf-segment одиночный qps может достигать 200к+ (в зависимости от шага и производительности сервера).
  2. leaf-snowflake одиночный qps может достигать максимума 262143.

Примечание: QPS всего кластера = QPS одного узла * количество узлов.

Доступность

  1. leaf-segment
    зависит от базы данных; когда БД недоступна, клиент продолжает использовать кэшированные данные некоторое время (в зависимости от шага и скорости генерации последовательностей).
    поддерживает несколько БД (необходимо обеспечивать согласованность данных между ними).

  2. leaf-snowflake
    при запуске получает Worderid, зависящий от базы данных; ранее это не влияло на работу при недоступности БД.

Заключение: децентрализованная модель локального клиента обеспечивает максимальную доступность, не зависящую от центральной службы bamboo-server.

Характеристики Bamboo

  1. Глобально уникальный id типа long.
  2. Увеличивающийся порядок, общая последовательность.
  3. Предоставляет централизованную модель удаленного сервера и децентрализованную модель локального клиента.
  4. Поддерживает расширяемые алгоритмы на основе segment и snowflake.
  5. leaf-segment поддерживает различные механизмы генерации номеров для разных IDC (например, A data center: 1, 3, 5... B data center: 2, 4, 6...).
  6. leaf-snowflake решает проблемы ограничения workerid и повторения номеров при откате времени.
  7. Поддерживает механизмы гарантии высокой производительности и доступности.### Применимые сценарии
    Применимо к следующим сценариям:
  8. Чистым последовательным цифрам (например, ID записи журнала).
  9. Последовательностям с бизнес-атрибутами (например, номер заказа: P2101010101010000001).
  10. Полностью случайным строкам (например, QR-код: 023eqt01pd6o001a04ui).
  11. Разделенным таблицам и базам данных, развернутым в нескольких дата-центрах, каждый из которых имеет свою последовательность ID.

Не применимо к следующим сценариям:

  1. Сценариям, где требуется строгое соответствие порядка.

Взаимозависимости

JDK 1.8+, Maven, MySQL, Java Client в настоящее время зависит только от JDK.

Последнее сообщение коммита: 优化文档
1
https://api.gitlife.ru/oschina-mirror/sunney-bamboo-leaf.git
git@api.gitlife.ru:oschina-mirror/sunney-bamboo-leaf.git
oschina-mirror
sunney-bamboo-leaf
sunney-bamboo-leaf