36
The plan of Aniki 2.0 id:karupanerura YAPC::Fukuoka 2017 HAKATA

The plan of Aniki 2.0

Embed Size (px)

Citation preview

Page 1: The plan of Aniki 2.0

The plan of Aniki 2.0id:karupanerura YAPC::Fukuoka 2017 HAKATA

Page 2: The plan of Aniki 2.0

おことわり

• AnikiというORMの2.0に向けたロードマップに関するトークです

• ORMやAnikiに関心が知識があると面白いとおもいます

• 今すぐ cpanm Aniki しましょう

• 裏は福岡のITの未来の話をやってます

Page 3: The plan of Aniki 2.0

だれ

• 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

Page 4: The plan of Aniki 2.0

あじぇんだ

• Anikiとは

• Aniki 1.0まで

• Aniki 2.0から

• まとめ

Page 5: The plan of Aniki 2.0

Anikiとは

YAPC::Hokkaido 2016 Sapporo

https://speakerdeck.com/karupanerura/lai-rigaifalsearuorm-aniki-che-di-jie-shuo

Page 6: The plan of Aniki 2.0

Aniki採用企業

• 名前出していいのかわからないけど何社か導入してくれているところがあると聞いてます

• 弊社ではまだ使ってるところないらしい

• 自分のプロジェクトは自分が入ったときにはTengだった

Page 7: The plan of Aniki 2.0

Aniki 2.0

Page 8: The plan of Aniki 2.0

…の前に

おさらい

Page 9: The plan of Aniki 2.0

ORMにありがちな問題

• よくわからないクエリの発行

• N+1問題を作りがち

• (大量の行を取得したとき)重い

• 行Objectのライフサイクルが長くなりがち

• 複数DBと相性が悪い

Page 10: The plan of Aniki 2.0

つらい

酒のみたい

Page 11: The plan of Aniki 2.0

つらいけど問題と向き合う

Page 12: The plan of Aniki 2.0

よくわからないクエリの発行

• 大概、オブジェクトの操作に寄せすぎ

• プログラムとしてはキレイになる

• パフォーマンスを考慮したコードを書くにはORMの深い知識が必要になって基本的にハードルが高くて難しい

• 操作とその副作用のクエリが暗黙的

Page 13: The plan of Aniki 2.0

N+1問題を作りがち

• N+1問題を知らないひとはぐぐって!

• 大概ORMの機能の無理解や誤解から起きる

• 関連レコードをprefetchする機能を使うべき

• とはいえTengなどサポートの無いORMもある

• prefetchから何が起こるかイメージしにくい

Page 14: The plan of Aniki 2.0

(大量の行を取得したとき)重い

• 大量のオブジェクトの生成はしんどい

• 大量のメモリアロケーション

• プールにないことが多い

• 当たり前体操

• 1行づつfetchすればちょっとマシな場合も

Page 15: The plan of Aniki 2.0

行Objectのライフサイクル

• 長くなりがち

• なんで長くなりがちかってmutableだから

• setしてsetしてsaveとかやりがち

• 状態引き回すことになりがち

• ライフサイクル長いと状態が見えにくくなってバグ仕込みがち

Page 16: The plan of Aniki 2.0

複数DBとの相性が悪い

• そもそも複数DBが辛い

• シャーディングとかシャーディングとか…

• Slaveとのレプリ遅延も辛い

• トランザクションまたぎが辛い

• 大概、トランザクション管理の関係が問題でDBと一対一の関係にしているORMが多そう

Page 17: The plan of Aniki 2.0

Aniki 1.0

Page 18: The plan of Aniki 2.0

Aniki 1.0

• SQLに寄ったクエリ発行ベースのAPI

• N+1が起きてからprefetchを仕込めな設計

• 大量のデータは生データで扱え(suppress_*)

• 行オブジェクトがImmutable

• 複数Slaveには対応

Page 19: The plan of Aniki 2.0

解決しきれていない 問題がある

Page 20: The plan of Aniki 2.0

Aniki 2.0

Page 21: The plan of Aniki 2.0

コンセプト

• 「使いやすい」から「改善しやすい」へ

• ORMが持っている問題をもっと少なく

• もっと開発者が楽になれて

• DBの問題に対処しやすいように

• コードもわかりやすいように

Page 22: The plan of Aniki 2.0

新機能

• シャーディング/複数DB支援

• Lint機能

• Phantom Row Object

• Iteratorサポート

Page 23: The plan of Aniki 2.0

※構想です 気が変わって方針転換する可能性があります

Page 24: The plan of Aniki 2.0

シャーディング/複数DB支援

• クラスタ/シャード/スレーブ管理

• たぶん汎用的なモジュールとして切り出す

• schemaに対するDSLも提供したい

• DSL見ただけで系統やシャードの切り方が分かったら素敵では???

Page 25: The plan of Aniki 2.0

Lint機能

• N+1問題を検出

• prefetchするべきかどうかはエンジニアが判断するしかなかった→自動でやりたい

• 生SQLと行Objectの対応がまずったら警告

• 静的検査したいけどそこまではできないかも

Page 26: The plan of Aniki 2.0

Phantom Row Object

• MutableなRowの代わりの概念(idea)

• Rowから魂(Phantom)を抜き出す

• Phantomは実体を持たないので柔軟(?)

• Phantomには干渉はできても見えない

• Phantomをこねくり回してDBに反映!

Page 27: The plan of Aniki 2.0

Iteratorサポート

• DBD::mysqlでは基本的にレスポンスをすべてローカルにバッファする

• mysql_use_resultで制御

• もう少しわかりやすいAPIを提供したい

• メモリアロケーションが少なくなる工夫をしたい

Page 28: The plan of Aniki 2.0

まとめ

Page 29: The plan of Aniki 2.0

まとめ

• ORMはパーフェクトじゃない

• つらみはたくさん

• とはいえつらみと向き合って変えていくことが必要

• Aniki 1.0まででもある程度解消した

• Aniki 2.0ではもっとつらみを減らしたい

Page 30: The plan of Aniki 2.0

ざっつ おーる

Page 31: The plan of Aniki 2.0

えにーくえっしょん?

Page 32: The plan of Aniki 2.0

Q. いつ2.0だすの

A. 2018年前半には… (やる気しだい)

Page 33: The plan of Aniki 2.0

Q. 一番やる気ある機能は?

A. Lint作ってる

Page 34: The plan of Aniki 2.0

Anikiは開発者を 絶賛募集しております

Page 35: The plan of Aniki 2.0

あなたとAniki いますぐcontribute!

Page 36: The plan of Aniki 2.0

さんきゅーふぉありすにんぐ

ベストトークよろ