::run, tempo, run::

All | General | Java | Web | Software | Fun | Wireless | Idea | Travel
May 17 2007, 06:16:48 PM CST Permalink Comments [17]
techcrunch 看到的 twitter scaling issues..
ROR 的賣點是簡單易上手, 但從 twitter 的經驗來看, 在 scaling 確實有些瓶頸:

"None of these scaling approaches are as fun and easy as developing for Rails. All the convenience methods and syntactical sugar that makes Rails such a pleasure for coders ends up being absolutely punishing, performance-wise."

"Once you hit a certain threshold of traffic, either you need to strip out all the costly neat stuff that Rails does for you (RJS, ActiveRecord, ActiveSupport, etc.) or move the slow parts of your application out of Rails, or both."

另一個建議則是不要使用 ROR, 改用 Mongrel 的 Handler, 可以避掉 threading 的問題, 但也回到了其他部分要自己手動重練的情況..

因為在 web 2.0 創意競賽看到很多學生選擇用 ROR 實作自己的網站, 所以給對 ROR 有興趣的人參考一下..
不是所有網站都會像 twitter 一樣有這麼令人羨慕的成長, 但如果這一天來了, 最好心裡也能有套應對方式..

tag:

Apr 29 2007, 04:23:50 PM CST Permalink Comments [13]


3/17 JUG 翔雲與我的投影片來了~



也可以從這裡下載..

tag:

Mar 21 2007, 11:04:19 AM CST Permalink Comments [18]

最近火速看盤經歷一陣連續的大改版, 主因是 DB 越來越慢了, 解決方式是從 Hibernate 著手, 看看有沒有加強的空間..
速記下幾個最近才知道的事情, 供大家參考:

Statistics & Criteria
要做 tuning, 之前都是看資料庫的 slow queries 來挑, 雖然也是 ok, 但隨著 query 越來越多, 要從 db queries 去反推回是哪個 HQL/Criteria 還滿困難的..
另外也沒有辦法得到物件的存取資訊等, 在做 cache 時的判斷也很麻煩..

直到最近加入 Hibernate Statistics 的管理頁面, 才知道早該做這個功能..
要用 Hibernate Statistics 很簡單, 呼叫 sessionFactory.getStatistics() 就好了..
可以印出 Hibernate Entities, Collections, Queries 的使用次數與各種資訊..
我大概都看看呼叫次數與平均時間, 再依物件特性就可以決定是否需要使用 2nd level caches 或 query caches, 很方便..

不過因為要看 Hibernate Statistics, 也暴露了 Criteria 的一個嚴重缺點, 就是印不出 Criteria 的 query caches, 因為 Criteria 沒有文字的敘述..
Criteria 雖然可以加上 comment, 但也是大工程..
所以, 只好忍痛將所有 Criteria 改為 HQL, 這也就是會花這麼多時間的原因..

若你剛接觸 Hibernate, 建議你就不要考慮 Criteria 了..
雖然還滿高興自己總是能用 Criteria 兜出頗難的 query, 但, 為了未來監控, 還是改用 HQL 吧~~

Caches
雖然 Gavin King 說 Query Cache 沒啥用, 但我覺得怎麼會呢?
看到 Queries 數狂降, 也是心中一股 "早知道, 我就..."

至於 Cache 的選用..
因為我們的資料庫存取不僅是網域內, 也有可能是其他網路上的電腦, 所以使用 JbossCache 相當麻煩..
只好退一步, 選用 EHCache, 但相對的, 僅能 Cache "非常不常更新或不更新的資料"..
但對我的系統幫助也夠大了..

至於 Cache 怎麼設定, 我建議大家做幾個 Test Cases, 實際看看資料有沒有被 cache 起來..
因為實際上跟想的都有點些差距, 需要動手做看看比較清楚..
詳細的設定細節, 或許下次 JUG 再跟大家分享囉~~

Connection Pool
有些 Connection Pool 可能有提供狀態監控 (我是用 c3p0), 就可以順便監控即時的 DB 連線數..
前面提的監控網頁也可以加上這個, 我覺得很實用..
我之前一直滿困惑, 不知道 DB Connection 上限該設多少 (最後決定設 64 或 92)..
透過這個就可以正確的做個決定..

另外, 根據之前做壓力測試的心得, 雖然 c3p0 不是什麼太正式的 Connection Pool, 但是我測試的結果, 只有 c3p0 在 Connection 數到上限時不是直接丟 Exception, 而會有 wait for next available 的機制, 這個很重要..

