web-dev-qa-db-ja.com

dynamodbの主キーIDに自動インクリメントを使用する方法

私はdynamodbが初めてです。 dynamodbでputitemを使用するときにid値を自動インクリメントしたい。

それは可能ですか?

48
pranay

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();
43
tier1

これは、DynamoDBのアンチパターンであり、多くのパーティション/シャード/サーバーに拡張するように構築されています。 DynamoDBは、スケーリングの制限により自動インクリメントのプライマリキーをサポートせず、複数のサーバー間で保証することはできません。

より良いオプションは、複数のインデックスから主キーを組み立てることです。主キーは最大2048バイトです。いくつかのオプションがあります:

  1. キーとしてUUIDを使用します-一意で、均等に分散され、時間値を保持する可能性のある時間ベースのUUID
  2. Ts << 12 + random_numberのように、ランダムに生成された数値またはタイムスタンプ+ランダム(おそらくビットシフト)を使用します
  3. 別のサービスまたはDynamoDB自体を使用して、増分の一意のIDを生成します(追加の呼び出しが必要です)

次のコードは、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"
34
vladaman