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

OSCHINA-MIRROR/GuaikOrg-go-snowflake

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

❄️ GO-Sноувфлак

Статус сборки

Описание Snowflake

В односистемной среде мы используем автоинкрементные ID как уникальные идентификаторы данных. Автоинкрементные ID полезны в базах данных для сортировки и индексации, но при использовании их в распределённых системах могут возникнуть конфликты. Кроме того, такие ID легко могут быть сканированы спайдерами.

В распределённых системах также используют UUID как уникальные идентификаторы данных, однако UUID представляет собой случайную последовательность символов, что делает невозможным её сортировку.

Twitter разработал алгоритм Snowflake для генерации ID в распределённых системах. ID Snowflake имеет тип int64 и состоит из следующих частей:

1 бит 41 бит 5 бит 5 бит 12 бит
Знаковый бит (зарезервированное поле) Временная метка (текущее время - эпоха времени) ID центра обработки данных ID машины Последовательность инкремента

Краткое описание алгоритмаПри использовании Snowflake для генерации ID, сначала вычисляется временная метка timestamp (текущее время — эпоха времени). Если данные временной метки превышают 41 бит, то это считается ошибкой. Также необходимо проверять, чтобы значения datacenterId и workerId не превышали 5 бит (0-31). При работе с последовательностью инкремента, если она превышает 12 бит, требуется ждать, пока текущий миллисекундный отрезок завершится, после чего последовательность инкремента начинает увеличиваться снова с нуля.---

🚀 Быстрый старт

🕹 Клонирование & запуск

git clone https://github.com/GUAIK-ORG/go-snowflake.git

go run main.go

💾 Установка & импорт

go get github.com/GUAIK-ORG/go-snowflake

// Импортирование модуля в проекте
import "github.com/GUAIK-ORG/go-snowflake/snowflake"

⚠️ Внимание

  • В многопоточной среде (несколько объектов snowflake) важно обеспечить уникальность каждого экземпляра (datacenterid, workerid), иначе могут возникнуть конфликты ID.

📊 Тестирование

Тестирование на локальной машине:

Параметр Конфигурация
ОС MacBook Pro (13-дюймовая модель, 2016 года выпуска, четыре порта Thunderbolt 3)
Процессор 2,9 ГГц двухядерный Intel Core i5
Оперативная память 8 ГБ 2133 МГц LPDDR3

Тестовый код ```go func TestLoad() { var wg sync.WaitGroup s, err := snowflake.NewSnowflake(int64(0), int64(0)) if err != nil { glog.Error(err) return } var check sync.Map t1 := time.Now() for i := 0; i < 200000; i++ { wg.Add(1) go func() { defer wg.Done() val := s.NextVal() if _, ok := check.Load(val); ok { // проверка конфликта ID glog.Error(fmt.Errorf("ошибка#уникальность: значение:%v", val)) return } check.Store(val, 0) if val == 0 { glog.Error(fmt.Errorf("ошибка")) return } }() } wg.Wait() elapsed := time.Since(t1) glog.Infof("генерация 200k ID заняла время: %v", elapsed) }


![load](https://gitee.com/GuaikOrg/go-snowflake/raw/master/docs/load.png)

## 🗂 Инструкция по использованию

### Создание объекта Snowflake```go
// NewSnowflake(datacenterid, workerid int64) (*Snowflake, error)
// Аргумент 1 (int64): ID центра данных (диапазон допустимых значений: 0-31)
// Аргумент 2 (int64): ID рабочей станции (диапазон допустимых значений: 0-31)
// Возвращаемое значение 1 (*Snowflake): Объект Snowflake | nil
// Возвращаемое значение 2 (error): Код ошибки
s, err := snowflake.NewSnowflake(int64(0), int64(0))
if err != nil {
	glog.Error(err)
	return
}

Генерация уникального ID

s, err := snowflake.NewSnowflake(int64(0), int64(0))
// ......
// (s *Snowflake) NextVal() int64
// Возвращаемое значение 1 (int64): Уникальный ID
id := s.NextVal()
// ......

Получение ID центра данных и ID рабочей станции по уникальному ID

// ......
// GetDeviceID(sid int64) (datacenterid, workerid int64)
// Аргумент 1 (int64): Уникальный ID
// Возвращаемое значение 1 (int64): ID центра данных
// Возвращаемое значение 2 (int64): ID рабочей станции
datacenterid, workerid := snowflake.GetDeviceID(id)

Получение метки времени по уникальному ID (время создания ID с момента эпохи)

// ......
// GetTimestamp(sid int64) (timestamp int64)
// Аргумент 1 (int64): Уникальный ID
// Возвращаемое значение 1 (int64): Метка времени от начала эпохи
t := snowflake.GetTimestamp(id)

Получение метки времени генерации ID по уникальному ID

// ......
// GetGenTimestamp(sid int64) (timestamp int64)
// Аргумент 1 (int64): Уникальный ID
// Возвращаемое значение 1 (int64): Метка времени при создании уникального ID
t := snowflake.GetGenTimestamp(id)

Получение времени генерации ID по уникальному ID (точность до секунды)

// ......
// GetGenTime(sid int64) (time string)
// Аргумент 1 (int64): Уникальный ID
// Возвращаемое значение 1 (string): Время создания уникального ID
tStr := snowflake.GetGenTime(id)
```### Просмотр использования поля метки времени (диапазон 41 бита: 69 лет после начала эпохи)

```go
// ......
// GetTimestampStatus() (state float64)
// Возвращаемое значение 1 (float64): Процент использования поля метки времени (диапазон: 0.0 - 1.0)
status := snowflake.GetTimestampStatus()

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Алгоритм Snowflake, реализованный на языке Go, генерирует уникальные идентификаторы (ID) для распределённых систем. В ходе тестирования на одном компьютере за секунду было сгенерировано 200 000 ID. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/GuaikOrg-go-snowflake.git
git@api.gitlife.ru:oschina-mirror/GuaikOrg-go-snowflake.git
oschina-mirror
GuaikOrg-go-snowflake
GuaikOrg-go-snowflake
master