Many to Many
雖然我知道這不可避免, 但使用 Many to Many, 對資料庫的複雜度都是個提升, 尤其是透過 hibernate 幫你產生 queries, 很可能會不經意產生讓你很吐血的 table join..
若您有使用 Many to Many 的關係, 建議你特別注意一下產生出來的 queries 效能..

Filter
Filter 跟上面一樣, 也是有可能會不按牌理出牌幫你 join, 請特別注意一下產生的 queries..

Transactions
我不知道曾經在哪裡讀到, 加 transaction 不會為系統增加多少負擔..
因為一直對 DB 這類東西沒啥興趣, 所以就照做, 不該加的地方也加了..
最近印出很多數據, 才發現 ... 涉世未深的我被騙了..

若是有大量 Queries, 看看有沒有辦法把 Queries 與 insert/update 做某種程度的分開吧..

tags:

Feb 11 2007, 01:38:04 AM CST Permalink Comments [40]


好像偶爾都有人問起我是怎麼將這麼多照片上傳到 flickr 的..

1 年多之前, 因為找不到合適的 flickr 照片上傳程式 (不是有檔案數限制, 就是需要太多人為操作), 所以自己寫了一個 flickr-sync..
flickr-sync 功能很簡單, 你指定你的照片目錄, 它會根據目錄下的子目錄 (只有第一層子目錄喔), 把子目錄的名字當做 set 名, 再將所有照片上傳, 若遇到已經上傳過的照片 (根據照片名稱判斷), 他就會自動跳過..

也就是說, 這程式會以你電腦上的照片目錄為準, 幫你同步一份到 flickr 去..

若您也有這個需求或是單純有興趣, 可以點這個 link 下載..
使用方式很簡單, 請先確定您有安裝 java (若無, 可以連上這裡下載), 解開下載檔案之後 (假設解開至 c:\flickr-sync-1.0), 請開啟 "命令提示字元" (選 windows 的左下角開始->執行->打入 cmd)..

打入下面指令:
cd c:\flickr-sync-1.0
run -d c:\pic
cd c:\flickr-sync-1.0
run -d c:\pic -o -d
指令的 options 如下:

-d: (dir) 指定照片目錄所在的位置, 如 c:\pic

-o: (order) 若指定, 則會依照目錄名稱排列 set 順序 (倒過來排), 大家可以參考我的 flickr, 我在每個 set 前面都有日期, 加了 -o 這個選項, 就會自動幫我排序..(之所以要這樣, 是因為有些以前的照片是後來才加進去的, 所以需要重新排序)

-r: (remove) 若指定, 則會以電腦上的目錄為準, 若發現電腦上沒有但 flickr 有, 會把 flickr 上的圖刪掉, 使用前請小心喔..

成功後, flickr-sync 會開啟你的預設瀏覽器至 flickr 登入網頁, 登入且允許使用 flickr-sync 的權限後, 再按個 enter 就會開始上傳了..
若您有某個目錄或檔案不想上傳, 可以在目錄或檔案前面加一個 "_" (如 _不上傳, _pic001.png), flickr-sync 就不會將該目錄與照片上傳..
上傳的量會受到 flickr 的每月 2G 限制, 這個月 quota 到了, 就請下個月再跑一次..
我們那 10 幾 G 照片, 就是這樣斷斷續續傳了半年..

最後, 這個程式因為需要開網頁的關係, 所以現在僅支援 windows..
以後有空, 我會再加上 UI 介面, 方便更多人使用囉~~

tags:


Dec 06 2006, 08:00:52 AM CST Permalink Comments [22]
因為在看 hemi, 所以順便跟 ingram 聊到關於網頁速度的問題..
加 cache 是大家立刻會想到的想法..
不過, 對於 hemi 這種全個人化網頁, 有什麼方法可以做比較好的網頁 cache 系統呢?

我想了幾個方式:

1. Reverse Proxy
加 reverse proxy 在前面, 這是最一般的方式了, 但是我猜 cache 的 hit rate 應該很低, 所以是保護住了 server, 但是沒有發揮 cache 的作用..

2. OSCache
OSCache 有提供 cache 部份 jsp 網頁 (用 taglib) 的能力, 可以選擇性 cache 住比較花時間的程式結果, 如資料庫 query..
For example, 針對熱門書籤, 可以先 cache 住從資料庫撈出的熱門書籤, 然後再用另一段的程式去抓每個人的喜好 - 如是否 "推" 過, 兩個結合起來再回給 client..

