2012-01-12

snowflakeの実際

人によっては今更だけれど某/.の記事で知ったので、ちょいと調べてみた。

コード

https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L22

https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L89

このあたりの定数と式がコアな部分かな。

計算機

53bit超えの精度で計算出来ない事が意外と多い。google計算してくれなかったりするのでWolfram|Alphaを使う。

サンプル

同じ人のもの、別の人のもの、別の地域もの、を集めてみた。

twitter.com/#!/quolc/status/156410708081377280
twitter.com/#!/quolc/status/156409454324232194
twitter.com/#!/quolc/status/156407150216884224
twitter.com/#!/quolc/status/155965255229509632
twitter.com/#!/quolc/status/155964655032991744
twitter.com/#!/quolc/status/155964103226167296
twitter.com/#!/quolc/status/155953308895412224
twitter.com/#!/t_n_tommy/status/157348397970493440
twitter.com/#!/t_n_tommy/status/157133936789692416
twitter.com/#!/t_n_tommy/status/157132545325142016
twitter.com/#!/SoVeryAwkward/status/157247986714423296
twitter.com/#!/SoVeryAwkward/status/157232924117315586
twitter.com/#!/SoVeryAwkward/status/157215634772594690
twitter.com/#!/ddlovato/status/157314029247938560
twitter.com/#!/ddlovato/status/157308852327563264
twitter.com/#!/ddlovato/status/157274729412165632

結果

結果はめんどいので貼らない。最初のだけURL貼っておく。

sequence

http://www.wolframalpha.com/input/?i=156410708081377280+%25+%28+2+%5E+12+%29

いくつか2だが、あとは0。探すと奇数のもあって1だったりするから、1がないのはたまたまかな?

sequenceのカウンタ部分は以下だが、これが回ることがあるのはさすがtwitter

https://github.com/twitter/snowflake/blob/master/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L71

workerId

http://www.wolframalpha.com/input/?i=%28+156410708081377280+%3E%3E12+%29%25%28+2+%5E+5+%29

若干動く感じ。概ね0-4かな?

datacenterId

http://www.wolframalpha.com/input/?i=%28+156410708081377280+%3E%3E17+%29%25%28+2+%5E+5+%29

これは全部1。地域差があるのかと思ったけど同じだった。

バルス

あとtogetterから例のバルスを回収してみた。

twitter.com/#!/koizuka/status/145146329490927622
twitter.com/#!/musuka__bot/status/145146343462154244
twitter.com/#!/Royal_Host/status/145146355013267458
twitter.com/#!/SNOOPYbot/status/145146357689225220

sequenceはさすがに回り気味だが、意外にもworkerId、datacenterIdは相変わらずっぽい。

まあ、25千tpsらしいので、キューで均されてsequence*workerが5*5くらいあれば回せるという事なのかな?

日時

ちなみに日時の計算はこんな感じ。確かにその通り。

http://www.wolframalpha.com/input/?i=DateList%5BInt%28%28%28+156410708081377280+%3E%3E22%29%2B1288834974657%29%2F1000%29%2BAbsoluteTime%5B%7B1970%2C1%2C1%2C9%7D%5D%5D

まとめ

日時はソース通り、datacenterIdは1、workerIdは0-4、sequenceは、平時なら概ね0、回っても2まで。

今の所それが自然っぽい。

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん