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