Upload
karupanerura
View
1.815
Download
2
Embed Size (px)
Citation preview
The plan of Aniki 2.0id:karupanerura YAPC::Fukuoka 2017 HAKATA
おことわり
• AnikiというORMの2.0に向けたロードマップに関するトークです
• ORMやAnikiに関心が知識があると面白いとおもいます
• 今すぐ cpanm Aniki しましょう
• 裏は福岡のITの未来の話をやってます
だれ
• id:karupanerura (Twitter/Hatena/Github)
• Japan Perl Association / DeNA Co,.Ltd.
• Perl/XS/Go/Crystal/Swift/Java/etc..
• CPAN Author (PAUSE:KARUPA)
• Gotanda.pm / Mackerel UG Organizer
あじぇんだ
• Anikiとは
• Aniki 1.0まで
• Aniki 2.0から
• まとめ
Anikiとは
YAPC::Hokkaido 2016 Sapporo
https://speakerdeck.com/karupanerura/lai-rigaifalsearuorm-aniki-che-di-jie-shuo
Aniki採用企業
• 名前出していいのかわからないけど何社か導入してくれているところがあると聞いてます
• 弊社ではまだ使ってるところないらしい
• 自分のプロジェクトは自分が入ったときにはTengだった
Aniki 2.0
…の前に
おさらい
ORMにありがちな問題
• よくわからないクエリの発行
• N+1問題を作りがち
• (大量の行を取得したとき)重い
• 行Objectのライフサイクルが長くなりがち
• 複数DBと相性が悪い
つらい
酒のみたい
つらいけど問題と向き合う
よくわからないクエリの発行
• 大概、オブジェクトの操作に寄せすぎ
• プログラムとしてはキレイになる
• パフォーマンスを考慮したコードを書くにはORMの深い知識が必要になって基本的にハードルが高くて難しい
• 操作とその副作用のクエリが暗黙的
N+1問題を作りがち
• N+1問題を知らないひとはぐぐって!
• 大概ORMの機能の無理解や誤解から起きる
• 関連レコードをprefetchする機能を使うべき
• とはいえTengなどサポートの無いORMもある
• prefetchから何が起こるかイメージしにくい
(大量の行を取得したとき)重い
• 大量のオブジェクトの生成はしんどい
• 大量のメモリアロケーション
• プールにないことが多い
• 当たり前体操
• 1行づつfetchすればちょっとマシな場合も
行Objectのライフサイクル
• 長くなりがち
• なんで長くなりがちかってmutableだから
• setしてsetしてsaveとかやりがち
• 状態引き回すことになりがち
• ライフサイクル長いと状態が見えにくくなってバグ仕込みがち
複数DBとの相性が悪い
• そもそも複数DBが辛い
• シャーディングとかシャーディングとか…
• Slaveとのレプリ遅延も辛い
• トランザクションまたぎが辛い
• 大概、トランザクション管理の関係が問題でDBと一対一の関係にしているORMが多そう
Aniki 1.0
Aniki 1.0
• SQLに寄ったクエリ発行ベースのAPI
• N+1が起きてからprefetchを仕込めな設計
• 大量のデータは生データで扱え(suppress_*)
• 行オブジェクトがImmutable
• 複数Slaveには対応
解決しきれていない 問題がある
Aniki 2.0
コンセプト
• 「使いやすい」から「改善しやすい」へ
• ORMが持っている問題をもっと少なく
• もっと開発者が楽になれて
• DBの問題に対処しやすいように
• コードもわかりやすいように
新機能
• シャーディング/複数DB支援
• Lint機能
• Phantom Row Object
• Iteratorサポート
※構想です 気が変わって方針転換する可能性があります
シャーディング/複数DB支援
• クラスタ/シャード/スレーブ管理
• たぶん汎用的なモジュールとして切り出す
• schemaに対するDSLも提供したい
• DSL見ただけで系統やシャードの切り方が分かったら素敵では???
Lint機能
• N+1問題を検出
• prefetchするべきかどうかはエンジニアが判断するしかなかった→自動でやりたい
• 生SQLと行Objectの対応がまずったら警告
• 静的検査したいけどそこまではできないかも
Phantom Row Object
• MutableなRowの代わりの概念(idea)
• Rowから魂(Phantom)を抜き出す
• Phantomは実体を持たないので柔軟(?)
• Phantomには干渉はできても見えない
• Phantomをこねくり回してDBに反映!
Iteratorサポート
• DBD::mysqlでは基本的にレスポンスをすべてローカルにバッファする
• mysql_use_resultで制御
• もう少しわかりやすいAPIを提供したい
• メモリアロケーションが少なくなる工夫をしたい
まとめ
まとめ
• ORMはパーフェクトじゃない
• つらみはたくさん
• とはいえつらみと向き合って変えていくことが必要
• Aniki 1.0まででもある程度解消した
• Aniki 2.0ではもっとつらみを減らしたい
ざっつ おーる
えにーくえっしょん?
Q. いつ2.0だすの
A. 2018年前半には… (やる気しだい)
Q. 一番やる気ある機能は?
A. Lint作ってる
Anikiは開発者を 絶賛募集しております
あなたとAniki いますぐcontribute!
さんきゅーふぉありすにんぐ
ベストトークよろ