2009年2月25日水曜日

Thread化

今まで、1 process - 1 serviceという形で設計してきたのだが
やはり、Marketの数が増えてくると、serviceで分けなければならなくなり
Rubyのインスタンス数が増え、それごとに、30MB近くメモリが必要と
なるため、1 process - Many services on threads という
設計にした。
(当初このようにしていたのだが、途中で変更したが、元に戻す)

注意点 1: Thread周り

スレッドプールを自作して使っているのだが、
デーモン化した子プロセス内で
ちゃんとThreadを作ってあげないと、ダメ。
プロセスコピーするから、Threadもコピーされるからいいかと
思ってたんだけど違うのかな。ちゃんと勉強しよう。

注意点 2 : 設計に関して

listenするagentは、メッセージを受信したあと、
Threadでyield内が実行されるため
DBコネクションをきちんとお掃除してあげないと
残ってしまう。
処理するThread内で、
ActiveRecord::Base.clear_active_connections!を
読んであげると、DB connection poolに返し
再利用されるみたい。
connection.disconnect!をしてしまうと、再利用されないで
切られてしまう。次にまた新規のコネクションを開こうとするので
時間がかかる。

0 件のコメント:

コメントを投稿