dvomedia/cruftflake

CruftFlake - a stab at a version of Twitter Snowflake but in PHP with a simple ZeroMQ interface.

Installs: 1 065

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 3

Forks: 25

Type:application

1.0.0 2013-03-20 19:33 UTC

This package is not auto-updated.

Last update: 2024-04-24 10:04:01 UTC


README

A stab at a version of Twitter Snowflake but in PHP with a simple ZeroMQ interface (rather than Thrift).

Implementation

This project was motivated by personal curiosity and also my inability to get Twitter's project to build.

The implementation copies Twitter - generating 64 bit IDs.

  • time - 41 bits
  • configured machine ID - 10 bits
  • sequence number - 12 bits

Has a custom epoch that means it can generate IDs until 2081-09-06 (not the same epoch as Snowflake).

ZooKeeper for config coordination

We use ZooKeeper to store which machine IDs are in use. When a new node starts up for the first time it must be able to contact the ZooKeeper cluster and create a new node. It will look at all the existing nodes and then (if it can't find its own Mac Address) attempt to claim a free one.

I was using Ephemeral nodes for this - similar(ish) to a lock pattern but this had the issue that the node needed to remain connected to ZK throughout its lifetime -- this way it doesn't.

The downside is that potentially the 1024 possible machine IDs will "fill up" and need to be manually pruned.

Running

Installation via composer:

{
	"minimum-stability": "dev",
	"require": {
        "posmena/cruftflake": "*"
	}
}

You should run the tests to verify things are OK:

./vendor/bin/phpunit vendor/posmena/cruftflake/test/

There are two scripts provided for playing about with.

  1. The generator (the server)

    ./scripts/cruftflake.php

  2. A client that will generate N IDs and dump to STDOUT

    ./scripts/client.php -n 100

Dependencies*

  • ZeroMQ
  • ZooKeeper

*sadly these cannot be added to composer just yet!