■2009-09-18
* [Perl][近況] YAPC::Asia特別研修にいってきました
YAPC::Asia特別研修のDBIX::ClassとMySQLによるPerlアプリケーションのスケーリング術(講師:John Napiorkowskiさん)に参加しました。
午前中はDBIx::Class関連とスケーリング、パフォーマンス向上のための技術の紹介。まず最初にカードの山から特定のものを取り出す作業を通じて、一人より数人同時が、数人同時より予めindexした方が早いということを体験。→しかしその後の話には絡まない。
話は結構行きつ戻りつで、あまり体系だってはいなかったので、大雑把にまとめると:
DBICとかSQL関連
- DBICが吐くSQLは遅い件について→最近はかなり良くなってきている
- 複雑なjoinも可能。ドキュメント、tディレクトリ参照。
- DBIC_TRACE=1は友達。実行SQL全部吐かせる。さらに1=log_fileでファイルに出す。
- DBIx::Class::QueryLogも便利
- DBICのResultSetをうまく使いこなしてパフォーマンス向上
- ページング
- column指定による取得カラムの制限
- prefetch(データ不要ならjoin)
- HashRefInflatorで単純なhashrefを返す
- PKにauto_incrementだとスケーリングの際に問題になるかも→そういう時はUUID使う
レプリケーション
- 最近のDBICはレプリケーション機能のサポートが充実してきている
例:マスター・スレーブ間の許容遅延時間を設定できる。
(許容値を超えたらレプリケーションプールから取り除かれる) - マルチマスタはサポートしていない→誰かやらない?
ジョブキュー
- TheSchwartzとかGearmanとかQ4M
キャッシュ
- CatalystでESI(エッジサイドインクルード)
- カーソルキャッシュ(有効時間設定)
- 滅多に変わらないデータなら最初にourな変数に保存してしまう
さらにHashRefInflatorで、ただのハッシュレフにしておく
デバッグ、プロファイリング用
- DBIx::Class::QueryLog(Catalyst 5.8系ではtraitされる)
- MySQL::Sandboxで簡単にリプリケーション環境がつくれる
make_replication_sandbox /path/to/tarball...
- Test::DBIx::Class
mysqlかpostgresqlがあれば自動的にテストテーブルつくってくれる
レプリケーションサポートは未実装
午後から課題:
テーブル毎にチームに分かれてアプリをつくる。レプリケーション、ジョブキュー、キャッシュのうち、少なくともどれか一つの技術を使う。また、DBICのResultSetでの効率化の小技を使う。
自分のいたテーブル:
メンバー3人。お問い合わせフォームに入力すると一端DBに内容を保存時した上でジョブが発生し、Workerが管理者にメールを送信するアプリ。使ったものCatalyst、TheSchwartz、Email::Send。最初にTheSchwartzのdoc読んで使い方把握して、担当分けて作業。Funaki Taroさんとこのノートに集約。しかしうまくログインできないため、コードはgithubに置くことに。githubうまく使えなくてFunaki Taroさんに教えてもらう。時間足りなくなってきてFunakiさんガシガシコーディング。すみません、本当にお世話になりました。>Funakiさん
以上、スケーリングの話がメインになると期待していたのでちょっと拍子抜けで残念。Napiorkowskiさんに何か質問すればよかったのだろうけれど、後半作業で一杯いっぱいになって、そんなこと考えてる余裕がなかった……反省。この日の最大の収穫はgithubの使い方がわかったことです。
↑一部から奇異の目でみられた私のノート。これペアプログラミングができるんですよ。
反対側の人は心の目でディスプレイを見なければならないんですけど。
追記(2009-09-21):ziguzaguさんのレポート→YAPC::Asia 2009 特別研修 - DBIx::Class と MySQL による Perl アプリのスケーリング(おまえのログ)。細かくメモされていています。