<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    工作隨筆——2010-07-24

    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)吧。
     

    評論

    # re: 工作隨筆——2010-07-24  回復  更多評論   

    2012-03-02 08:18 by lw.xu
    消息去重的做法一般是有消費者來保證的;因為在有些情況下,客戶端就需要重新發(fā)送的(如通信錯誤導致的);否則消息中間件設計就極為復雜。
    淘寶的Notify是基于JMS的? 框架是Mule。
    主站蜘蛛池模板: 亚洲午夜国产片在线观看| 亚洲国产小视频精品久久久三级| 亚洲成人动漫在线| a级毛片毛片免费观看永久| 国产精品亚洲视频| 免费人人潮人人爽一区二区| 吃奶摸下高潮60分钟免费视频| 精品久久久久亚洲| 国产成人精品高清免费| 精品亚洲成A人在线观看青青| 亚洲AV无码乱码在线观看| 免费人妻精品一区二区三区| 国产一卡二卡≡卡四卡免费乱码| 国产综合激情在线亚洲第一页| 午夜时刻免费入口| 麻豆安全免费网址入口| 国产黄色一级毛片亚洲黄片大全| 中文字幕免费视频精品一| 亚洲an天堂an在线观看| 无码乱肉视频免费大全合集| 亚洲 欧洲 视频 伦小说| 国产精品色午夜视频免费看| 一级毛片aaaaaa视频免费看| 国产亚洲综合色就色| 黄网站色在线视频免费观看| 亚洲精品国产国语| 亚洲av午夜精品一区二区三区| GOGOGO高清免费看韩国| 97se亚洲综合在线| 无码国模国产在线观看免费| 国产高潮久久免费观看| 亚洲色图黄色小说| 特级淫片国产免费高清视频| 国产在线观a免费观看| 亚洲性一级理论片在线观看| 四虎免费久久影院| 东方aⅴ免费观看久久av| 亚洲三级在线免费观看| 亚洲日本中文字幕一区二区三区| 一级毛片免费观看不卡的| 亚洲精品永久在线观看|