Amazon DynamoDB

DynamoDBはフルマネージドなNoSQLデータベースを提供してくれるAWSを代表するサービスのひとつ。DynamoDBはAWSによるKey Value Store(以下KVS)の実装であり、純粋なサーバーレスのサービスなので、Lambdaなどのサーバーレスサービスとの相性が非常に良い。また、NoSQLらしく非常に高速で、好きな形でのデータ挿入や取り出しなどが可能なので使い勝手が良い。テーブルの操作は全てAWSが提供するREST APIから行い、操作は全てアトミック操作として処理されるため、処理途中の状態を観測することは出来ない。

ただし、KVSはRDBのように利用すると非常に非効率になり動作も遅くなるため、効率良く利用しようと思うのならばまずKVSを知るべきである。

ユースケース

例えば、DynamoDBは次のようなケースで利用される。

  • サーバーレスアプリのバックエンド
  • ユーザー情報を格納
  • 広告やゲームなどのユーザーの行動を履歴に残す
  • KVSとしての利用、リクエストしたキーに対するデータを高速に取得
  • RDSを利用する予定だが、テーブルのスキーマが明確に定まっていない場合
  • 今後も頻繁にカラムが追加される可能性があるテーブル
  • データプールとしての一時利用
  • ログの一時的な保存
  • バッチ処理のロック管理
  • ストレージのインデックス

逆に、次のような場合にDynamoDBを利用するのはあまり相応しくない。しかし、利用が小規模であるならば、DynamoDBでの運用も十分に考えられる。規模やコストと相談し、DynamoDBで済ませられるものか、RDBを利用しておくべきなのかを検討する。

  • ログの永続的な保存
  • 保存したデータを集計・解析

DynamoDBは広い範囲で利用される。特にサーバーレスアプリケーションを作成する場合、手軽に利用できてLambdaとの相性も良いDynamoDBはどんなデータでも保存できる究極のデータベースだ。利用するだけで開発が加速することは間違いない。読み書きが高速であるためリアルタイム処理周りでも広く利用されていて、最近では IoT 実装でのリアルタイムデータを処理するあたりでも良く利用される。

このユースケースに限らず、開発における殆どの場合で、初期の段階にDynamoDBを利用するのは良い手だと自分は考えている。柔軟なDynamoDBを利用することで煩わしいスキーマ仕様策定などから開放され、テストや実装に集中できるからだ。(DynamoDBをRDBに置き換えるなどに大変なコストを要する場合、置き換えでバグを生み出してしまいそうな場合は初めからRDBを利用しておいたほうが良いだろう。)

DynamoDB or RDB

実際にアプリを開発するのであれば、DynamoDBを使うべきか、RDBを使うべきかという問題は多少なりとも付きまとう。自分がDynamoDBを採用しようとおもう基準を大まかにあげると、次の5つになった。

  • 集まったデータに対し、決まった列(レンジキー)のみで範囲取得に対応できる場合
  • 運用において集計を行うことはなく、ユーザーの情報など、キーに対応するデータのみを抜き出したい場合(また、将来的に列が追加される可能性がある場合)
  • データの一時的な保管場所として利用し、後にオブジェクトとしてS3などに保存するデータを貯めたい場合
  • コストを考えてDynamoDBでRDB的な運用を行う時に、RDBと比較して利用者にストレスを与えない程度の性能差である場合
  • 大量のデータを集計する予定が無い場合

この場合に必ずDynamoDBを使わないといけない、または必ずRDBを使わないといけないといった制約は存在しないので、現実はコストやパフォーマンスとの相談となる。どのデータベースサービスを使うかは近い未来を見越した選択であるべきだが、あまり遠い未来を見越してもコストが肥大化するだけなので、程々にしておいたほうが良い。

results matching ""

    No results matching ""