by shigemk2

当面は技術的なことしか書かない

Ruby Client Library For DynamoDB メモ #fdev_shimane

fenrir.doorkeeper.jp

  • Ruby x AWS
  • Gem? 絶賛開発中
  • DynamoDB
  • DynamoDBを手軽に扱いたかったのでActiveRecord風にしたお話
    • そんなGemはもうあるんでないのかい?
    • Dynamoid
    • AWS SDK for Ruby V1(V2以降に対応していない)
    • DynamoDB Localのみ

github.com

ので、作ってみる。

  • ActiveRecord風なメソッドチェーンを使えるようにしたい
  • クラスメソッドチェーン(ActiveRecord風)ってどんななの

  • DynamoDB

  • Method Chain
  • AWSのNoSQLデータベースサービス

手軽で高速なデータアクセスが実現できる

  • 完全マネージド型サービス
  • 自動レプリケート
  • 自動ストレージスケーリング

高速

  • レイテンシー平均値10ミリ秒未満
  • スループットの予約
  • ダウンタイムなしでスループットの変更

DynamoDB

  • テーブル
  • 項目
  • 属性
  • 普通のKVSとは違う

AWS SDK For Ruby

  • DynamoDBをRubyで取り扱うときはこれをつかうことが多いかもしれないけど。
  • 実装長い

→ActiveRecordぽくできたらいいのだが

  • まずは検索だけでもActiveRecordぽくできたらいいんだが。
  • クラスにクエリをストックする?
  • クラスが汚染されているのはバグの温床
  • エラー時にお掃除しないと期待動作しないこともある

  • ActiveRecordぽく Relationクラスのインスタンスにクエリを保持したい

  • ActiveRecordを参考に書いてみる

考えるところ

  • クラスが評価されたとき
  • クエリを組み立てるとき(メソッドが呼ばれたとき)
  • クエリを実行するとき

クラスが評価されたとき

  • AR風にBaseクラスを表示
  • Relationクラスを作成してBookにキャッシュ
  • Baseクラスを継承すると、Model固有のRelationクラスをキャッシュ

クエリを組み立てるとき(メソッドが呼ばれたとき)

  • scanメソッドを呼び出す
  • scanオペレーションのdelegate
  • Relationのインスタンスを取得
  • Relationのインスタンス生成メソッド呼び出し
  • ARの場合第2引数はArel::Tableのインスタンス
  • 接続設定は別途configから取得
  • Model固有のRelation
  • optsは検索条件
  • spawnはcloneしているだけ
def spawn
  clone
end
  • 検索条件は引き継いでほかはresetなど。

  • BookのscanメソッドのレシーバをBook::DynamoDB_Relationインスタンスに委譲して、インスタンス内に検索条件をストック

  • Book.scan
  • Arrayで使われるようなメソッド
  • loadメソッドを実行
  • クエリを実行していなければクエリを実行

  • ActiveRecord風なものが作れる

絶賛開発中

  • Migration
  • 更新系
  • スループットの自動更新