GAE allocatedID の仕様について

GAEのallocatedIDを利用した場合に払い出されるIDの仕様と、タブレットサーバ分割の話題。
2
Ikeda Daigo @hogedigo

allocateIdsって負の値にはなることあるのかな? #gaeja

2013-02-03 09:06:15
Ikeda Daigo @hogedigo

allocateIdsって、その後entityをputしなくても、未来永劫重複で払い出されない保証あるのかしら? #gaeja

2013-02-03 09:11:51
しんめたる @sinmetal

@hogedigo 再利用されることは無いって話だったような・・・。基本的に使う気がないので、あまり真面目に考えたことがないですが^^; #gaeja

2013-02-03 17:23:49
Ikeda Daigo @hogedigo

@sinmetal Oracleのsequenceぽい使い方を考えてたんだけど・・・。大丈夫とは思うけど、仕様で明記されていないと怖いな。 #gaeja

2013-02-03 17:36:29
しんめたる @sinmetal

@hogedigo 連番であることが保証されていないのと、タブレットサーバが被りまくるなので、あんまり良いものではない気がしますが、タイムスタンプとかじゃダメな感じのやつですか? #gaeja

2013-02-03 17:42:15
Ikeda Daigo @hogedigo

@sinmetal 連番である必要はないです。むしろあるkindのキーをできるだけ分散させたくて、それの元になる値を別のkind名でallocateIdしようとしてるのです。ちなみにallocateIdするだけでもタブレット分割とか起きるのかな #gaeja

2013-02-03 18:00:57
Ikeda Daigo @hogedigo

@sinmetal タイムスタンプでもいい気がしてきた。。重複チェック必要ですね #gaeja

2013-02-03 18:02:49
しんめたる @sinmetal

@hogedigo 実際にputはしないけど、Kindだけ指定してallocateIdすれば、ユニークな値が取れるぜ!という使い方ができるか?ということですか。なんか、いけそうな気はしますねw確信はないですがw #gaeja

2013-02-03 18:05:24
しんめたる @sinmetal

@hogedigo allocateIdした時点で、タブレット分割が発生するのかは存じ上げませんね・・・。ユニークにしないといけないし、Keyそのものはあんまり分割とかしてないんじゃないかなという理由から、"分割されない"ような気はしますが・・・ #gaeja

2013-02-03 18:16:48
Ikeda Daigo @hogedigo

@sinmetal まあタブレットについてはそんなにナーバスになることもないかなと思っていますが、重複採番は怖い。。とりあえず大丈夫なものと信じて先に進みます(^^; #gaeja

2013-02-03 18:37:28
しんめたる @sinmetal

@hogedigo 事故ったら、是非教えてくだ、ゴホッゴホッ #gaeja

2013-02-03 18:43:04
Ikeda Daigo @hogedigo

@sinmetal 事故ったときに対処するのは自分じゃないかもしれな・・ゲフンゲフン #gaeja

2013-02-03 18:50:23
あおうさ @bluerabbit777jp

@sinmetal @hogedigo #gaeja でallocateIdでタブレット分割の件は私の理解はちょっと違います。まずKeyは昇順でソートされてputされます。その際にKeyがaa,ab,acだと同一のタブレットサーバに更新がかかる可能性が高まります。

2013-02-06 08:16:09
あおうさ @bluerabbit777jp

@sinmetal @hogedigo #gaeja Keyが離れている場合は複数のタブレットサーバに更新がかかりそれは並列で実行されます。Keyが近いと並列にならず遅くなります。現在のallocateIdはこの問題を考慮した実装になっていないため、近いKeyIdが発行されます

2013-02-06 08:19:09
あおうさ @bluerabbit777jp

@sinmetal @hogedigo #gaeja GoogleはallocateIdの問題を認識しており、近いKeyが発行されないように対応中です。もし、一度に大量のputがある場合はこの問題があるので、自前でkeynameを採番してKeyが分散されるようにする必要があります

2013-02-06 08:22:40
あおうさ @bluerabbit777jp

@sinmetal @hogedigo #gaeja allocateIdはユニークな値が発行されるかはKind内でユニークな値が発行されるはずです。値をputせずに保持していても大丈夫です。ただ、明文化されているものは見たことが無いので確証はありませんが問題を聞いた事は無いです

2013-02-06 08:26:28
あおうさ @bluerabbit777jp

タブレットサーバの件は並列うんぬんよりも、単純にタブレットサーバの負荷(put, key sort)が問題であって並列うんぬんは微々たるものかも。 #gaeja

2013-02-06 08:41:21
a-know | Daisuke Inoue @a_know

64ビットの非負整数、みたいですよ RT @hogedigo: allocateIdsって負の値にはなることあるのかな? #gaeja

2013-02-06 08:52:49
Ikeda Daigo @hogedigo

@bluerabbit777jp @sinmetal ありがとうございましたm(_ _)m その後関係者に質問する機会がありまして、entityはputしなくても大丈夫だと回答頂きました。とりあえず安心しました。#gaeja

2013-02-06 09:32:33
najeira @najeira

#gaeja でIDの話があったので。AllocateIDで払い出されるIDはKind内でユニーク。再利用はない。数値は大きくなっていくが連番とは限らない。

2013-02-06 10:35:11
najeira @najeira

#gaeja AppEngineでの近いKeyでのPutとタブレット分割の話は、Ikaiさんのブログが分かりやすいかな。 http://t.co/S3uT9iLP

2013-02-06 10:45:13
a-know | Daisuke Inoue @a_know

小さくなる(間の値が用いられる)とかはないですかね〜? RT @najeira: #gaeja でIDの話があったので。AllocateIDで払い出されるIDはKind内でユニーク。再利用はない。数値は大きくなっていくが連番とは限らない。

2013-02-06 12:53:31
najeira @najeira

@a_know 小さくなる可能性はあると思います

2013-02-06 12:57:01