Posted on 2010-07-24 20:51
dennis 閱讀(2006)
評論(1) 編輯 收藏 所屬分類:
涂鴉 、
工作隨筆
轉(zhuǎn)眼間快到8月,已經(jīng)過去了兩個季度,是時候稍微總結下干了什么,以后想干什么。從春節(jié)到現(xiàn)在,我仍然是做淘寶的消息中間件Notify的開發(fā),中間額外去做了一個多月的另一個項目的開發(fā),重拾了web開發(fā)的一些東西。
這半年來Notify的改進集中在通訊層的改造,引入AMQP的訂閱模型,以及將重要消息從oracle遷移到mysql做HA方案,這一過程是一個慢慢穩(wěn)定系統(tǒng)的過程。新版本剛出來的時候有不少BUG,有些BUG很嚴重,幸運的是沒有造成嚴重的后果,再一次提醒我小心,小心,再小心;小心是一方面,工作有沒有做到位是另一個方面,暴露出來的問題還是單元測試不全面,以及麻痹大意心態(tài)下的不警惕,對關鍵代碼認識不清,code review也沒有做到位等等。
Notify做到現(xiàn)在,剩下的問題是一些很難解決,又非常關鍵性的問題,如消息的去重,消息的順序性,以及消息的可靠存儲。我說的這些問題都是在分布式集群環(huán)境下需要解決的問題,如果僅僅是單臺服務器,這些問題的解決還算不上特別困難。消息的去重,基本的思路是在客戶端和服務器之間各自維持一個狀態(tài),用于保存當前消息的處理情況,依據(jù)這個情況來做消息的去重,但是狀態(tài)的保存對服務器和客戶端來說都是一個額外的負擔,并且很難做到可靠的存儲,如果狀態(tài)丟了,去重的目的就沒辦法做到。ActiveMQ里是在服務器和客戶端都維持了一個bitmap做重復的檢測,但是這個bitmap大小必然是受限的,并且無法持久保存的。消息的在集群環(huán)境下的順序性,涉及到集群環(huán)境下的事件的時間順序問題,除了使用分布式鎖來保證一致性之外,暫時也沒有好的思路去解決。消息的可靠存儲,今年我們的目標至少是脫離oracle,目前實現(xiàn)的HA mysql雙寫的實現(xiàn)已經(jīng)開始部署到交易這樣的核心系統(tǒng)上,第三個季度將慢慢地全部切換過去。下一步的目標是將消息存儲到key-value系統(tǒng)上,但是需要解決的是索引的問題,因為消息的恢復涉及到查詢,并且需要根據(jù)一些特殊條件做查詢以應付諸如盡快恢復重要消息這樣的功能,因此目前的一些key-value系統(tǒng)要么在索引功能上太弱,要么在集群功能上太弱,要么在大數(shù)據(jù)量存儲上有局限,因此不是特別切合我們的場景,因此一個可行的方案是將消息的header繼續(xù)存儲在關系數(shù)據(jù)庫,方便做查詢,而將數(shù)據(jù)較大的body存儲在key-value上,減輕數(shù)據(jù)庫的負擔。今年,我們還是希望能在以上3個方向某個方向做出突破。
這半年來技術上的收獲,第一個季度業(yè)余時間都去打游戲了,沒方什么心思在學習和工作上,后來去學習了下ASM,總算對java的byte code,以及jvm執(zhí)行byte code過程有了個理解,然后利用ASM去搞了aviator這個項目。接下來開始做服務器的SEDA改造,這個過程完成了部分,但是不滿意,SEDA的模型過于理論化,模型是好的,但是在stage controller的實現(xiàn)上目前沒有可供參考的經(jīng)驗,做到資源的自動控制更需要實際的測試和實踐,基本的指導原則只能作為參考。另外,最近下決心去重構整個項目,從一個一個類看起,看到不爽的地方馬上去做重構,這個過程,我又去重看了下《重構》中的原則,在談論諸如分布式、海量數(shù)據(jù)存儲、云計算這樣的大詞之前,我需要的做的仍然是將代碼寫好,寫的漂亮。也許是時候回到本源,再去重讀下《設計模式》,重讀下《重構》,既然我還在寫java代碼,那還是希望寫的更好點。
另外,我現(xiàn)在喜歡上了clojure語言,并且正兒八經(jīng)地找了本書好好學習,從源碼和bytecode入手去理解它的實現(xiàn)。我為什么喜歡clojure?
首先,它是LISP的方言之一,LISP的優(yōu)點它全有,LISP的缺點它能想辦法避免。Clojure也有宏,也有quote,也有將procedure as data的能力,Clojure的數(shù)據(jù)結構都是immutable,此外還是persistence,避免了immutable數(shù)據(jù)大量拷貝帶來的開銷。Clojure的數(shù)據(jù)結構還天生是lazy的,表達能力上一個臺階。Clojure在語法上更多變化,某些程度上降低了括號的使用頻率,這一點有利有弊。Clojure的內(nèi)在原則是一致的,核心語法非常簡單,它沒有多種范式可供選擇,因此沒有scala那樣復雜的類型系統(tǒng),沒有為了包容java程序員引入的OO模型(有替代品),使用clojure最好的方式是函數(shù)式地,但是它的擴展能力允許你去嘗試各種范式。
其次,Clojure對并發(fā)的支持更符合一般程序員的理解,它只是將鎖替換成了事務,利用STM去保存可變狀態(tài),但是卻避免鎖帶來的缺點——死鎖、活鎖、競爭條件。它沒有引入新的模型,這對習慣于用鎖編程的同學來說,STM沒有很大差異,你可以將它理解成內(nèi)存型數(shù)據(jù)庫。
第三,最重要的一點,Clojure是實現(xiàn)于JVM之上的,Java上的任何東西它都能直接利用,并且利用type hint之類的手段可以做到性能上沒有損失。盡管Java語言有千般不是,但是寄生于整個平臺之上的開源生態(tài)系統(tǒng)是任何其他社區(qū)都很難比擬的,放棄Java平臺這個寶庫,暫時還做不到。過去學習scheme,學習common lisp,更多的目的是開闊眼界,現(xiàn)在能實際地使用,還能有比這更幸福的事情嗎?
下半年技術上想學習什么呢?除了clojure之外,我想去看下haskell,了解下什么是mond,除此之外,就是收收心將《算法導論》讀完吧。另外,收起對awk和shell編程的偏見,好好熟悉下這兩個工具,dirty and quickly的干活有時候還是很重要的。
我還是個典型的碼農(nóng),喜歡寫代碼,喜歡嘗試新東西,至少熱情和好奇心還殘存一些,那么就繼續(xù)當好碼農(nóng)吧。