- Ruby x AWS
- Gem? 絶賛開発中
- DynamoDB
- DynamoDBを手軽に扱いたかったのでActiveRecord風にしたお話
- そんなGemはもうあるんでないのかい?
- Dynamoid
- AWS SDK for Ruby V1(V2以降に対応していない)
- DynamoDB Localのみ
ので、作ってみる。
- 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
- 更新系
- スループットの自動更新