masuidrive問題

2008-09-23 23:35追記

そういえばこのエントリはボトルネックがビュー(キャッシュ)の生成で、それが遅いせいでリクエストが詰まってしまう、ということを前提に書いてます。Railsはいまのところシングルスレッドでしか動作しないので、バランサの裏にAPサーバをn本立ててもn本の長寿なリクエストがきた場合、CPUやメモリに余裕があってもブロックされてしまいます。これが問題なのかな、と。
中島さんの方を読むとDBのCRUD(とくにCUD)がボトルネックになってるように見えるのですが、そっちだったらすみません。見当違いです。
追記ここまで。

masuidriveさんのWebでの非同期処理を考えてみるの件で、コメントにしようと思ったんですが、長くなったので自分の日記に。

ちょっと状況がわからないので外しているかもしれませんが(とセルフエクスキューズ)、DBの更新とキャッシュの生成をアトミックにやる必要はないんですよね?

問題は、次の三点に集約されそうですが、この認識であってます?

  • Feedの生成(重い)を同期的にやると他のリクエストをブロックしてしまう。
  • かといってDBの更新を非同期にするとバリデーションなどのユーザエクスペリエンス設計が大変になる。
  • 同期的にやりたいか、非同期でやるかというのがアクションごとに異なる。

これだと、DBの更新(含バリデーション)までを同期的にやって、一部のアクションのキャッシュの生成のみを非同期でやれば良さそうな感じですよね。非同期でキャッシュ生成するアプリ(以下キャッシュ生成君(仮名))を別に作って、Rails側からはそっちを叩いてすぐ戻るような構成にすればいけそうな気がしますがどうでしょう。というのがほぼ中島さんの案ですな。

Rails的な話だとFeedとかの全cacheはキャッシュ生成君にお任せとして、fragment cacheが問題になりそうな感じかな、とIRCで話しました。ただこれもfragment cacheのキーを合わせてmemcachedに突っ込めば別プロセスでも生成できそうな感じでは。fragment cacheする箇所をうまくpartialに切り出せればテンプレートも使い回せそうですし、いかがでしょう(partialにするオーバーヘッドはあるけどcacheが効けば元は取れたりしませんかね)。

別プロセスのキャッシュ生成君(仮名)はメモリが足りればRailsをもう1インスタンス立ち上げてAP4Rでもいいでしょうし(非同期処理まわりの煩雑さをお任せにする)、別に作り込むのもありかと思います。こっち側は基本的にはメインのDBに書いたりしないでしょうからDBをマスタ - スレーブ構成にしてスレーブ側から読み出すようにすればDBの負荷もあまり増えないかなぁ、と思います。

おまけ。masuidriveさんとのIRC会話。Thread.newしたときの挙動はAPサーバごとに違うらしい。

21:53 morohashi: そういえばRailsのアクションないでThreadを作ってjoinしないままアクションを終えるとどうなるかわかる人います? masuidrive問題を考えながらふと気になった。
21:53 morohashi: APサーバというか起動方法ごとに違うのかしら。
21:53 morohashi: 違いそうな気はする。
21:53 masuidrive: APサーバ毎に違うはず
21:53 morohashi: やっぱり
21:54 morohashi: コメントを書こうとしてたんですが、DBのCRUDまでは同期でやって
21:54 masuidrive: 前に考えて試したけど、それであきらめた記憶あり
21:54 morohashi: 必要なキャッシュの生成だけを非同期でやる、という作戦は
21:54 morohashi: どうでしょう。今目指しているものそのまんま?
21:55 masuidrive: それでも良いんだけど、fragment cacheの生成が非同期でできなくない?
21:56 morohashi: あー、fragmentはたしかに。feedだけじゃないんですね。
21:56 masuidrive: そうなのさー
21:56 morohashi: キーをまねてmemcacheに突っ込むとか > fragment
21:57 masuidrive: PhotoShareでは、非同期でerb生成して、erubisに食わせることで、fragmentの代わりにしてる
21:57 masuidrive: あと、XMLだとfragment cacheが出来ないとか。
21:58 morohashi: いやfragment cacheができない(=必要ない)分は別プロセスのキャッシュ生成君(仮)が頑張る、とか。
21:59 morohashi: あー、これは中島さんが言ってるのそのままか。
22:04 masuidrive: そう、そこをqueueにしてシリアルで処理するようにして。
22:10 masuidrive: そんなわけで、トラバかコメントお願いしますw
22:10 masuidrive: さて、朝6時なので寝ます。お休みなさぁーい
22:12 morohashi: なんと > 朝6時。おやすみなさい
2008-09-24 09:19

中島さんの漢字を間違えていたのを修正