3. 把個人化的地方抽離出來用 ajax 實作
另一個方式是乾脆把需要個人化資料的地方抽出來..
server 先回傳一般化可以被 cache 住的資料, 如現在的熱門書籤..
client 收到後再根據這些熱門書籤去抓這些是否被 "推" 過, 再補上 "推" 這個按鈕..

不知道是否有其他人有不同的方式呢? :)

tags:

Sep 30 2006, 04:52:02 PM CST Permalink Comments [31]
DSCF5240.JPGqingwilliam 那兒看到 ithome 已經把上次我們跟 google 大師們的對談刊出來了~~

這次 JavaTwo 2006, 最大的收穫就是跟著 jini 去參加這場座談, 畢竟 Joshua 原本只是這麼一個只可遠觀的超級名人, 沒想到能夠跟他們有面對面談話的機會..

大致的談話內容, 可以從 ithome 上與 qing 那裡看到, qing 也提出很多看法..

我個人最感興趣的部份, 是關於 google 運作方式的 "兩個禮拜的 google starter project" 與 "google 每個 team 約 4~5 人, 最多不超過 8 人" 這兩點, 我覺得我們軟體公司都應該可以考慮效法..

另外, 則是 joshua 提到:

我也有我自己很想要加入 Java 的語法與功能, 而我想每個人都有, 大家都會說: "如果 Java 能夠再提供這一個小功能就完美"..
但, 若要我選擇 "每個人心中想要的功能(包括我的) 都一起加進 Java Spec", 與 "所有人的功能(包括我的) 都不加到 Java Spec", 我絕對會選後者..

雖然這樣有點因噎廢食, 但我自己反而覺得是高手無招勝有招的感覺..
與其加入許多功能讓語言本身功能多卻複雜, 不如減少功能讓語言的複雜與出錯的機會降低..

最後最後, 大家要特別謝謝這個座談會的無名英雄-CCCCCJJJJJJJIIIIIIIIIIIIIIIIINNNNNNNNNNN, 拍拍拍..
有她的翻譯我們才不會去了聽聽就當耳邊風囉..;)

tags:

Aug 31 2006, 12:45:23 PM CST Permalink Comments [12]
這是我這次 JavaTwo 2006 所準備的投影片範例程式, 歡迎各位下載..
若有指教, 也請留言或在 JavaWorld上討論討論吧..
(看 JavaWorld 上大家的感想, 這次好像講的還不錯, hehe)

下面是範例程式的安裝, 因為是用 Maven當作 build system, 所以我想很多人都沒有用過, 沒有安裝過 Maven 的人請就照下面的步驟吧..

範例程式安裝


1. 下載範例程式


請至此下載範例程式, 並於您的電腦目錄中展開 (假設展開後目錄為 c://ajaxtm)

2. 下載與安裝 Maven


請至 apache-maven 下載最新版本的 Maven, 並遵照網頁下方的指示, 安裝與設定 Maven.

2. 安裝 DWR-SNAPSHOT 函式庫至 Maven Repository


請在 common line 切換至展開後的目錄, 輸入下列指令:
>cd c:/ajaxtm
>mvn install:install-file -Dfile=lib/dwr.jar -DgroupId=org.directwebremoting
-DartifactId=dwr -Dversion=2.0-SNAPSHOT -Dpackaging=jar

3. 輸出範例 war 檔


請在 command line 輸入下面指令:
>mvn package

建立的 war 檔放在 sub-project 內的 target 目錄.
若您不想要使用 Eclipse, 就不需要繼續下面的步驟, 只要將 war 檔 deploy 到您的 application server 中即可.

4. 下載與安裝 eclipse


請先安裝 eclipse 3.2WTP 1.5.

5. 設定 eclipse 內的 Maven Repository 位置


請在 command line 輸入下面指令:
>mvn -Declipse.workspace=c://ajaxtm eclipse:add-maven-repo

6. 開啟 eclipse


開啟 eclipse, 選擇展開後的目錄為 workspace

7. Import 專案


選擇 Files->Import..->Existing Projects into Workspace, 選取展開後的目錄, 全部一起 Import 進來吧.
到這裡, 你應該就可以使用 Eclipse 與 WTP 直接執行我的範例了..

我不行了, 好想睡, 所以研討會心得明天再上..

tags:

Aug 12 2006, 12:55:34 AM CST Permalink Comments [52]
From JetBrains IntelliJ IDEA Blog,新的 IDEA 6.0 有提供動態 Code Coverage的功能, 也就是說在編程的過程中就可以看到哪些新的程式碼還沒有納到 Unit Test 中, 真神奇~~

tag:

Jul 10 2006, 12:44:24 AM CST Permalink Comments [8]