Hatena::Groupcatalyst

dann@catalyst このページをアンテナに追加 RSSフィード

2008-03-29

サービスのスケールアウト

13:53 |  サービスのスケールアウト - dann@catalyst を含むブックマーク はてなブックマーク -  サービスのスケールアウト - dann@catalyst  サービスのスケールアウト - dann@catalyst のブックマークコメント

hidedenさんとかlyokatoさんに聞いたスケールアウトさせる際の話はBlogにはかかれてない話だからとてもためなったなぁ。こういうのは、なかなか飲み会とかじゃないと聞けないかもなぁ。

MVCでの分割とスケールアウト

14:00 |  MVCでの分割とスケールアウト - dann@catalyst を含むブックマーク はてなブックマーク -  MVCでの分割とスケールアウト - dann@catalyst  MVCでの分割とスケールアウト - dann@catalyst のブックマークコメント

LMVCとなっても、LとMが密に結合してしまうというのは、かなりありそう。LとMがCatalystから切り離されていれば、結構どうでもいいものかもしれないな。

get_multiを使った場合に綺麗にModelがかけないっていうのは、そうだろうなぁという気はするし綺麗にMを分割するのは難しいかもしれないとも思った。resultset返すのであれば、MとVはくっついちゃうし。後は、マスタースレーブ分割とクラスタリング時の処理。これも、LogicをModelから切り離すのは、実際無理だよなぁと。

これもサービス規模の程度問題なのだろうけど。まぁ、もう少し考えがまとまったら、なんかまとめておきたいな。

プロセス or リクエスト単位でのconnectionの共有

| 13:53 |  プロセス or リクエスト単位でのconnectionの共有 - dann@catalyst を含むブックマーク はてなブックマーク -  プロセス or リクエスト単位でのconnectionの共有 - dann@catalyst  プロセス or リクエスト単位でのconnectionの共有 - dann@catalyst のブックマークコメント

MySQLでconnectionをどれくらいの数まで張ってパフォーマンスが維持できるのかわからないけど、300程度なら全然パフォーマンス上も問題なく動くってことを聞いた。だから、プロセス単位でconnectionを保持しても結構なアクセスをさばけるらしい。

アプリケーションサーバー数が増えていったときに、プロセス数に応じてconnectionを維持する数が増加していくとボトルネックになるといっても、それは割に後の段階なのかもしれないなぁと思った。そういう段階では、リクエスト単位でDBのハンドラを保持することで、最大接続数を抑えられるのかもしれない。

connectionを張る単位

| 13:53 |  connectionを張る単位 - dann@catalyst を含むブックマーク はてなブックマーク -  connectionを張る単位 - dann@catalyst  connectionを張る単位 - dann@catalyst のブックマークコメント

request単位

  • Apacheのpnotesにいれておけばよいというところまで分かった。requestにローカルな変数を作れるのか。やっぱりあった!こないだ、Catalyst::Pluginでうんぬんっていうのは、考え方が間違いだった。

大体、以下のような感じでpnotesにつっこんどけばよさそうだ。

sub dbh {
  my $dbh = Apache->request()->pnotes('dbh');
  if (!$dbh) {
    $dbh = new_dbh();
    Apache->request()->pnotes('dbh', $dbh);
  }
  return $dbh;
}

プロセス単位

  • Apache::DBIと同様に起動時にdbhを保持しておくっていうのはあるのかもしれない

DBIx::Classのコード中では特にこのdbhの保持単位っていうのは、どこに書いてあるのかわからなかった。

リクエスト単位でDBのハンドらを保持する方法は?

| 13:53 |  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst を含むブックマーク はてなブックマーク -  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst  リクエスト単位でDBのハンドらを保持する方法は? - dann@catalyst のブックマークコメント

connect_info([ sub { DBI->connect(...) } ]);

DBIx::Class::Storage::DBIの_connectメソッド。connect_infoの一番目の引数がコードレファレンスの場合にはそれが実行されるみたいだから、ここでdbhの返しかたを変えれば、リクエスト単位、プロセス単位の切り替えはできるんじゃないかと思った。

