Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk melaksanakan algoritma Snowflake di Golang

Bagaimana untuk melaksanakan algoritma Snowflake di Golang

PHPz
Lepaskan: 2023-04-13 14:58:07
asal
1178 orang telah melayarinya

Snowflake ialah algoritma penjanaan ID teragih yang bersumberkan terbuka oleh Twitter Ia menggunakan kaedah berikut untuk menjana ID unik secara global:

  1. ID 64-bit, yang mana 1 ialah bit tanda dan 41. adalah masa, 10 ialah ID mesin yang berfungsi, dan 12 ialah nombor siri.
  2. Untuk sistem teragih, keunikan global secara amnya boleh dijamin dengan menggabungkan cap masa, ID mesin pekerja dan nombor siri.

Dalam artikel ini, kami akan memperkenalkan cara melaksanakan Snowflake di Golang.

  1. Tentukan struktur dan pemalar

Pertama, kita perlu menentukan struktur untuk menyimpan data dalam algoritma Snowflake, termasuk ID mesin, nombor siri dan cap waktu ID yang dijana terakhir dan maklumat lain.

const (
    workerIdBits     = 10  // 机器ID位数
    sequenceBits     = 12  // 序列号位数
    workerIdMax      = -1 ^ (-1 << workerIdBits) // 最大机器ID
    sequenceMask     = -1 ^ (-1 << sequenceBits) // 序列号掩码
    timeShiftBits    = workerIdBits + sequenceBits // 时间戳左移位数
    workerIdShift    = sequenceBits               // 机器ID左移位数
)

type Snowflake struct {
    lastTimestamp uint64
    workerId      uint16
    sequence      uint16
}
Salin selepas log masuk

Antaranya, kami menggunakan pemalar untuk mewakili bilangan digit setiap data, nilai maksimum, topeng dan maklumat lain untuk memudahkan pengiraan seterusnya.

  1. Laksanakan kaedah penjanaan ID

Seterusnya, kita perlu melaksanakan kaedah untuk menjana ID unik di peringkat global. Proses khusus adalah seperti berikut:

  1. Dapatkan cap masa semasa Jika kurang daripada cap masa ID yang dijana terakhir, tunggu sehingga cap masa dikemas kini menjadi lebih besar daripada cap masa yang dijana terakhir. ID.
  2. Jika cap masa semasa adalah sama dengan cap masa ID yang dijana terakhir, tambahkan nombor jujukan Jika nombor jujukan mencapai nilai maksimum, tunggu sehingga cap masa seterusnya.
  3. Jika cap masa semasa lebih besar daripada cap masa ID yang dijana terakhir, tetapkan semula nombor jujukan dan rekod cap masa semasa dan jana ID.

Pelaksanaan khusus adalah seperti berikut:

func (s *Snowflake) NextId() uint64 {
    var currTimestamp = uint64(time.Now().UnixNano() / 1e6)

    if currTimestamp < s.lastTimestamp {
        panic("Invalid timestamp")
    }

    if currTimestamp == s.lastTimestamp {
        s.sequence = (s.sequence + 1) & sequenceMask
        if s.sequence == 0 {
            currTimestamp = s.waitNextMillis(currTimestamp)
        }
    } else {
        s.sequence = 0
    }

    s.lastTimestamp = currTimestamp

    return ((currTimestamp - 1483228800000) << timeShiftBits) |
            (uint64(s.workerId) << workerIdShift) |
            uint64(s.sequence)
}

func (s *Snowflake) waitNextMillis(currTimestamp uint64) uint64 {
    for currTimestamp <= s.lastTimestamp {
        currTimestamp = uint64(time.Now().UnixNano() / 1e6)
    }
    return currTimestamp
}
Salin selepas log masuk

Dalam pelaksanaan, kami menggunakan cap waktu UNIX untuk mewakili masa, tetapi sejak masa algoritma Snowflake menjana ID bermula pada 2017 , Kita perlu menolak nilai offset tetap (1483228800000) daripada cap masa.

  1. Mulakan objek Snowflake

Akhir sekali, kita perlu memulakan objek Snowflake dan nyatakan ID mesin. ID mesin mestilah integer antara 0 dan 1023, dan ID mesin yang berbeza dijamin berbeza.

func New(workerId int) *Snowflake {
    if workerId < 0 || workerId > workerIdMax {
        panic(fmt.Sprintf("Invalid worker ID, must be in [%d, %d]", 0, workerIdMax))
    }

    return &Snowflake{
        lastTimestamp: 0,
        workerId:      uint16(workerId),
        sequence:      0,
    }
}
Salin selepas log masuk

Dalam pelaksanaan di atas, kami menggunakan fungsi cap waktu dan pengendali binari di Golang untuk memastikan keunikan dan kesinambungan ID, dan nombor urutan tertib rendah memastikan aliran ID meningkat. Memandangkan cap masa adalah tepat pada tahap milisaat, algoritma Snowflake boleh menjana ID yang mencukupi untuk mengelakkan konflik ID dalam senario konkurensi tinggi.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan algoritma Snowflake di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan