[node] DynamoDBでatomic counter[シーケンス]

2014.11.26

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);
});