sub _connect {
  (snip)
  eval {
    if(ref $info[0] eq 'CODE') {
       $dbh = &{$info[0]}
    }
    else {
       $dbh = DBI->connect(@info);
    }

以下のような感じで書けるってことらしい。connect_infoに渡すcode_ref中に、mod_perlだったらApacheのpnotesから取得するとかいうコードを書いとけばいいのかな。プロセス単位で保持する場合でもここでよさそう。

  # Connect via subref
  ->connect_info([ sub { DBI->connect(...) } ]);

  # Subref + DBIC-specific connection options
  ->connect_info(
    [
      sub { DBI->connect(...) },
      {
          quote_char => q{`},
          name_sep => q{@},
          on_connect_do => ['SET search_path TO myschema,otherschema,public'],
          disable_sth_caching => 1,
      },
    ]
  );

storageを設定するところのコードを後で読んでおけば、これで大体いけるんじゃないかなぁ。TODOリストに積む。

飲み会まとめ

06:12 |  飲み会まとめ - dann@catalyst を含むブックマーク はてなブックマーク -  飲み会まとめ - dann@catalyst  飲み会まとめ - dann@catalyst のブックマークコメント

始発で帰ったから、眠すぎて記憶が飛んでる... けど、楽しかったなぁ。こういうContextが共有された状況で限定された話を密にできるといいなと。

昼の部は、masakiさんとvkgtaroさんとCatalystでものづくり。Tipsも何点か教えてもらって、足りない部分とかがわかったのはよかったなぁ。こういうコード見ながらやるのは一番いいなと。

夜の部は、ZIGORuさんとlyokatoさんと殆ど話をしてた気がするなぁ。typesterさんとcharsbarさんとはあまり話せなかったから、次回CatalystConで。

  • REST APIapi/hoge.jsonのような形に対応するためにリクエストでの自動デシリアライズはやってないとか
    • ここはちょっと理解が足りないかも。けど、Catalyst::Action::RESTだとできない。
  • conten-typeによるViewの自動切り替え
  • FILTERSにフィルタを追加する
    • Template::Filters::LazyLoaderを読むといいよ
    • Template-ToolkitのPluginとか作ってUseしてたけど、Useだるーと思ってたけど、こんな方法で綺麗に追加できるのかと思った。
  • Debug環境でStatic::Simpleとかを読み込まないようにする
    • こういうのは作っとかなきゃなと思った。Starterにいれておくべきものだなと。
  • zigorouさんがServiceクラスのメソッドでTransactionの開始終了を行うモジュールを作っているとか!
    • ServiceのProxyクラスでServiceクラスにディスパッチしてるとか。Mooseじゃなくて、そういうほうほうでやるのもいいかもな。AUTOLOAD使ってディスパッチするんでもいいんだなと思った。
  • Validationをする場所
    • Controllerのアクション単位でValidationするとうまく共通化できずに、一箇所変更が入ると他の箇所に影響が波及しやすい。けど、ModelでやるのもFormとModelが1:1に対応してないとValidationをModelでやるのも難しいと。
  • Catalyst::Plugin::ConfigLoader使ってないとか。自前でCatalystに依存しないYAMLのLoader作ってる。
  • Active::RecordのMigrationは、みんなほしいと思ってる。

CatalystのInternalな話はある程度わかったけど、DBICのInternalな話は全然コード読んでないからさっぱりわからんかった。これは後でコード読まないとなぁ。

昼の部、夜の部参加の皆様お疲れ様でしたー!CatalystConも楽しみにしてま~す

# 今日の教訓は、電話番号は聞いておくことw

vkgtarovkgtaro2008/03/30 22:05おつでしたー。
そしてお邪魔しましたー。
奥様にもよろしくお伝えください。

danndann2008/03/30 23:57
おつでしたー。また遊びにきてくださーい。では。

トラックバック - http://catalyst.g.hatena.ne.jp/dann/20080329