最近由於空閒時間有一些,因此去看了很多開源項目,大部分東西若是看過不記錄下來,其實仍是至關於沒看,因此想一想仍是有必要摘要記錄一下。html
首先是去了解了zookeeper這個項目,基於paxos算法的分佈式服務組件,同事對此有很是深刻的研究和介紹,具體能夠看咱們的團隊Blog。令我感慨的是這麼一個很是難以理解的算法,卻用一個簡單的樹狀目錄模型表達出來,而且在這個模型的基礎上衍生出種種應用:集羣感知、分佈式鎖、分佈式隊列、分佈式併發原語等等,具體能夠看文檔給出的recipes。在實現這些應用的時候,突出強調的是避免網絡風暴,例如分佈式鎖的實現,競爭建立子節點,節點序列號最小的獲取鎖,其餘節點等待,可是等待在什麼條件上是有講究的,若是全部節點都等待最小節點的刪除事件,那麼當最小節點釋放鎖的時候,就須要廣播消息給全部其餘等待的節點;換一個思路,若是每一個等待節點只是等待比它序列號小的節點上,那麼就能夠避免這種廣播風暴,變成一個順序喚醒的過程。所以儘管有了zookeeper幫助實現分佈式這些服務,可是要實現好仍然有必定難度,具體能夠參考官方例子。我原本萌生了基於zookeeper實現一套封裝好的相似j.u.c的服務框架,後來在郵件列表發現已經有人搞了這麼一個基礎類庫放在github上:https://github.com/openUtility/menagerie。不過我沒有繼續深刻了,有興趣的朋友能夠瞧瞧。java
而後又去看了咱們淘寶開源的TimeTunnel。TimeTunnel你能夠理解成一個消息中間件,它整個設計跟咱們的產品至關接近,可是二者的目的徹底不一樣,tt強調的是高吞吐量,而notify強調的則是可靠性。TT的通信層直接採用Facebook的thrift,而且利用zookeeper作集羣管理和路由。TT的代碼質量很好,有興趣能夠拉出來看一下,而且對zookeeper的應用也是一個典型的案例。TT在高可用性上的方案也頗有特點,全部的服務器節點造成一個環,兩兩相互主輔備份,一個節點掛了,後續節點仍然能夠提供服務直到主節點回來,有點相似一致性哈希的概念。節點的主從關係和順序也是經過zookeeper保證。消息順序的實現是經過稱爲router的路由到固定節點作傳輸,router默認是策略不是固定而是RR。TT的數據存儲優先放在內存,並設置了一個內存情況監視的組件,當發現內存放不下的時候,swap到磁盤文件緩存,實現相似內存換頁的功能。正常狀況數據都應該在內存,固然若是可靠級別要求高的話能夠先存磁盤再傳輸。TT目前仍然仍是比較適合傳輸日誌這樣的文本增量數據,而且提供了TailFile這樣的python腳本幫你作這個事情,這個腳本能夠經過checkpoint作斷點續傳。在學習這個項目的時候,發現文檔有很大問題,要麼錯誤,要麼遺漏,而且代碼也不是最新的,我估計開源出來外面的人用的還不太多,但願慢慢能搞的更好一些。python
跟TT相似,另外一個追求高吞吐量的MQ是linkedin開源的kafka。Kafka就跟這個名字同樣,設計很是獨特。首先,kafka的開發者們認爲不須要在內存裏緩存什麼數據,操做系統的文件緩存已經足夠完善和強大,只要你不搞隨機寫,順序讀寫的性能是很是高效的。kafka的數據只會順序append,數據的刪除策略是累積到必定程度或者超過必定時間再刪除。Kafka另外一個獨特的地方是將消費者信息保存在客戶端而不是MQ服務器,這樣服務器就不用記錄消息的投遞過程,每一個客戶端都本身知道本身下一次應該從什麼地方什麼位置讀取消息,消息的投遞過程也是採用客戶端主動pull的模型,這樣大大減輕了服務器的負擔。Kafka還強調減小數據的序列化和拷貝開銷,它會將一些消息組織成MessageSet作批量存儲和發送,而且客戶端在pull數據的時候,儘可能以zero-copy的方式傳輸,利用sendfile(對應java裏的FileChannel.transferTo/transferFrom)這樣的高級IO函數來減小拷貝開銷。可見,kafka是一個精心設計,特定於某些應用的MQ系統,這種偏向特定領域的MQ系統我估計會愈來愈多,垂直化的產品策略值的考慮。git
在此期間,我還從新去看了activemq和hornetq的存儲實現,從實現上你們都大同小異,appendlog+datafile的模式。Activemq採用異步隊列寫來提升吞吐量,而Hornetq乾脆就直接利用JNI調用原生aio來實現高性能。在搜索Java的aio實現的時候,碰巧發現Mina的沙箱裏有個aioj的實現,源碼在:https://svn.apache.org/repos/asf/mina/sandbox/mheath/aioj/。我測試了徹底可用,也嘗試改造咱們的磁盤存儲組件,惋惜提高很少,估計不從整個設計上調整服務器,不大可能從aio上獲益。github
最近也從新看起了clojure的一些開源項目,clojure的開源資源在github上也很是豐富,有待挖掘,下次有機會再嘗試介紹一二。算法