[node] DynamoDBでatomic counter[シーケンス]
Dynamoでシーケンスを使う
Oracleではシーケンスをつかって連番のidを発行することがよくあります。 DynamoDBではシーケンスの仕組みをデフォルトではもっていませんが、 少しコードを書くことでシーケンスのような機能を実現することができます。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.9.4
- node : v0.10.29
aws-sdkをnpmでインストールしておきましょう。
シーケンス発行関数を定義する
次のようにsequence関数を定義します。この関数ではシーケンス名とコールバックを受け取ります。 シーケンス名で連番を発行したあとその数値を保存し、発行したidをコールバックへ渡します。 ※シーケンス用テーブルは事前に作成しておいてください
AWS.config.update({ accessKeyId: <アクセスキー>, secretAccessKey: <シークレットキー>, region: <リージョン>}); var dyn = new AWS.DynamoDB(); function sequence(sequenceName,callback) { var params = { TableName: '<your sequence table name>', Key: {name:{S:sequenceName}}, AttributeUpdates:{ current_number:{ Action: 'ADD', Value:{N:"1"} } }, ReturnValues: 'UPDATED_NEW' }; dyn.updateItem(params, function(err, data){ var id; if (err) { console.log(err); // an error occurred } else { id = data.Attributes.current_number.N; } callback(id); }); }
あとはこの関数を、シーケンス発行したいタイミングで使用します。 同一のシーケンス名を複数回呼べば、カウンタが増えていくのがわかります。
sequence("somethingSeq",function(id){ console.log("sequence:" + id); });