私はdynamodbが初めてです。 dynamodbでputitem
を使用するときにid値を自動インクリメントしたい。
それは可能ですか?
DynamoDBは、すぐにこれを提供しません。 UUIDなど、ほとんどのシステムで十分に一意である必要があるものをアプリケーションで生成できます。
Node.jsを使用していることに気付きました(タグを削除しました)。 UUID機能を提供するライブラリは次のとおりです。 node-uuid
READMEの例
var uuid = require('node-uuid');
var uuid1 = uuid.v1();
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]});
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]})
var uuid4 = uuid.v4();
var uuid5 = uuid.v4();
これは、DynamoDBのアンチパターンであり、多くのパーティション/シャード/サーバーに拡張するように構築されています。 DynamoDBは、スケーリングの制限により自動インクリメントのプライマリキーをサポートせず、複数のサーバー間で保証することはできません。
より良いオプションは、複数のインデックスから主キーを組み立てることです。主キーは最大2048バイトです。いくつかのオプションがあります:
次のコードは、DynamoDBでカウンターを自動インクリメントし、それを主キーとして使用できます。
var documentClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: 'sampletable',
Key: { HashKey : 'counters' },
UpdateExpression: 'ADD #a :x',
ExpressionAttributeNames: {'#a' : "counter_field"},
ExpressionAttributeValues: {':x' : 1},
ReturnValues: "UPDATED_NEW" // ensures you get value back
};
documentClient.update(params, function(err, data) {});
// once you get new value, use it as your primary key
私の個人的なお気に入りは、 http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram でInstagramのSharding ID生成に触発されたタイムスタンプ+ランダムを使用することです
次の関数は、特定のシャードのIDを生成します(パラメーターとして提供されます)。このようにして、タイムスタンプからシャード番号を組み立てた一意のキーを持つことができます。ランダム性(0〜512)。
var CUSTOMEPOCH = 1300000000000; // artificial Epoch
function generateRowId(shardId /* range 0-64 for shard/slot */) {
var ts = new Date().getTime() - CUSTOMEPOCH; // limit to recent
var randid = Math.floor(Math.random() * 512);
ts = (ts * 64); // bit-shift << 6
ts = ts + shardId;
return (ts * 512) + (randid % 512);
}
var newPrimaryHashKey = "obj_name:" + generateRowId(4);
// output is: "obj_name:8055517407349240"