SimpleResource

  • 2,365 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,365
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
5
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. WebアプリのDBスキーマレス化がRubyにぴったりな件
    RubyKansai #37
    松本一輝
    Lang-8,Inc.
  • 2. 自己紹介
  • 本日の話題
    • Webアプリ開発時の問題点
    • 4. SimpleResource
  • ※独断と偏見による
    • DBスキーマ拡張の手間
    • 5. キャッシュ機構の複雑さ
    Webアプリ開発時の2つの問題点
  • 6. DBスキーマ拡張の手間 (一例:blogアプリ)
    Entryモデル
    Commentモデル
    Commentモデル
  • 7. Commentに写真が張れる
    Commentモデル
    Commentモデル
    CommentPic
    モデルを導入
  • 8. has_many
    has_many
  • 9. Entry一覧ページに写真枚数カウンタを追加するには?
    Entryモデル
    5枚
    Entryモデル
    2枚
    Entryモデル
    3枚
  • 10. ダメな例その1 : ナイーブ
    Comment.find_all_by_entry_id.map{|c|
    CommentPic.find_all_by_comment_id(c.id).size
    }.sum
    -> SQLクエリが、Entry1つにつきコメントの数だけ
    生じる。非効率。
  • 11. (個人的には)ダメな例その2 : SQLJOIN
    SELECT COUNT(*) FROM comment_pics
    LEFT JOIN comments
    ON comment_pics.comment_id = comments.id
    LEFT JOIN entries
    ON comment.entry_id = entries.id
    WHERE entries.id = entry_id
    -> クエリが遅い。
    entries、comments、comment_pics各テーブルが
    すべて同一DB上にあることが前提。
    スケールがめんどくさそう。
  • 12. 一般的手法1:DBスキーマの非正規化
    entriesテーブルに、写真カウンタフィールドを追加。
    has_many
    has_many
  • 13. 一般的手法2:KVSによる
    オブジェクトキャッシュ
    App Server
    Read
    Write
    Write
    DB Server
    Memcached Server
  • 14. 問題点
    • DBスキーマの変更は高コスト
    • 15. 複雑なキャッシュ機構
    • 16. 効率の悪いキャッシュ生成
    • 17. R/W比が低いアプリケーションについては効果薄(例:SNS)
  • もっとシンプルに
  • 18. SimpleResource
  • 19. SimpleResource?
    • スキーマレス
    • 20. JSONシリアライズ保存
    • 21. ActiveRecord風インターフェース
    • 22. バックエンドは任意のKVSDB (現在MySQLのみ対応)
    • 23. 透過的にMemcachedによりキャッシュ
    なDBインターフェースライブラリ
  • 24. 使用例 –blogアプリ
    has_many
    has_many
    {
    “id” => 12763,
    “body” => “Hello, world!”,
    “comments” => [ {“id”=>735634, “body” => “comment1”, “pics” => [“pic1.jpg”]},
    {“id” => 735635, “body” => “comment2”} ]
    }
    スキーマレス化
  • 25. class Entry < SimpleResource::Base
    include SimpleResource::MysqlEntityBackend
    end
    entry = Entry.create("subject" => "test",
    "body" => "hello world!",
    "author" => "kazuki")
    entry.id #=> 54
    (create時にidを指定しなかった場合は、自動採番される)
  • 26. Entryへのコメントの追加
    comment = {"body" => "nice1!",
    "from" => "kazuko",
    "pics" => ["pic1.jpg", "pic2.jpg"]}
    entry = Entry.find(12763)
    entry.comments ||= []
    entry.comments << comment
    entry.save
    ダメな例
  • 27. プロセス1
    プロセス2
    entry = Entry.find(12763)
    entry.comments ||= []
    entry.comments << “foo”
    entry.save


    entry = Entry.find(12763)
    entry.comments ||= []
    entry.comments << “bar”
    entry.save


    プロセス1の書き込みが
    破壊される
  • 28. Entryへのコメントの追加
    comment = {"body" => "nice1!",
    "from" => "kazuko",
    "pics" => ["pic1.jpg", "pic2.jpg"]}
    Entry.find_with_lock(12763) do |entry|
    entry.comments ||= []
    entry.comments << comment
    entry.save
    end
  • 29. プロセス1
    プロセス2
    Entry.find_with_lock(12763) do |entry|
    entry.comments ||= []
    entry.comments << comment
    entry.save
    end
    Entry.find_with_lock(12763) do |entry|
    entry.comments ||= []
    entry.comments << comment
    entry.save
    end
  • 30. SimpleResourceの主なメソッド
     ※Lockを取得しなくてもReadできる。Lockの利用は紳士協定。
     ※30秒で強制アンロック
  • 36. インデックス機能
    •  全Entry( 100万件~ )を時系列で並べたページを作りたい。
  • class RubyKansaiEntry < SimpleResource::Base
    include SimpleResource::MysqlEntityBackend
    include SimpleResource::MysqlIndexBackend
    end
    entry = Entry.create("subject" => "test",
    "body" => "hello world!")
    entry.add_to_index("latest_entries", Time.now.to_i)
    @comments, @pager = Entry.paginate("latest_entries“,
    :page => 1,
    :page_size => 10)
  • 37. まとめ
    • スキーマレスはありかも
    • 38. ロックを意識する必要がでてきた
    • 39. まるでDOMツリー操作
    • 40. Rubyが得意とする領域
     (強力な基本クラス、高い可読性)
  • 41. ご清聴ありがとうございました!
    GitHub:
    http://github.com/kazuki-m/SimpleResource/tree/master