Skip to content
This repository has been archived by the owner on Jun 19, 2023. It is now read-only.

kaelzhang/egg-snowflake

Repository files navigation

Build Status Coverage

Deprecation Warning

Since this library only works for cluster mode of egg which is not a best practice for the de facto container-based server-side solutions such as Kubernetes.

So I will archived this project and turn it into readonly mode.


egg-snowflake

Egg plugin to generate unique and increased twitter-snowflake uuid.

egg-snowflake will first assign a unique worker id to each worker by using the IPC messaging, and then create uuid according to the twitter snowflake algorithm.

Install

$ npm install egg-snowflake

Configurations

config/plugin.js

exports.snowflake = {
  enable: true,
  package: 'egg-snowflake'
}

config/config.default.js

// |--- timestamp ---|- machine -|- worker -|-- serial --|
// |----- 41 bit ----|---- 6 ----|--- 4 ----|---- 12 ----|
// |                 |           |          |            |
//  00000000000000000    000001      0000    000000000000

exports.snowflake = {
  client: {
    machineId: 1,
    // `Number` if 6-bit length (the default value),
    // we could handle servers from `2 ** 6` different machines.
    // And if 0, there will be no machine id in the uuid
    machineIdBitLength: 6,
    workerIdBitLength: 4,
    // Could handle max 4096 requests per millisecond
    serialIdBitLength: 12
  }
}

Then:

...
  async doSomething () {
    const {snowflake} = this.app

    const uuid = await snowflake.uuid()
    console.log(uuid)
    // '6352534847126241280'

    const workerId = await snowflake.index()
    console.log(workerId)
    // 0
  }
...

await snowflake.uuid()

Generates the unique and time-based id across workers (/ machines)

Returns String | Promise<String> instead of Number due to the bad accuracy of JavaScript.

The bit-length of the return value equals to:

41 + machineIdBitLength + workerIdBitLength + serialIdBitLength

So you could use the three configuration options to handle the length of uuids.

await snowflake.index()

Returns String | Promise<Number> the 0-index unique worker id of the current cluster.

License

MIT

About

Egg plugin to generate unique and increased twitter-snowflake uuid.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published