今天不知道在幹嘛
不適應,腦袋空白...
整理一下目前的狀況好了...
原本都是用 app-deploy 的 rack cluster,
rails 用 thin 的 rails adapter,
因為 rails 2.2.2 好像沒有 rack adapter 可以用。
image server 則很順利地用 rack cluster 跑起來,
model 則用 datamapper.
後來的兩個 daemon, 一個 cron, 一個 sync,
都用 app-deploy 的 daemon cluster,
model 也是用 datamapper.
後來 web/img server 改用 passenger on nginx,
所以 rack cluster 的部份可以拆掉了,
變成由 passenger 同時管理兩個 application,
一個是 rails 的 application, 另一個則是 rack 的 application.
其實我是想要兩個都用 rack, 不過算了,rails 2.2.2 看起來還有問題,
而我上次切成 2.3.2, 跑起來會有錯誤,暫時還沒空細看是什麼問題...
所以就又切回 2.2.2 了。而 passenger 針對 rails 似乎有調整,
因此就讓他跑 rails 模式應該沒關係... 至少 spawn 的部份,
他可能有先 load 一份 rails 去 fork, start-up 會快一點。
(雖然我覺得對於忙碌的 server, 根本就是多餘的?)
也就是說,app-deploy 中 rack cluster 被 passenger 取代了。
剩下還有在運作的是 daemon cluster, 跑 sync, cron, 和新的 resizer.
名字亂取的,本來想取好聽一點,不過又怕太難懂,乾脆就淺白一點。
sync 本身是跑 multi-threaded, 不同 task 用一個 thread 去 sleep.
我知道是笨方法... 暫時先這樣,有機會再看看能否換成 timer 之類的。
而 traversal 整個 data set, 之前有寫成 multi-threaded 的方式,
不過擔心有些東西沒有 thread-safe, 以後再看看這部份會不會太慢,
要不要換成 fork 的方式?之前有試過一些 lib 可以幫你把 data set 切開,
分成好幾個 process 去跑。
但這部份應該還需要調整,因為不可能整個 data set 讀進記憶體。
應該分成獨立的 process 各自讀取自己的資料。
cron 的部份就很單純,sleep 0.1 等 job 進去。
現在是用 database 的方式,未來要改成 queue, 但應該要 reliable 的 queue.
目前用的 kestrel 似乎不是保證 reliable 的?這點還要再看看。
resizer 的 model 當然也是用 datamapper, 只有 rails 才用 AR,
其他我一律用 datamapper... AR 奇怪的問題,繼承自 rails 的特性 XD
之前是有個 instance variable, 如果有相應名稱的 instance method,
似乎就會出現奇怪的問題。為了避開這個問題,就暫時不 cache 那個資料了。
AR 的魔術太多,最好少跟他內部打交道,能避開就避開...
效能碰上問題時,再看看 DM 發展得如何了 @@
resizer 的部份不需要讀取 db, 雖然有些資料在 db 裡,
只好抽出來存到 queue 和用 rmagick 判斷 format 資訊。
原本的 eager thumbnails 全部拿掉,改成 lazy eager thumbnails.
eager 表示在 request 中直接做,lazy 表示 access 時才做。
lazy eager 則對 resizer 來說是優先處理,lazy thumbnails 則最後處理。
先從 lazy eager 中撈 job, 撈不到才去 lazy 中撈,但只撈一筆。
處理完之後,繼續回到 lazy eager 中撈。
這樣確保 lazy eager 一定先處理完,讓 lazy job 堆到滿出來都無所謂。
不過目前演算法好像還不是完全這樣... anyway, 無妨先跑跑看。
然後又是很笨的 sleep 0.2... 還有 thumbo 目前還是怪怪的,
只是暫時都沒碰到什麼問題,所以也就懶得想怎麼改善了。
也許需要用到其他 project 才可以看出他有多麼彆腳吧 @@
loop{
# resize in order, consume all lazy eager
Photo.lazy_eager_titles.each{ |title|
label = Photo.thumbo_labels[title]
while filename = Resizer.get_job(label)
Resizer.resize(filename, label)
end
}
# resize only the first one
Photo.lazy_titles.each{ |title|
label = Photo.thumbo_labels[title]
break if while filename = Resizer.get_job(label)
Resizer.resize(filename, label)
break true # low priority, see you next time
end
}
sleep 0.2 # don't consume all cpu power
}
0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.