BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース AmazonがDynamoDBのトランザクションサポートを発表

AmazonがDynamoDBのトランザクションサポートを発表

原文(投稿日:2018/12/03)へのリンク

Amazonは、同社のDynamoDB NoSQLデータベースサービスがTransactionsをサポートし、完全なACID(Atomicity、Consistency、Isolation、Durability)を提供することを発表した。この機能によって、複数項目の更新に対するトランザクションの保証を構築することが可能になり、高度にスケーラブルでビジネスクリティカルなアプリケーションを開発する際の競合やエラーの回避が容易になる。

AmazonのDynamoDBは、AWSで利用可能な、完全マネージドなキーバリューとドキュメントのデータベースで、“あらゆる規模の”NoSQLデータベースサービスを開発者に提供する。このデータベースサービスは、マイクロサービスやモバイルバックエンドの構築から、ゲームやIoT(Internet of Things)ソリューションの実装に至るまで、AWSユーザのさまざまなユースケースで使用されている。今回の発表でAmazonが目指しているのは、トランザクションのネイティブサポートを提供することによって、ひとつないし複数のテーブルを対象とした、複数のオール・オア・ナッシングオペレーションを必要とするロジックの構築作業を簡素化することだ。

Transactionsでは、トランザクションを処理する2つのDynamoDBオペレーションが新たに導入された。

  • TransactWriteItems: ひとつ以上のPutItemUpdateItemDeleteItemオペレーションからなる書き込みセットを含むバッチオペレーション。
  • TransactGetItems: ひとつ以上のGetItemからなる読み込みセットを含むバッチオペレーション。

各トランザクションには、条件を含めて最大10のユニークな項目あるいは4MBまでのデータを含むことができる。 Amazon DynamoDBを議論するhacker newsのスレッドでは、ある回答者が次のように述べていた

トランザクションあたり最大10項目というのは、かなり厳しい制限です!実行するすべてのトランザクションについて、この制限を満たすためのプランが必要でしょう。

DynamoDB Transactionsでは、さまざまな読み取りおよび書き込みオプションが提供されている。

  • 読み込みの3つのオプション — 結果整合性(eventual consistency)、厳密な整合性(strong consistency)、トランザクション
  • 書き込みの2つのオプション —  標準、トランザクション

Transactionのブログ記事では、Amazon Web ServicesエバンジェリストのDanilo Poccia氏が、アイテム獲得時のアトミックな単一トランザクションを実装するサンプルを紹介している。

  • 最初に、アイテムが提供可能で、プレーヤが必要なコインを持っていることをチェックする。
  • これらの条件が満たされれば、アイテムに提供不能とそのプレーヤによる所有のマークを付ける。
  • 獲得したアイテムが、プレーヤのインベントリリストに追加される。
data = await dynamoDb.transactWriteItems({
    TransactItems: [
        {
            Update: {
                TableName: 'items',
                Key: { id: { S: itemId } },
                ConditionExpression: 'available = :true',
                UpdateExpression: 'set available = :false, ' +
                    'ownedBy = :player',
                ExpressionAttributeValues: {
                    ':true': { BOOL: true },
                    ':false': { BOOL: false },
                    ':player': { S: playerId }
                }
            }
        },
        {
            Update: {
                TableName: 'players',
                Key: { id: { S: playerId } },
                ConditionExpression: 'coins >= :price',
                UpdateExpression: 'set coins = coins - :price, ' +
                    'inventory = list_append(inventory, :items)',
                ExpressionAttributeValues: {
                    ':items': { L: [{ S: itemId }] },
                    ':price': { N: itemPrice.toString() }
                }
            }
        }
    ]
}).promise();

同じ記事でPoccia氏は、トランザクションのサポートによって、DynamoDBのスケールやパフォーマンス、企業向けのメリットが、より広範なワークロードに提供されるようになるだろう、とも述べている。トランザクションを使うことで、多くのユースケースの実装が容易で高性能なものになる。例えば、

  • 金融取引の処理
  • 注文の履行と管理
  • マルチプレイヤゲームエンジンの構築
  • 分散コンポーネントと分散サービス間でのアクションの調定

binx.ioのクラウドコンサルタントであるDennis Vriend氏は、自身のブログ記事で次のように結論付けている。

ACIDを保証することで、2つ以上のリージョンテーブルの整合性を維持するためにDynamoDBを使用することが可能になります。DynamoDBを使った、新たなクラウドスケールのデータアーキテクチャへの道が開かれるのです。

このDynamoDB Transactionsは、すべてのコマーシャルリージョンを対象に、世界中で使用することができる。しかも、DynamoDBテーブルでトランザクションを有効にするための追加コストは発生しない — トランザクションで実施される読み込みと書き込みに対してのみ、ユーザは料金を払えばよいのだ。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

BT